五子棋网络游戏
2024-07-17 23:49:27作者:饭克斯
下面的源代码分为4个文件;
chessClient.java:客户端主程序。
chessInterface.java:客户端的界面。
chessPad.java:棋盘的绘制。
chessServer.java:服务器端。
可同时容纳50个人同时在线下棋,聊天。
没有加上详细注释,不过绝对可以运行,j2sdk1.4下通过。
/*********************************************************************************************
1.chessClient.java
**********************************************************************************************/
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.net.*;
importjava.util.*;
classclientThreadextendsThread
{
chessClientchessclient;
clientThread(chessClientchessclient)
{
this.chessclient=chessclient;
}
publicvoidacceptMessage(StringrecMessage)
{
if(recMessage.startsWith(/userlist))
{
StringTokenizeruserToken=newStringTokenizer(recMessage,);
intuserNumber=0;
chessclient.userpad.userList.removeAll();
chessclient.inputpad.userChoice.removeAll();
chessclient.inputpad.userChoice.addItem(所有人);
while(userToken.hasMoreTokens())
{
Stringuser=(String)userToken.nextToken();
if(userNumber>0&&!user.startsWith([inchess]))
{
chessclient.userpad.userList.add(user);
chessclient.inputpad.userChoice.addItem(user);
}
userNumber++;
}
chessclient.inputpad.userChoice.select(所有人);
}
elseif(recMessage.startsWith(/yourname))
{
chessclient.chessClientName=recMessage.substring(10);
chessclient.setTitle(Java五子棋客户端+用户名:+chessclient.chessClientName);
}
elseif(recMessage.equals(/reject))
{
try
{
chessclient.chesspad.statusText.setText(不能加入游戏);
chessclient.controlpad.cancelGameButton.setEnabled(false);
chessclient.controlpad.joinGameButton.setEnabled(true);
chessclient.controlpad.creatGameButton.setEnabled(true);
}
catch(Exceptionef)
{
chessclient.chatpad.chatLineArea.setText(chessclient.chesspad.chessSocket.close无法关闭);
}
chessclient.controlpad.joinGameButton.setEnabled(true);
}
elseif(recMessage.startsWith(/peer))
{
chessclient.chesspad.chessPeerName=recMessage.substring(6);
if(chessclient.isServer)
{
chessclient.chesspad.chessColor=1;
chessclient.chesspad.isMouseEnabled=true;
chessclient.chesspad.statusText.setText(请黑棋下子);
}
elseif(chessclient.isClient)
{
chessclient.chesspad.chessColor=-1;
chessclient.chesspad.statusText.setText(已加入游戏,等待对方下子...);
}
}
elseif(recMessage.equals(/youwin))
{
chessclient.isOnChess=false;
chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor);
chessclient.chesspad.statusText.setText(对方退出,请点放弃游戏退出连接);
chessclient.chesspad.isMouseEnabled=false;
}
elseif(recMessage.equals(/OK))
{
chessclient.chesspad.statusText.setText(创建游戏成功,等待别人加入...);
}
elseif(recMessage.equals(/error))
{
chessclient.chatpad.chatLineArea.append(传输错误:请退出程序,重新加入\n);
}
else
{
chessclient.chatpad.chatLineArea.append(recMessage+\n);
chessclient.chatpad.chatLineArea.setCaretPosition(
chessclient.chatpad.chatLineArea.getText().length());
}
}
publicvoidrun()
{
Stringmessage=;
try
{
while(true)
{
message=chessclient.in.readUTF();
acceptMessage(message);
}
}
catch(IOExceptiones)
{
}
}
}
publicclasschessClientextendsFrameimplementsActionListener,KeyListener
{
userPaduserpad=newuserPad();
chatPadchatpad=newchatPad();
controlPadcontrolpad=newcontrolPad();
chessPadchesspad=newchessPad();
inputPadinputpad=newinputPad();
SocketchatSocket;
DataInputStreamin;
DataOutputStreamout;
StringchessClientName=null;
Stringhost=null;
intport=4331;
booleanisOnChat=false;//在聊天?
booleanisOnChess=false;//在下棋?
booleanisGameConnected=false;//下棋的客户端连接?
booleanisServer=false;//如果是下棋的主机
booleanisClient=false;//如果是下棋的客户端
PanelsouthPanel=newPanel();
PanelnorthPanel=newPanel();
PanelcenterPanel=newPanel();
PanelwestPanel=newPanel();
PaneleastPanel=newPanel();
chessClient()
{
super(Java五子棋客户端);
setLayout(newBorderLayout());
host=controlpad.inputIP.getText();
westPanel.setLayout(newBorderLayout());
westPanel.add(userpad,BorderLayout.NORTH);
westPanel.add(chatpad,BorderLayout.CENTER);
westPanel.setBackground(Color.pink);
inputpad.inputWords.addKeyListener(this);
chesspad.host=controlpad.inputIP.getText();
centerPanel.add(chesspad,BorderLayout.CENTER);
centerPanel.add(inputpad,BorderLayout.SOUTH);
centerPanel.setBackground(Color.pink);
controlpad.connectButton.addActionListener(this);
controlpad.creatGameButton.addActionListener(this);
controlpad.joinGameButton.addActionListener(this);
controlpad.cancelGameButton.addActionListener(this);
controlpad.exitGameButton.addActionListener(this);
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(false);
southPanel.add(controlpad,BorderLayout.CENTER);
southPanel.setBackground(Color.pink);
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exceptioned)
{
}
}
if(isOnChess||isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exceptionee)
{
}
}
System.exit(0);
}
publicvoidwindowActivated(WindowEventea)
{
}
});
add(westPanel,BorderLayout.WEST);
add(centerPanel,BorderLayout.CENTER);
add(southPanel,BorderLayout.SOUTH);
pack();
setSize(670,548);
setVisible(true);
setResizable(false);
validate();
}
publicbooleanconnectServer(StringserverIP,intserverPort)throwsException
{
try
{
chatSocket=newSocket(serverIP,serverPort);
in=newDataInputStream(chatSocket.getInputStream());
out=newDataOutputStream(chatSocket.getOutputStream());
clientThreadclientthread=newclientThread(this);
clientthread.start();
isOnChat=true;
returntrue;
}
catch(IOExceptionex)
{
chatpad.chatLineArea.setText(chessClient:connectServer:无法连接,建议重新启动程序\n);
}
returnfalse;
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==controlpad.connectButton)
{
host=chesspad.host=controlpad.inputIP.getText();
try
{
if(connectServer(host,port))
{
chatpad.chatLineArea.setText();
controlpad.connectButton.setEnabled(false);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
chesspad.statusText.setText(连接成功,请创建游戏或加入游戏);
}
}
catch(Exceptionei)
{
chatpad.chatLineArea.setText(controlpad.connectButton:无法连接,建议重新启动程序\n);
}
}
if(e.getSource()==controlpad.exitGameButton)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exceptioned)
{
}
}
if(isOnChess||isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exceptionee)
{
}
}
System.exit(0);
}
if(e.getSource()==controlpad.joinGameButton)
{
StringselectedUser=userpad.userList.getSelectedItem();
if(selectedUser==null||selectedUser.startsWith([inchess])||
selectedUser.equals(chessClientName))
{
chesspad.statusText.setText(必须先选定一个有效用户);
}
else
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isOnChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage(/joingame+userpad.userList.getSelectedItem()++chessClientName);
}
}
else
{
isOnChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage(/joingame+userpad.userList.getSelectedItem()++chessClientName);
}
}
catch(Exceptionee)
{
isGameConnected=false;
isOnChess=false;
isClient=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chatpad.chatLineArea.setText(chesspad.connectServer无法连接\n+ee);
}
}
}
if(e.getSource()==controlpad.creatGameButton)
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isOnChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage(/creatgame+[inchess]+chessClientName);
}
}
else
{
isOnChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage(/creatgame+[inchess]+chessClientName);
}
}
catch(Exceptionec)
{
isGameConnected=false;
isOnChess=false;
isServer=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
ec.printStackTrace();
chatpad.chatLineArea.setText(chesspad.connectServer无法连接\n+ec);
}
}
if(e.getSource()==controlpad.cancelGameButton)
{
if(isOnChess)
{
chesspad.chessthread.sendMessage(/giveup+chessClientName);
chesspad.chessVictory(-1*chesspad.chessColor);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText(请建立游戏或者加入游戏);
}
if(!isOnChess)
{
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText(请建立游戏或者加入游戏);
}
isClient=isServer=false;
}
}
publicvoidkeyPressed(KeyEvente)
{
TextFieldinputWords=(TextField)e.getSource();
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
if(inputpad.userChoice.getSelectedItem().equals(所有人))
{
try
{
out.writeUTF(inputWords.getText());
inputWords.setText();
}
catch(Exceptionea)
{
chatpad.chatLineArea.setText(chessClient:KeyPressed无法连接,建议重新连接\n);
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText();
controlpad.connectButton.setEnabled(true);
}
}
else
{
try
{
out.writeUTF(/+inputpad.userChoice.getSelectedItem()++inputWords.getText());
inputWords.setText();
}
catch(Exceptionea)
{
chatpad.chatLineArea.setText(chessClient:KeyPressed无法连接,建议重新连接\n);
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText();
controlpad.connectButton.setEnabled(true);
}
}
}
}
publicvoidkeyTyped(KeyEvente)
{
}
publicvoidkeyReleased(KeyEvente)
{
}
publicstaticvoidmain(Stringargs[])
{
chessClientchessClient=newchessClient();
}
}
/******************************************************************************************
下面是:chessInteface.java
******************************************************************************************/
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.net.*;
classuserPadextendsPanel
{
ListuserList=newList(10);
userPad()
{
setLayout(newBorderLayout());
for(inti=0;i<50;i++)
{
userList.add(i+.+没有用户);
}
add(userList,BorderLayout.CENTER);
}
}
classchatPadextendsPanel
{
TextAreachatLineArea=newTextArea(,18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);
chatPad()
{
setLayout(newBorderLayout());
add(chatLineArea,BorderLayout.CENTER);
}
}
classcontrolPadextendsPanel
{
LabelIPlabel=newLabel(IP,Label.LEFT);
TextFieldinputIP=newTextField(localhost,10);
ButtonconnectButton=newButton(连接主机);
ButtoncreatGameButton=newButton(建立游戏);
ButtonjoinGameButton=newButton(加入游戏);
ButtoncancelGameButton=newButton(放弃游戏);
ButtonexitGameButton=newButton(关闭程序);
controlPad()
{
setLayout(newFlowLayout(FlowLayout.LEFT));
setBackground(Color.pink);
add(IPlabel);
add(inputIP);
add(connectButton);
add(creatGameButton);
add(joinGameButton);
add(cancelGameButton);
add(exitGameButton);
}
}
classinputPadextendsPanel
{
TextFieldinputWords=newTextField(,40);
ChoiceuserChoice=newChoice();
inputPad()
{
setLayout(newFlowLayout(FlowLayout.LEFT));
for(inti=0;i<50;i++)
{
userChoice.addItem(i+.+没有用户);
}
userChoice.setSize(60,24);
add(userChoice);
add(inputWords);
}
}
/**********************************************************************************************
下面是:chessPad.java
**********************************************************************************************/
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.net.*;
importjava.util.*;
classchessThreadextendsThread
{
chessPadchesspad;
chessThread(chessPadchesspad)
{
this.chesspad=chesspad;
}
publicvoidsendMessage(StringsndMessage)
{
try
{
chesspad.outData.writeUTF(sndMessage);
}
catch(Exceptionea)
{
System.out.println(chessThread.sendMessage:+ea);
}
}
publicvoidacceptMessage(StringrecMessage)
{
if(recMessage.startsWith(/chess))
{
StringTokenizeruserToken=newStringTokenizer(recMessage,);
StringchessToken;
String[]chessOpt={-1,-1,0};
intchessOptNum=0;
while(userToken.hasMoreTokens())
{
chessToken=(String)userToken.nextToken();
if(chessOptNum>=1&&chessOptNum<=3)
{
chessOpt[chessOptNum-1]=chessToken;
}
chessOptNum++;
}
chesspad.netChessPaint(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Integer.parseInt(chessOpt[2]));
}
elseif(recMessage.startsWith(/yourname))
{
chesspad.chessSelfName=recMessage.substring(10);
}
elseif(recMessage.equals(/error))
{
chesspad.statusText.setText(错误:没有这个用户,请退出程序,重新加入);
}
else
{
//System.out.println(recMessage);
}
}
publicvoidrun()
{
Stringmessage=;
try
{
while(true)
{
message=chesspad.inData.readUTF();
acceptMessage(message);
}
}
catch(IOExceptiones)
{
}
}
}
classchessPadextendsPanelimplementsMouseListener,ActionListener
{
intchessPoint_x=-1,chessPoint_y=-1,chessColor=1;
intchessBlack_x[]=newint[200];
intchessBlack_y[]=newint[200];
intchessWhite_x[]=newint[200];
intchessWhite_y[]=newint[200];
intchessBlackCount=0,chessWhiteCount=0;
intchessBlackWin=0,chessWhiteWin=0;
booleanisMouseEnabled=false,isWin=false,isInGame=false;
TextFieldstatusText=newTextField(请先连接服务器);
SocketchessSocket;
DataInputStreaminData;
DataOutputStreamoutData;
StringchessSelfName=null;
StringchessPeerName=null;
Stringhost=null;
intport=4331;
chessThreadchessthread=newchessThread(this);
chessPad()
{
setSize(440,440);
setLayout(null);
setBackground(Color.pink);
addMouseListener(this);
add(statusText);
statusText.setBounds(40,5,360,24);
statusText.setEditable(false);
}
publicbooleanconnectServer(StringServerIP,intServerPort)throwsException
{
try
{
chessSocket=newSocket(ServerIP,ServerPort);
inData=newDataInputStream(chessSocket.getInputStream());
outData=newDataOutputStream(chessSocket.getOutputStream());
chessthread.start();
returntrue;
}
catch(IOExceptionex)
{
statusText.setText(chessPad:connectServer:无法连接\n);
}
returnfalse;
}
publicvoidchessVictory(intchessColorWin)
{
this.removeAll();
for(inti=0;i<=chessBlackCount;i++)
{
chessBlack_x[i]=0;
chessBlack_y[i]=0;
}
for(inti=0;i<=chessWhiteCount;i++)
{
chessWhite_x[i]=0;
chessWhite_y[i]=0;
}
chessBlackCount=0;
chessWhiteCount=0;
add(statusText);
statusText.setBounds(40,5,360,24);
if(chessColorWin==1)
{chessBlackWin++;
statusText.setText(黑棋胜,黑:白为+chessBlackWin+:+chessWhiteWin+,重新开局,等待白棋下子...);
}
elseif(chessColorWin==-1)
{
chessWhiteWin++;
statusText.setText(白棋胜,黑:白为+chessBlackWin+:+chessWhiteWin+,重新开局,等待黑棋下子...);
}
}
publicvoidgetLocation(inta,intb,intcolor)
{
if(color==1)
{
chessBlack_x[chessBlackCount]=a*20;
chessBlack_y[chessBlackCount]=b*20;
chessBlackCount++;
}
elseif(color==-1)
{
chessWhite_x[chessWhiteCount]=a*20;
chessWhite_y[chessWhiteCount]=b*20;
chessWhiteCount++;
}
}
publicbooleancheckWin(inta,intb,intcheckColor)
{
intstep=1,chessLink=1,chessLinkTest=1,chessCompare=0;
if(checkColor==1)
{
chessLink=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare])&&((b*20)==chessBlack_y[chessCompare]))
{
chessLink=chessLink+1;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare])&&(b*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if((a*20==chessBlack_x[chessCompare])&&((b+step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;