java五子棋游戏代码Word下载.docx
- 文档编号:21163741
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:49
- 大小:29.22KB
java五子棋游戏代码Word下载.docx
《java五子棋游戏代码Word下载.docx》由会员分享,可在线阅读,更多相关《java五子棋游戏代码Word下载.docx(49页珍藏版)》请在冰豆网上搜索。
boardPanel.setSize(210,210);
statusPanel.setLayout(newBorderLayout());
statusPanel.setSize(210,50);
boardPanel.add(messageBoard);
statusPanel.add(statusLabel,BorderLayout.WEST);
add(boardPanel,BorderLayout.CENTER);
add(statusPanel,BorderLayout.NORTH);
}
}
*服务器线程,主要用于服务器与客户端的通信
classServerThreadextendsThread{
SocketclientSocket;
HashtableclientDataHash;
//Socket与发送数据的流的映射
HashtableclientNameHash;
//Socket与用户名的映射
HashtablechessPeerHash;
//对弈的两个客户端用户名的映射
MessageServerPanelserver;
booleanisClientClosed=false;
/**
*服务器端线程的构造函数,用于初始化一些对象。
ServerThread(SocketclientSocket,HashtableclientDataHash,HashtableclientNameHash,HashtablechessPeerHash,
MessageServerPanelserver){
this.clientSocket=clientSocket;
this.clientDataHash=clientDataHash;
this.clientNameHash=clientNameHash;
this.chessPeerHash=chessPeerHash;
this.server=server;
*对客户端发来的消息处理的函数,处理后转发回客户端。
处理消息的过程比较复杂,要针对很多种情况分别处理。
publicvoidmessageTransfer(Stringmessage){
StringclientName,peerName;
/////////////命令处理///////////////////////////////
//如果消息以“/”开头,表明是命令消息。
if(message.startsWith("
/"
)){
//如果消息以“/list”开头,则将其回馈到客户端以更新用户列表
if(message.equals("
/list"
Feedback(getUserList());
//如果消息以"
/creatgame[inchess]"
开头,则修改clientNameHash映射
//和chessPeerHash映射。
elseif(message.startsWith("
//
StringchessServerName=message.substring(20);
synchronized(clientNameHash){
clientNameHash.put(clientSocket,message.substring(11));
synchronized(chessPeerHash){//刚创建,等待其他人加入
chessPeerHash.put(chessServerName,"
wait"
);
Feedback("
/yourname"
+clientNameHash.get(clientSocket));
chessPeerTalk(chessServerName,"
/OK"
publicTalk(getUserList());
//如果消息以“/joingame”开头,则将消息的服务端名字和本地用户名提取出来,
//然后修改clientNameHash表和chessPeerHash表。
/joingame"
StringTokenizeruserToken=newStringTokenizer(message,"
"
StringgetUserToken,serverName,selfName;
String[]chessNameOpt={"
0"
"
};
intgetOptNum=0;
//提取服务端用户名和本地用户名
while(userToken.hasMoreTokens()){
getUserToken=(String)userToken.nextToken("
if(getOptNum>
=1&
&
getOptNum<
=2){
chessNameOpt[getOptNum-1]=getUserToken;
getOptNum++;
serverName=chessNameOpt[0];
selfName=chessNameOpt[1];
//如果有服务端在等待开始棋局
if(chessPeerHash.containsKey(serverName)&
chessPeerHash.get(serverName).equals("
//修改Socket和名字映射
clientNameHash.put(clientSocket,("
[inchess]"
+selfName));
//修改chessPeerHash映射
synchronized(chessPeerHash){
chessPeerHash.put(serverName,selfName);
chessPeerTalk(selfName,("
/peer"
+"
+serverName));
chessPeerTalk(serverName,("
}else{
chessPeerTalk(selfName,"
/reject"
try{
clientClose();
}catch(Exceptionez){
//如果消息以“/[inchess]”开头,则获取要发送消息的用户名和发送的消息
//然后发送出去。
/[inchess]"
intfirstLocation=0,lastLocation;
lastLocation=message.indexOf("
0);
peerName=message.substring((firstLocation+1),lastLocation);
message=message.substring((lastLocation+1));
if(chessPeerTalk(peerName,message)){
/error"
//如果消息以“/giveup”开头,则判断是对弈双方哪方放弃了。
/giveup"
StringchessClientName=message.substring(8);
if(chessPeerHash.containsKey(chessClientName)
&
!
((String)chessPeerHash.get(chessClientName)).equals("
//如果服务方放弃,则发送消息“/youwin”表明对方获胜
chessPeerTalk((String)chessPeerHash.get(chessClientName),"
/youwin"
//剔除这对对弈的人。
。
chessPeerHash.remove(chessClientName);
if(chessPeerHash.containsValue(chessClientName)){
//如果客户方放弃,也发送消息“/youwin”表明对方获胜
chessPeerTalk((String)getHashKey(chessPeerHash,chessClientName),"
chessPeerHash.remove((String)getHashKey(chessPeerHash,chessClientName));
//如果找不到发送消息的用户,则输出消息说“没有这个用户”
else{
if(lastLocation==-1){
无效命令"
return;
message=(String)clientNameHash.get(clientSocket)+"
>
+message;
if(peerTalk(peerName,message)){
没有这个用户:
+peerName+"
\n"
////////////////////////////////////////////////
//如果不以“/”开头,表明是普通消息,直接发送
message=clientNameHash.get(clientSocket)+"
server.messageBoard.append(message+"
publicTalk(message);
server.messageBoard.setCaretPosition(server.messageBoard.getText().length());
*发送公共消息的函数,将消息向每个客户端都发送一份
publicvoidpublicTalk(StringpublicTalkMessage){
synchronized(clientDataHash){
//枚举遍历所有客户端输出流。
for(Enumerationenu=clientDataHash.elements();
enu.hasMoreElements();
){
DataOutputStreamoutData=(DataOutputStream)enu.nextElement();
//输出信息。
这里会阻塞
outData.writeUTF(publicTalkMessage);
}catch(IOExceptiones){
//打印异常堆栈。
终止程序。
es.printStackTrace();
*选择对象发送消息,参数peerTalk为发送的用户名,后面的参数为发送的消息
publicbooleanpeerTalk(StringpeerTalk,StringtalkMessage){
for(Enumerationenu=clientDataHash.keys();
SocketuserClient=(Socket)enu.nextElement();
//找到发送消息的对象,获取它的输出流以发送消息
if(peerTalk.equals((String)clientNameHash.get(userClient))
peerTalk.equals((String)clientNameHash.get(clientSocket))){
DataOutputStreampeerOutData=(DataOutputStream)clientDataHash.get(userClient);
peerOutData.writeUTF(talkMessage);
Feedback(talkMessage);
return(false);
//如果是发给自己的,直接回馈
elseif(peerTalk.equals((String)clientNameHash.get(clientSocket))){
return(true);
*此函数也用于选择发送消息,但不能发送给自己。
publicbooleanchessPeerTalk(StringchessPeerTalk,StringchessTalkMessage){
if(chessPeerTalk.equals((String)clientNameHash.get(userClient))
chessPeerTalk.equals((String)clientNameHash.get(clientSocket))){
peerOutData.writeUTF(chessTalkMessage);
*用于处理消息回馈的函数
publicvoidFeedback(StringfeedbackString){
//得到输出流。
DataOutputStreamoutData=(DataOutputStream)clientDataHash.get(clientSocket);
outData.writeUTF(feedbackString);
}catch(Exceptioneb){
//打印堆栈轨迹,程序终止。
eb.printStackTrace();
*获取用户列表的函数,此函数读取clientNameHash获取用户列表,然后将其保存在一个字符串userList中。
publicStringgetUserList(){
StringuserList="
/userlist"
;
//遍历hashtable中的values,以空格分割连接起来
for(Enumerationenu=clientNameHash.elements();
userList=userList+"
+(String)enu.nextElement();
returnuserList;
*给出HashTable和值对象,获取相对应得键值的函数。
publicObjectgetHashKey(HashtabletargetHash,ObjecthashValue){
ObjecthashKey;
for(Enumerationenu=targetHash.keys();
hashKey=(Object)enu.nextElement();
//如果键对应的值与hashValue相等,则返回这个key
if(hashValue.equals((Object)targetHash.get(hashKey)))
return(hashKey);
return(null);
publicvoidfirstCome(){
//新用户第一次加入、广播用户列表。
//反馈给这个用户,以修改相应显示信息。
+(String)clientNameHash.get(clientSocket));
Java五子棋聊天客户端"
/changename<
你的名字>
--更改名字"
/list--更新用户列表"
/<
用户名>
<
要说的话>
--私聊"
注意:
用命令的时候,先把谈话的对象定为所有人"
*用于和客户端断开的函数。
publicvoidclientClose(){
server.messageBoard.append("
用户断开:
+clientSocket+"
//如果是游戏客户端主机
if(chessPeerHash.containsKey(clientNameHash.get(clientSocket))){
chessPeerHash.remove((String)clientNameHash.get(clientSocket));
if(chessPeerHash.containsValue(clientNameHash.get(clientSocket))){
chessPeerHash.put((String)getHashKey(chessPeerHash,(String)clientNameHash.get(clientSocket)),
tobeclosed"
//将保留的HashTable里的数据清除
clientDataHash.remove(clientSocket);
clientNameHash.remove(clientSocket);
//广播更新用户列表。
//计算当前连接数,并显示在状态框中
server.statusLabel.setText("
+clientDataHash.size());
clientSocket.close();
}catch(IOExceptionexx){
isClientClosed=true;
publicvoidrun(){
DataInputStreaminData;
inData=newDataInputStream(clientSocket.getInputStream());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 五子棋 游戏 代码