Java.awt. *;
Java.io. *;
Java.net 을 가져옵니다. *;
공용 클래스 TicTacToeclient 확장 애플릿 Runnable 구현
{//클래스1
텍스트 필드 id;
패널 보드 패널, 패널 2
사각형 [] [], currentsquare
콘센트 연결
DataInputStream 입력;
데이터 출력 스트림 출력;
스레드 출력 스레드
Char mymark
텍스트 영역 표시
공용 void init ()
{
Setlayout (new borderlayout ());
Display = newtextarea (4,30);
Display.seteditable (false);
추가 ("남쪽", 표시);
보드 패널 = 새 패널 ();
Boardpanel.setbackground (color.cyan);
Boardpanel.setlayout (new gridlayout (3, 3, 0, 0));
판 = 새 상자 [3] [3];
For (introw = 0; 로우< 보드 길이; Row++)
For (intcol = 0; Col< 판자 [행]. 길이; Col++)
{
Board[row][col]= 새 상자 ();
Repaint ();
Boardpanel.add (board [row] [col]);
}
Id = newtextfield ();
Id.seteditable (false);
추가 (북쪽, id);
Panel2 = newpanel ();
Panel 2.add (보드 패널);
Add ("중심", 패널 2);
}
///////////종료
공용 void 시작 ()
{
시도 {
Connection = new 소켓 (inetaddress.getlocalhost (), 5000);
Input = newdata inputstream (connection.getinputstream ());
Output = newdata output stream (connection.getoutputstream ());
}
Catch(IOException e){) {
//e. printstacktrace ();
}
OutputThread = 새 스레드 (this);
Outputthread.start ();
}
///////////종료
공용 부울 mouseUP (이벤트 e, int x, int y)
{
For (introw = 0; 로우< 보드 길이; Row++)
{
For (intcol = 0; Col< 판자 [행]. 길이; Col++)
시도 {
If (예: target==board[row][col])
{
Current square = board [row] [col];
Output.writeint (row * 3+col);
}
}
Catch(IOException ie){
//ie.printstacktrace ();
}
}
True 를 반환합니다
}
///////////종료
공용 유효하지 않은 실행 ()
{
시도 {
Mymark = input.readchar ();
Id.setText ("재생 시작 \" "+내 마크+"\ ");
}
Catch(IOException e){) {
E. printstacktrace ();
}
While (참)
{
시도 {
Strings = input.readutf ();
ProcessMessage
}
Catch(IOException e){) {
//e. printstacktrace ();
}
}
}
///////////종료
공용 void processMessage (문자열 s)
{
If(s 같음 ("효과적인 이동"))
{
Display.appendText ("유효한 이동, 잠시만 기다려 주십시오. \ n");
Currentsquare.setmark (mymark);
Currentsquare.repaint ();
}
Else if(s.equals ("잘못된 이동, 재시도"))
{
Display.appendtext (s+"\ n");
}
Else if(s.equals ("상대 이동"))
{
시도 {
Intloc = input.readint ();
완료:
For (introw = 0; 로우< 보드 길이; Row++)
For (intcol = 0; Col< 판자 [행]. 길이; Col++)
If(row*3+col==loc)
{
판 [행] [열]. SetMark(mymark=='x'? O':' x');
판 [행] [열]. Repaint ();
휴식 완료
}
Display.appendText ("수동입니다. 네 차례 야 \ n ");
}
Catch(IOException e){) {
E. printstacktrace ();
}
}
기타
{
Display.appendtext (s+"\ n");
}
}
}//class 1.end
//////////////////////////////
클래스 사각형 확장 캔버스
{//class2
문자 표시
공공광장 ()
{
크기 조정 (30,30);
}
///////////종료
공용 null 설정 태그 (char c)
{
마크 = c;
}
///////////종료
공용 빈 페인트 (그래픽 g)
{
G. drawrect (0,0,29,29);
G. drawstring (string.valueof (mark), 1 1, 20);
}
}//class2.end
///& lt;; Applet code = "tictactoeclient.class" width = 275 height = 300 > & lt/애플릿 >
서버측:
Java.awt. *;
Java.net 을 가져옵니다. *;
Java.io. *;
공용 클래스 TicTacToeServer 확장 프레임워크
{//클래스1
개인 바이트 보드 [];
개인 부울 x 이동
개인 TextArea 출력;
개인 게이머 [];
전용 서버 소켓 서버
Private int numberofplayers
개인 int currentplayer
공용 TicTacToeServer ()
{
슈퍼 ("3 개의 하위 체스 서버");
Board = 새 바이트 [9];
XMove = true
플레이어 = 신규 플레이어 [2];
Currentplayer = 0;
시도 {
Server=new ServerSocket(5000 (5000,2);
}
Catch(IOException e){) {
//e. printstackrace ();
System.exit (1);
}
Output = newtextarea ();
Output.setbackground (color.yellow);
Add (중심, 출력);
크기 조정 (300,300);
쇼 ();
도구 키트 TP = 도구 키트.getdefaulttoolkit ();
Imagelogo = tp.getimage ("1.gif");
섹션 이미지 (로고);
SetResizable(false););
}
///////////종료
Public void execute ()
{
For(int I = 0;; 나< 선수. 길이 I++)
{
시도 {
Players[I]= 새 플레이어 (server.accept (), this, I);
플레이어 [나]. 시작 ();
++number of players;
}
Catch(IOException e){) {
//e. printstackrace ();
System.exit (1);
}
}
}
///////////종료
Public int getNumberOfplayers ()
{
Numberofplayers 를 반환합니다
}
///////////종료
공용 null 표시 (문자열 s)
{
Output.appendtext (s+"\ n");
}
//////////끝
공용 부울 validMove(int loc, int player)
{
부울 moveDone = false
그리고 (플레이어! = 현재 플레이어)
{
시도 {
Wait ();
}
Catch (interrupted exception e) {//not
}
}
If (등가 (loc))
{
Board [loc] = (byte) (현재 플레이어 = = 0? X':' o');
Currentplayer =++currentplayer% 2;
플레이어 [현재 플레이어]. 기타 player moved (loc);
Notify ();
True 를 반환합니다
}
기타
False 를 반환합니다
}
///////////종료
공용 부울 등적 (int loc)
{
If (board [loc] = =' x' | | board [loc] = =' o')
True 를 반환합니다
기타
False 를 반환합니다
}
///////////종료
공용 부울 handleEvent (이벤트 이벤트)
{
If (이벤트.id = = 이벤트). 창 _ 제거)
{
Hide ();
Dispose ();
For(int I = 0;; 나< 선수. 길이 I++)
플레이어 [나]. Stop ();
System.exit (0);
}
Super.handleEvent (이벤트) 를 반환합니다.
}
///////////종료
공용 부울 gameOver ()
{
False 를 반환합니다
}
///////////종료
공용 정적 void main(String args[])
{
Tictacto eserver game = new TIC tacto eserver ();
Game.execute ();
}
}//class 1.end
//////////////////////////////////
클래스 플레이어 확장 스레드
{//class2
콘센트 연결
DataInputStream 입력;
데이터 출력 스트림 출력;
TicTacToeServer 컨트롤;
Int 수;
문자 표시
공용 플레이어 (소켓 s, TicTacToeServer t, int num)
{
마크 = (num = = 0? X':' o');
Connection = s;;
시도 {
Input = newdata inputstream (connection.getinputstream ());
Output = newdata output stream (connection.getoutputstream ());
}
Catch(IOException e){) {
//e. printstacktrale ();
System.exit (1);
}
컨트롤 = t;;
Number = num
}
///////////종료
Public void other player moved (intloc)
{
시도 {
Output.writeutf ("oppo net moved");
Output.writeint (loc);
}
Catch(IOException e){//not
}
}
///////////종료
공용 유효하지 않은 실행 ()
{
부울 done = false
시도 {
Control.display ("player"+(number = = 0? X': 'o')+ "로그인!" );
Output.writechar (마크);
Output.writeutf ("player"+(number = = 0? "엑스 착륙! \n": "o 로그인하려면 잠시 기다려 주십시오! \ n ")););
If (control.getnumberofplayers () < 2) 을 참조하십시오
{
Output.writeUTF ("다른 플레이어가 로그인할 때까지 기다려 주세요!" " );
While (control.getnumberofplayers () < 2);
Output.writeUTF ("다른 플레이어가 로그인했습니다! 이제 체스를 할 수 있습니다! );
}
그리고 (! 완료)
{
Intlocation = input.readint ();
If (컨트롤. validmove (위치, 번호))
{
Control.display ("loc"+location);
Output.writeUTF("Valic move. "" );
}
기타
Output.writeUTF ("잘못된 이동, 재시도");
If (컨트롤. gameover ())
{
Done = true
}
Connection.close ();
}
}
Catch(IOException e){) {
E. printstacktrace ();
System.exit (1);
}
}
}//class.end