java五子棋游戏代码 .pdf

上传人:C****o 文档编号:39740392 上传时间:2022-09-07 格式:PDF 页数:38 大小:216.63KB
返回 下载 相关 举报
java五子棋游戏代码 .pdf_第1页
第1页 / 共38页
java五子棋游戏代码 .pdf_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《java五子棋游戏代码 .pdf》由会员分享,可在线阅读,更多相关《java五子棋游戏代码 .pdf(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、package server;import java.io.*;import .*;import java.awt.*;import java.util.*;import java.awt.event.*;/*显示服务器及用户信息的Panel 类*/class MessageServerPanel extends Panel /主消息窗口TextArea messageBoard=new TextArea(,22,50,TextArea.SCROLLBARS_VERTICAL_ONLY);Label statusLabel=new Label(当前连接数:,Label.LEFT);Panel

2、boardPanel=new Panel();/主显示区Panel Panel statusPanel=new Panel();/连接状态Panel MessageServerPanel()setSize(350,300);setBackground(new Color(204,204,204);setLayout(new BorderLayout();boardPanel.setLayout(new FlowLayout();boardPanel.setSize(210,210);statusPanel.setLayout(new BorderLayout();statusPanel.set

3、Size(210,50);boardPanel.add(messageBoard);statusPanel.add(statusLabel,BorderLayout.WEST);add(boardPanel,BorderLayout.CENTER);add(statusPanel,BorderLayout.NORTH);/*服务器线程,主要用于服务器与客户端的通信*/class ServerThread extends Thread Socket clientSocket;Hashtable clientDataHash;/Socket 与发送数据的流的映射名师资料总结-精品资料欢迎下载-名师

4、精心整理-第 1 页,共 38 页 -Hashtable clientNameHash;/Socket 与用户名的映射Hashtable chessPeerHash;/对弈的两个客户端用户名的映射MessageServerPanel server;boolean isClientClosed=false;/*服务器端线程的构造函数,用于初始化一些对象。*/ServerThread(Socket clientSocket,Hashtable clientDataHash,Hashtable clientNameHash,Hashtable chessPeerHash,MessageServerP

5、anel server)this.clientSocket=clientSocket;this.clientDataHash=clientDataHash;this.clientNameHash=clientNameHash;this.chessPeerHash=chessPeerHash;this.server=server;/*对客户端发来的消息处理的函数,处理后转发回客户端。处理消息的过程比较复杂,要针对很多种情况分别处理。*/public void messageTransfer(String message)String clientName,peerName;/命令处理/如果消息以

6、“/”开头,表明是命令消息。if(message.startsWith(/)/如果消息以“/list”开头,则将其回馈到客户端以更新用户列表if(message.equals(/list)Feedback(getUserList();/如果消息以/creatgame inchess 开头,则修改clientNameHash 映射/和 chessPeerHash映射。else if(message.startsWith(/creatgame inchess)/String chessServerName=message.substring(20);synchronized(clientNameH

7、ash)clientNameHash.put(clientSocket,message.substring(11);名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 38 页 -synchronized(chessPeerHash)/刚创建,等待其他人加入chessPeerHash.put(chessServerName,wait);Feedback(/yourname +clientNameHash.get(clientSocket);chessPeerTalk(chessServerName,/OK);publicTalk(getUserList();/如果消息以“/joing

8、ame”开头,则将消息的服务端名字和本地用户名提取出来,/然后修改clientNameHash 表和 chessPeerHash表。if(message.startsWith(/joingame)StringTokenizer userToken=new StringTokenizer(message,);String getUserToken,serverName,selfName;String chessNameOpt=0,0;int getOptNum=0;/提取服务端用户名和本地用户名while(userToken.hasMoreTokens()getUserToken=(String

9、)userToken.nextToken();if(getOptNum=1&getOptNum +message;if(peerTalk(peerName,message)Feedback(没有这个用户:+peerName+n);/如果不以“/”开头,表明是普通消息,直接发送else message=clientNameHash.get(clientSocket)+message;server.messageBoard.append(message+n);publicTalk(message);server.messageBoard.setCaretPosition(server.messag

10、eBoard.getText().length();/*发送公共消息的函数,将消息向每个客户端都发送一份*/public void publicTalk(String publicTalkMessage)synchronized(clientDataHash)/枚举遍历所有客户端输出流。for(Enumeration enu=clientDataHash.elements();enu.hasMoreElements();)DataOutputStream outData=(DataOutputStream)enu.nextElement();try /输出信息。这里会阻塞outData.wri

11、teUTF(publicTalkMessage);catch(IOException es)/打印异常堆栈。终止程序。es.printStackTrace();名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 38 页 -/*选择对象发送消息,参数peerTalk 为发送的用户名,后面的参数为发送的消息*/public boolean peerTalk(String peerTalk,String talkMessage)/for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();)Socket userClie

12、nt=(Socket)enu.nextElement();/找到发送消息的对象,获取它的输出流以发送消息if(peerTalk.equals(String)clientNameHash.get(userClient)&!peerTalk.equals(String)clientNameHash.get(clientSocket)synchronized(clientDataHash)DataOutputStream peerOutData=(DataOutputStream)clientDataHash.get(userClient);try peerOutData.writeUTF(talk

13、Message);catch(IOException es)es.printStackTrace();Feedback(talkMessage);return(false);/如果是发给自己的,直接回馈else if(peerTalk.equals(String)clientNameHash.get(clientSocket)Feedback(talkMessage);return(false);return(true);/*此函数也用于选择发送消息,但不能发送给自己。*/public boolean chessPeerTalk(String chessPeerTalk,String ches

14、sTalkMessage)for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();)Socket userClient=(Socket)enu.nextElement();if(chessPeerTalk.equals(String)clientNameHash.get(userClient)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 38 页 -&!chessPeerTalk.equals(String)clientNameHash.get(clientSocket)synchronized(clien

15、tDataHash)DataOutputStream peerOutData=(DataOutputStream)clientDataHash.get(userClient);try peerOutData.writeUTF(chessTalkMessage);catch(IOException es)es.printStackTrace();return(false);return(true);/*用于处理消息回馈的函数*/public void Feedback(String feedbackString)synchronized(clientDataHash)/得到输出流。DataOut

16、putStream outData=(DataOutputStream)clientDataHash.get(clientSocket);try /输出信息。outData.writeUTF(feedbackString);catch(Exception eb)/打印堆栈轨迹,程序终止。eb.printStackTrace();/*获取用户列表的函数,此函数读取clientNameHash 获取用户列表,然后将其保存在一个字符串userList 中。*/public String getUserList()String userList=/userlist;/遍历 hashtable中的 va

17、lues,以空格分割连接起来for(Enumeration enu=clientNameHash.elements();enu.hasMoreElements();)userList=userList+(String)enu.nextElement();名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 38 页 -return userList;/*给出 HashTable 和值对象,获取相对应得键值的函数。*/public Object getHashKey(Hashtable targetHash,Object hashValue)Object hashKey;for(Enum

18、eration enu=targetHash.keys();enu.hasMoreElements();)hashKey=(Object)enu.nextElement();/如果键对应的值与hashValue相等,则返回这个key if(hashValue.equals(Object)targetHash.get(hashKey)return(hashKey);return(null);public void firstCome()/新用户第一次加入、广播用户列表。publicTalk(getUserList();/反馈给这个用户,以修改相应显示信息。Feedback(/yourname +

19、(String)clientNameHash.get(clientSocket);Feedback(Java 五子棋聊天客户端);Feedback(/changename -更改名字);Feedback(/list-更新用户列表);Feedback(/-私聊);Feedback(注意:用命令的时候,先把谈话的对象定为所有人);/*用于和客户端断开的函数。*/public void clientClose()server.messageBoard.append(用户断开:+clientSocket+n);/如果是游戏客户端主机synchronized(chessPeerHash)if(chess

20、PeerHash.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);名师资料总结-精品资料欢迎下载-名师精心

21、整理-第 8 页,共 38 页 -/将保留的HashTable 里的数据清除synchronized(clientDataHash)clientDataHash.remove(clientSocket);synchronized(clientNameHash)clientNameHash.remove(clientSocket);/广播更新用户列表。publicTalk(getUserList();/计算当前连接数,并显示在状态框中server.statusLabel.setText(当前连接数:+clientDataHash.size();try clientSocket.close();c

22、atch(IOException exx)isClientClosed=true;public void run()DataInputStream inData;synchronized(clientDataHash)server.statusLabel.setText(当前连接数:+clientDataHash.size();try inData=new DataInputStream(clientSocket.getInputStream();firstCome();while(true)String message=inData.readUTF();messageTransfer(mes

23、sage);catch(IOException esx)finally if(!isClientClosed)clientClose();/*author wufenghanren 服务器端框架类*/名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 38 页 -public class chessServer extends Frame implements ActionListener Button messageClearButton=new Button(清除显示);Button serverStatusButton=new Button(服务器状态);Button serv

24、erOffButton=new Button(关闭服务器);Panel buttonPanel=new Panel();MessageServerPanel server=new MessageServerPanel();ServerSocket serverSocket;Hashtable clientDataHash=new Hashtable(50);Hashtable clientNameHash=new Hashtable(50);Hashtable chessPeerHash=new Hashtable(50);/*框架类的构造函数*/chessServer()super(Java

25、 五子棋服务器);setBackground(new Color(204,204,204);buttonPanel.setLayout(new FlowLayout();messageClearButton.setSize(60,25);buttonPanel.add(messageClearButton);messageClearButton.addActionListener(this);serverStatusButton.setSize(75,25);buttonPanel.add(serverStatusButton);serverStatusButton.addActionList

26、ener(this);serverOffButton.setSize(75,25);buttonPanel.add(serverOffButton);serverOffButton.addActionListener(this);add(server,BorderLayout.CENTER);add(buttonPanel,BorderLayout.SOUTH);/退出窗口的监听器addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0);名师资料总结-精品资料欢迎下载-

27、名师精心整理-第 10 页,共 38 页 -);setVisible(true);setSize(400,450);setResizable(false);validate();try makeMessageServer(4331,server);catch(Exception e)System.out.println(e);/*初始化消息服务器的类*/public void makeMessageServer(int port,MessageServerPanel server)throws IOException Socket clientSocket;long clientAccessN

28、umber=1;this.server=server;try /输出服务器的启动信息serverSocket=new ServerSocket(port);server.messageBoard.setText(服务器开始于:+serverSocket.getInetAddress().getLocalHost()+:+serverSocket.getLocalPort()+n);while(true)clientSocket=serverSocket.accept();server.messageBoard.append(用户连接:+clientSocket+n);DataOutputStr

29、eam outData=new DataOutputStream(clientSocket.getOutputStream();/在这里填充这两个Hashtable,在对应线程里用到。clientDataHash.put(clientSocket,outData);clientNameHash.put(clientSocket,(玩家 +clientAccessNumber+);/每连接一个用户,创建一个线程,监听服务。ServerThread thread=new ServerThread(clientSocket,clientDataHash,clientNameHash,chessPee

30、rHash,server);thread.start();catch(IOException ex)名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 38 页 -System.out.println(已经有服务器在运行.n);/*按钮的事件监听器,响应按钮点击事件*/public void actionPerformed(ActionEvent e)if(e.getSource()=messageClearButton)server.messageBoard.setText();/当“服务器状态”按钮点击时,显示服务器状态if(e.getSource()=serverStatus

31、Button)try/显示服务器信息server.messageBoard.append(服务器信息:+serverSocket.getInetAddress().getLocalHost()+:+serverSocket.getLocalPort()+n);catch(Exception ee)System.out.println(serverSocket.getInetAddress().getLocalHost()error n);if(e.getSource()=serverOffButton)/关闭服务。System.exit(0);public static void main(S

32、tring args)/主函数,启动服务器。chessServer chessServer=new chessServer();package client;import chessface.chatPad;import chessface.inputPad;import chessface.userPad;import chessface.chessPad;import chessface.controlPad;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import java.util.*;/*名

33、师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 38 页 -*五子棋客户端框架,实现了动作监听器和键盘监听器*/public class chessClient extends Frame implements ActionListener,KeyListener userPad userpad=new userPad();/用户列表Panel chatPad chatpad=new chatPad();/聊天信息Panel controlPad controlpad=new controlPad();/控制 Panel chessPad chesspad=new chessPa

34、d();/棋盘 Panel inputPad inputpad=new inputPad();/信息输入Panel Socket chatSocket;DataInputStream in;DataOutputStream out;String chessClientName=null;String host=null;int port=4331;boolean isOnChat=false;/是否在聊天boolean isOnChess=false;/是否在下棋boolean isGameConnected=false;/是否下棋的客户端连接boolean isServer=false;/是

35、否建立游戏的主机boolean isClient=false;/是否加入游戏的客户端Panel northPanel=new Panel();Panel centerPanel=new Panel();Panel eastPanel=new Panel();/*名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 38 页 -*五子棋客户端框架的构造函数。用来初始化一些对象、布局和为按钮添加监听器。*/public chessClient()/窗口标题super(五子棋客户端);/设置布局setLayout(new BorderLayout();/获取服务器ip 地址host=con

36、trolpad.inputIP.getText();/右侧的 Panel,向里面添加用户列表和聊天信息列表的Panel/设置 eastPanel布局eastPanel.setLayout(new BorderLayout();/在其上添加用于列表eastPanel.add(userpad,BorderLayout.NORTH);/在其上添加聊天信息窗口eastPanel.add(chatpad,BorderLayout.CENTER);/设定背景色eastPanel.setBackground(new Color(204,204,204);/对编辑输出信息窗口添加事件监听器.inputpad.

37、inputWords.addKeyListener(this);/设置棋盘Panel 所需的服务器地址chesspad.host=controlpad.inputIP.getText();/向 centerPanel中添加棋盘和用户输入消息panel,并设定背景颜色centerPanel.add(chesspad,BorderLayout.CENTER);centerPanel.add(inputpad,BorderLayout.SOUTH);centerPanel.setBackground(new Color(204,204,204);/为 controlpad 中的按钮们添加事件监听.c

38、ontrolpad.connectButton.addActionListener(this);controlpad.creatGameButton.addActionListener(this);controlpad.joinGameButton.addActionListener(this);controlpad.cancelGameButton.addActionListener(this);controlpad.exitGameButton.addActionListener(this);/初始设定这几个按钮为非激活状态.controlpad.creatGameButton.setEn

39、abled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(false);/添加 controlpad 到 northPanel-最上端的panel northPanel.add(controlpad,BorderLayout.CENTER);northPanel.setBackground(new Color(204,204,204);/添加窗口监听器,当窗口关闭时,关闭用于通讯的Socket。addWindowListener(new WindowAdapte

40、r()名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 38 页 -public void windowClosing(WindowEvent e)if(isOnChat)/如果聊天连接已建立,则释放try chatSocket.close();catch(Exception ed)if(isOnChess|isGameConnected)/如果下棋连接已建立,则释放try chesspad.chessSocket.close();catch(Exception ee)System.exit(0););/添加这些panel 到 frame,组成最终窗口add(eastPanel,

41、BorderLayout.EAST);add(centerPanel,BorderLayout.CENTER);add(northPanel,BorderLayout.NORTH);/设置大小等setSize(670,560);setVisible(true);setResizable(true);validate();/*和服务器建立连接并通信的函数。*return true 如果连接成功,false 如果连接失败.*/public boolean connectServer(String serverIP,int serverPort)throws Exception try /Syste

42、m.out.println(in chessClient#connectServer);/建立聊天socket chatSocket=new Socket(serverIP,serverPort);/由 socket 得到输入输出流.in=new DataInputStream(chatSocket.getInputStream();out=new DataOutputStream(chatSocket.getOutputStream();/创建线程clientThread clientthread=new clientThread(this);clientthread.start();isO

43、nChat=true;return true;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 38 页 -catch(IOException ex)/连接不成功chatpad.chatLineArea.setText(chessClient:connectServer:无法连接,建议重新启动程序n);return false;/*动作监听器,响应按钮点击动作。*/public void actionPerformed(ActionEvent e)/如果点击的是“连接主机”按钮,则用获取的服务器主机名连接服务器。if(e.getSource()=controlpad.connec

44、tButton)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.se

45、tText(连接成功,请创建游戏或加入游戏);catch(Exception ei)/连接失败chatpad.chatLineArea.setText(controlpad.connectButton:无法连接,建议重新启动程序n);/如果点击的是“关闭程序”按钮,则关闭正在进行通信的Socekt 并退出游戏。if(e.getSource()=controlpad.exitGameButton)if(isOnChat)/如果聊天连接建立则释放try chatSocket.close();catch(Exception ed)if(isOnChess|isGameConnected)/如果下棋连

46、接建立,则释放try chesspad.chessSocket.close();名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 38 页 -catch(Exception ee)System.exit(0);/如果点击的是“加入游戏”按钮,则先判断选定的加入的目标是否有效。/如果选定的目标为空或正在下棋或为其本身,则认为目标无效。if(e.getSource()=controlpad.joinGameButton)/得到选择的用户String selectedUser=userpad.userList.getSelectedItem();if(selectedUser=null

47、|selectedUser.startsWith(inchess)|selectedUser.equals(chessClientName)chesspad.statusText.setText(必须先选定一个有效用户);else try /如果未建立与服务器的连接,创建连接,设定用户的当前状态。/此外还要对按钮作一些处理,将“创建连接”按钮和“加入游戏按钮”设为不可用。if(!isGameConnected)if(chesspad.connectServer(chesspad.host,chesspad.port)isGameConnected=true;isOnChess=true;isC

48、lient=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);/向服务器发送用户加入游戏的消息chesspad.chessthread.sendMessage(/joingame +userpad.userList.getSelectedItem()+chessClientName);/如果已建立连接,省去建立连接的操作。else isOnChess=true;isCl

49、ient=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);/向服务器发送用户加入游戏的消息chesspad.chessthread.sendMessage(/joingame +userpad.userList.getSelectedItem()+名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 38 页 -+chessClientName);catch

50、(Exception ee)/加入游戏失败。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);/如果点击的是“创建游戏”按钮,设定用户状态、按钮状态,然后

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com