网络对弈课程设计说明书.doc_第1页
网络对弈课程设计说明书.doc_第2页
网络对弈课程设计说明书.doc_第3页
网络对弈课程设计说明书.doc_第4页
网络对弈课程设计说明书.doc_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编号: 计算机网络课程设计说明书 题 目:网络对弈程序设计 系 别:计算机科学与工程学院 专 业:计算机科学与技术 学生姓名: 学 号: 指导教师: 王虎寅 2013 年 3 月 20 日 目目 录录 1 1 设计任务及目标设计任务及目标 1 1 1.1 开发背景以及设计目标 1 1.2 设计任务.1 2 2 需求分析需求分析 2 2 2.1 系统需求.2 2.2 用户需求.2 2.2.1 服务端需求2 2.2.2 客户端需求2 2.2.3 技术上可行性分析3 2.3.系统运行环境 4 3 3 总体设计总体设计 4 4 3.1 系统结构设计.4 3.2 服务器设计.5 3.3 客户端设计.7 3.4 棋类设计.8 4 4 详细设计详细设计 9 9 4.1 服务器 9 4.1.1 服务器主类的设计开发 9 4.1.2 服务器线程的设计开发 .13 4.2 客户端 .23 4.3 棋盘以及规则26 5 5 软件实现以及使用说明软件实现以及使用说明 4646 5.1 服务器运行使用及测试46 52 客户端运行使用及测试 49 6 6 总结总结 5353 6.1 任务完成情况53 6.2 特色与不足53 6.2.1 特色 .53 6.2.2 不足 .53 6.3 所遇到的问题53 6.4 体会54 7 7 参考文献参考文献 5555 桂林电子科技大学课程设计说明书用纸 第 1 页 共 55 页 1 1 设计任务及目标设计任务及目标 1.11.1 开发背景以及设计目标开发背景以及设计目标 五子棋有着悠久的历史,五子棋爱好者更是不计其数,但是由于 人们工作地点,时间的限制,生活节奏的加快,人们之间的交流越来 越少,面对面下五子棋的机会更是少了很多,那种面对面的下棋的方 式已经不再适应人们的生活,但网络给了人们一个交流的平台,因此 人们开始转向网络五子棋。 网络五子棋有很多优点,通过网络五子棋,对弈双方可以是网络 上任意两个五子棋的爱好者,甚至从不认识。网络五子棋让对弈的范 围更加的广泛,让玩家可以与更多的五子棋爱好者切磋棋艺。 所以我此次网络课程设计综合运用计算机网络、JAVA 语言 程序设计、网络编程等课程知识;从需求分析入手,系统地掌 握计算机网络编程初级技术,独立、合理地完成网络五子棋对弈程序 设计任务。设计目标主要包括: (1)实现需求分析阶段所要求的服务器端以及客户端的功能。 (2)游戏界面朴素美观。 (3)棋子样式采用传统样式,黑色和白色。 (4)客户端的信息交流完全通过服务器传递完成。 1.21.2 设计任务设计任务 完成一个网络五子棋对弈程序设计工作。 根据自身多年来进行网络对弈的经验,以及了解,对网络五子棋 对弈的设计进行需求分析。根根设计目标以及需求分析对五子棋游戏 界面总体规划和设计,游戏界面设计好以后进行服务器端和客户端的 规划设计,最后进行棋盘以及棋子的设计。设计阶段要进行服务器端 框架设计与业务代码开发,客户端框架设计与业务代码的开发,棋子 以及棋盘类的设计开发,规则类的设计开发等。 桂林电子科技大学课程设计说明书用纸 第 2 页 共 55 页 2 2 需求分析需求分析 2.12.1 系统需求系统需求 (1)满足客户端连接到服务器的基本要求。 (2)服务器满足记录客户端游戏动作的基本要求。 (3)满足服务器实时获得客户端游戏状态的基本要求。 2.22.2 用户需求用户需求 2.2.12.2.1 服务端需求服务端需求 (1)可以有一个显示服务器状态的界面,用于记录各个客户端的连 接状态。服务器是用于连接各个客户端的通信,如果独立地创建一个 直观的服务器,将有力地显示客户端的每个状态,直观地向用户反应 各类信息。 (2)可以支持多人同时在线。一个服务器能够你能够接受来自其他 多个客户端的请求,提供相应的响应服务,是网络对弈的基本要求。 (3)可以显示在线用户的信息。显示在线用户的信息,比如主机名, IP 地址,以及连接断的状态,有利于用户随时监控客户端的通信状态。 (4)不允许玩家同名。不允许客户端同名即是不允许客户端的端口 号相同,如果相同,将会造成游戏登陆用户的管理混乱。 (5)服务器界面节约大方。服务器是用于监控客户端的连接情况, 没用必要做得繁杂,用户只需要直观的状态显示,所以我们的服务器 不需要设计太多按钮,只需要有显示服务器状态,关闭服务器,清空 列表的按钮,方便用户操作。 桂林电子科技大学课程设计说明书用纸 第 3 页 共 55 页 2.2.22.2.2 客户端需求客户端需求 (1)能够通过主机 IP 及端口号登陆到服务器。 (2)可以显示当前所有用户。游戏客户端应设计一个可以显示当 前 所有在线用户的列表,有助于用户随意选择玩家挑战。 (3)可以从在线用户列表中选择玩家进行挑战。 (4)可以创建以及接受挑战。 (5)如果对方正在与其他玩家对弈,则应给出相应提示。 (6)五子棋规则一定要严密。其中五子棋游戏的规则如下: 棋盘,棋子: a) 棋盘为十五路,正中一点为“天元”,周围四点为小星。 b) 棋子分黑白两色,黑子 113 枚,白子 112 枚,共 225 枚。 比赛规则: a)黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交 叉点上落子,白第二着棋应布在自己河界的一侧。此后,执黑方 在以天元为中心的 25 个交叉点的范围内布盘面的第三着棋。 b)最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。 c)黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”, “四四”,“长连”。 黑方只能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个 或两个以上的活三,冲四及长连禁手。长连禁手是指黑方形成六 个或六个以上的连续棋子。 d)双方均不能形成五连为和棋。 e)对局中拔子,中途退场均判为负。 f)五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失 效,黑方胜。 g)黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继 续应子,则黑方禁手不成立。 h)高段位职业比赛的特殊规定:“三手可交换”:黑下完第手,执 白者可提出交换。即执白方变为执黑方。 “五手两打法”:执黑下第 五手时,必须下两手棋,执白者从这两手棋中任选一步。 i)本文所论述的联机五子棋系统就是依照这种方式进行的。 桂林电子科技大学课程设计说明书用纸 第 4 页 共 55 页 2.2.32.2.3 技术上可行性分析技术上可行性分析 对需求分析阶段的结果进行总结,对软件的可行性分析如下: (1)网络对弈需要两个客户端进行通信,而利用服务器的线程 开发,进行中间中介连接正好可以完成。 (2)五子棋的规则虽然严密,但是通过各种情况分析,然后将 每个情况分析设计出来。 (3)本系统的设计运行环境只用到 MyEclipse 的编程软件,无 需借用到其它的软件,比较容易实现。 2.3.2.3.系统运行环境系统运行环境 系统运行环境:MyEclipse 6.6 3 3 总体设计总体设计 3.13.1 系统结构设计系统结构设计 该游戏主要分为服务器端与客户端两部分。 服务器端的功能主要是建立与客户端的连接,监控客户端的连接 及断开的状态,接收客户端发送的信息以及向客户端发送信息。 客户端的功能主要是连接服务器端,创建游戏用户,创建游戏, 加入游戏,选择玩家挑战,向服务器发送信息,接收服务器端发送来 的信息。其具体的功能模块如图所示: 桂林电子科技大学课程设计说明书用纸 第 5 页 共 55 页 网络五子 棋 服务器 端 客户端 启动服务器 维护在线用户 信息 接收客户端信息 向客户端发送信息 连接服务器 创建游戏 选择玩家挑战 向服务器发送信息 接收服务器传来的信息 3.23.2 服务器设计服务器设计 服务器的设计主要分为服务器主界面,服务器线程,服务器主机 面板三个部分。 服务器主界面的设计主要包括界面大小,界面背景,界面上的按 钮,比如清空列表,服务器状态,关闭服务器的设计,以及启动对客 户端的监听,启动服务器线程。 服务器线程的设计主要包括接受多个客户端的连接,接受客户端 信息,向客户端发送信息。 服务器主机面板的设计主要包括客户端信息板的设计,包括板的 大小,背景颜色。其具体的功能模块如图所示: 桂林电子科技大学课程设计说明书用纸 第 6 页 共 55 页 服务器端 服务器主界面 服务器线程 服务器主机面板 监听客户端 启动服务器线程 清空,显示,关闭 服务器信息 接收客户端信息 向客户端发送信息 信息板的显示 桂林电子科技大学课程设计说明书用纸 第 7 页 共 55 页 3.33.3 客户端设计客户端设计 客户端的设计主要分为客户端界面,客户端线程两部分。 客户端界面的设计主要包括客户端界面大小,背景颜色,主要按 钮:创建游戏,加入游戏,连接到服务器,放弃游戏,退出游戏的设 计以及它们对应事件的处理。 客户端线程的设计主要包括连接到服务器,向服务器发送信息, 接受服务器信息的设计以及它们对应的事件处理,比如收到服务器发 送来的游戏胜利,信息错误,信息有效等的处理。其具体功能模块如 图所示: 客户端 客户端界面 客户端线程 创建游戏 加入游戏 连接到游戏 连接到服务器 向服务器发送信息 放弃游戏 退出游戏 接收服务器信息 桂林电子科技大学课程设计说明书用纸 第 8 页 共 55 页 3.43.4 棋类设计棋类设计 五子棋类的设计主要分为棋盘,棋子,五子棋动作线程,规则四 部分。 棋盘的设计主要包括画棋子,捕获下棋事件,画网络棋盘。 棋子 的设计包括黑棋以及白旗的设计,其中有大小,颜色,所属棋盘的设 计。 五子棋动作线程的设计包括处理捕获下棋信息,发送当前下棋信 息,这一部分的设计是五子棋类设计的重点。 规则的设包括取得指定棋子的位置,判断当前棋子是否取得胜利, 当前棋子各个方向的判断,当前所要下的棋子是否越界。 五子棋 棋盘 棋子 画棋子 捕获下棋事件 黑棋 白棋 五子棋线程 画网络棋盘 处理捕获的下 棋信息 发送当前下棋信 息 规 则 方向判断 胜利判断 越界判断 桂林电子科技大学课程设计说明书用纸 第 9 页 共 55 页 4 4 详细设计详细设计 4.14.1 服务器服务器 4.1.14.1.1 服务器主类的设计开发服务器主类的设计开发 服务器主类即服务器端的运行类,用户通过运行该类进入服务器 的主界面。其中包括创建服务器端用到的控件以及声明用到的对象引 用,完成对控件的初始化:设置窗体的标题,图标,大小以及可见性, 将各个控件添加到各面板的相应位置 FIRServer.java 类: / 服务器界面类 public class FIRServer extends Frame implements ActionListener JButton clearMsgButton = new JButton(“清空列表“); JButton serverStatusButton = new JButton(“服务器状态“); JButton closeServerButton = new JButton(“关闭服务器“); Panel buttonPanel = new Panel(); ServerMsgPanel serverMsgPanel = new ServerMsgPanel(); ServerSocket serverSocket; Hashtable clientDataHash = new Hashtable(50); /将客户端套接口和输出 流绑定 Hashtable clientNameHash = new Hashtable(50); /将客户端套接口和客户 名绑定 Hashtable chessPeerHash = new Hashtable(50); /将游戏创建者和游戏加 入者绑定 public FIRServer() super(“Java 五子棋服务器“); setBackground(Color.LIGHT_GRAY); buttonPanel.setLayout(new FlowLayout(); 桂林电子科技大学课程设计说明书用纸 第 10 页 共 55 页 clearMsgButton.setSize(60, 25); buttonPanel.add(clearMsgButton); clearMsgButton.addActionListener(this); serverStatusButton.setSize(75, 25); buttonPanel.add(serverStatusButton); serverStatusButton.addActionListener(this); closeServerButton.setSize(75, 25); buttonPanel.add(closeServerButton); closeServerButton.addActionListener(this); add(serverMsgPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); pack(); setVisible(true); setSize(400, 400); setResizable(false); validate(); try createServer(4331, serverMsgPanel); catch (Exception e) e.printStackTrace(); / 用指定端口和面板创建服务器 桂林电子科技大学课程设计说明书用纸 第 11 页 共 55 页 public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOException Socket clientSocket; / 客户端套接口 long clientAccessNumber = 1; / 连接到主机的客户数量 this.serverMsgPanel = serverMsgPanel; / 设定当前主机 try serverSocket = new ServerSocket(port); serverMsgPanel.msgTextArea.setText(“服务器启动于:“ + InetAddress.getLocalHost() + “:“ /djr + serverSocket.getLocalPort() + “n“); while (true) / 监听客户端套接口的信息 clientSocket = serverSocket.accept(); serverMsgPanel.msgTextArea.append(“已连接用户:“ + clientSocket + “n“); / 建立客户端输出流 DataOutputStream outputData = new DataOutputStream(clientSocket .getOutputStream(); / 将客户端套接口和输出流绑定 clientDataHash.put(clientSocket, outputData); / 将客户端套接口和客户名绑定 clientNameHash .put(clientSocket, (“新玩家“ + clientAccessNumber+); / 创建并运行服务器端线程 FIRServerThread thread = new FIRServerThread(clientSocket, clientDataHash, clientNameHash, chessPeerHash, serverMsgPanel); thread.start(); 桂林电子科技大学课程设计说明书用纸 第 12 页 共 55 页 catch (IOException ex) ex.printStackTrace(); public void actionPerformed(ActionEvent e) if (e.getSource() = clearMsgButton) / 清空服务器信息 serverMsgPanel.msgTextArea.setText(“); if (e.getSource() = serverStatusButton) / 显示服务器信息 try serverMsgPanel.msgTextArea.append(“服务器信息:“ + InetAddress.getLocalHost() + “:“ + serverSocket.getLocalPort() + “n“); catch (Exception ee) ee.printStackTrace(); if (e.getSource() = closeServerButton) / 关闭服务器 System.exit(0); public static void main(String args) FIRServer firServer = new FIRServer(); 桂林电子科技大学课程设计说明书用纸 第 13 页 共 55 页 4.1.24.1.2 服务器线程的设计开发服务器线程的设计开发 服务器线程是服务器启动后创建并启动的第一个线程,该线程主 要用于接收客户端的连接,并未每个连接分配一个服务器代理线程。 服务器代理线程主要用于接收客户端传来的消息,并将该消息转发给 另一个客户端。服务器为所有客户端都分配了一个该类线程实例,单 独为特定客户端进行服务。同时每一个服务器代理线程都有能唯一标 识的名称。 FIRServerThead.java 类: public class FIRServerThread extends Thread Socket clientSocket; / 保存客户端套接口信息 Hashtable clientDataHash; / 保存客户端端口与输出流对应的 Hash Hashtable clientNameHash; / 保存客户端套接口和客户名对应的 Hash Hashtable chessPeerHash; / 保存游戏创建者和游戏加入者对应的 Hash ServerMsgPanel serverMsgPanel; boolean isClientClosed = false; public FIRServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable chessPeerHash, ServerMsgPanel server) this.clientSocket = clientSocket; this.clientDataHash = clientDataHash; this.clientNameHash = clientNameHash; this.chessPeerHash = chessPeerHash; this.serverMsgPanel = server; public void dealWithMsg(String msgReceived) String clientName; String peerName; if (msgReceived.startsWith(“/“) 桂林电子科技大学课程设计说明书用纸 第 14 页 共 55 页 if (msgReceived.equals(“/list“) / 收到的信息为更新用户列表 Feedback(getUserList(); else if (msgReceived.startsWith(“/creatgame inchess“) / 收到的信息为创建游戏 String gameCreaterName = msgReceived.substring(20); /取 得服务器名 synchronized (clientNameHash) / 将用户端口放到用户列表中 clientNameHash.put(clientSocket, msgReceived.substring(11); synchronized (chessPeerHash) / 将主机设置为等待状态 chessPeerHash.put(gameCreaterName, “wait“); Feedback(“/yourname “ + clientNameHash.get(clientSocket); sendGamePeerMsg(gameCreaterName, “/OK“); sendPublicMsg(getUserList(); else if (msgReceived.startsWith(“/joingame “) / 收到的信息为加入游戏时 StringTokenizer userTokens = new StringTokenizer(msgReceived, “ “); String userToken; String gameCreatorName; String gamePaticipantName; String playerNames = “0“, “0“ ; int nameIndex = 0; while (userTokens.hasMoreTokens() userToken = (String) userTokens.nextToken(“ “); if (nameIndex = 1 serverMsgPanel.msgTextArea.append(msgReceived + “n“); sendPublicMsg(msgReceived); serverMsgPanel.msgTextArea.setCaretPosition(serverMsgPanel.msgTextAr ea.getText() .length(); / 发送公开信息 public void sendPublicMsg(String publicMsg) 桂林电子科技大学课程设计说明书用纸 第 18 页 共 55 页 synchronized (clientDataHash) for (Enumeration enu = clientDataHash.elements(); enu .hasMoreElements();) DataOutputStream outputData = (DataOutputStream) enu.nextElement(); try outputData.writeUTF(publicMsg); catch (IOException es) es.printStackTrace(); / 发送信息给指定的游戏中的用户 public boolean sendGamePeerMsg(String gamePeerTarget, String gamePeerMsg) for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) / 遍历以取得游戏中的用户的套接口 Socket userClient = (Socket) enu.nextElement(); if (gamePeerTarget.equals(String) clientNameHash.get(userClient) try / 发送信息 peerOutData.writeUTF(gamePeerMsg); catch (IOException es) es.printStackTrace(); return false; return true; / 发送反馈信息给连接到主机的人 public void Feedback(String feedBackMsg) synchronized (clientDataHash) DataOutputStream outputData = (DataOutputStream) clientDataHash .get(clientSocket); try outputData.writeUTF(feedBackMsg); catch (Exception eb) eb.printStackTrace(); 桂林电子科技大学课程设计说明书用纸 第 20 页 共 55 页 / 取得用户列表 public String getUserList() String userList = “/userlist“; for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();) userList = userList + “ “ + (String) enu.nextElement(); return userList; / 根据 value 值从 Hashtable 中取得相应的 key public Object getHashKey(Hashtable targetHash, Object hashValue) Object hashKey; for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) hashKey = (Object) enu.nextElement(); if (hashValue.equals(Object) targetHash.get(hashKey) return hashKey; return null; / 刚连接到主机时执行的方法 public void sendInitMsg() sendPublicMsg(getUserList(); Feedback(“/yourname “ + (String) clientNameHash.get(clientSocket); Feedback(“Java 五子棋客户端“); Feedback(“/list -更新用户列表“); Feedback(“/ -私聊“); 桂林电子科技大学课程设计说明书用纸 第 21 页 共 55 页 Feedback(“注意:命令必须对所有用户发送“); public void closeClient() serverMsgPanel.msgTextArea.append(“用户断开连接:“ + clientSocket + “n“); synchronized (chessPeerHash) /如果是游戏客户端主机 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“); synchronized (clientDataHash) / 删除客户数据 clientDataHash.remove(clientSocket); synchronized (clientNameHash) / 删除客户数据 clientNameHash.remove(clientSocket); sendPublicMsg(getUserList(); serverMsgPanel.statusLabel.setText(“当前连接数:“ + clientDataHash.size(); try 桂林电子科技大学课程设计说明书用纸 第 22 页 共 55 页 clientSocket.close(); catch (IOException exx) exx.printStackTrace(); isClientClosed = true; public void run() DataInputStream inputData; synchronized (clientDataHash) serverMsgPanel.statusLabel.setText(“当前连接数:“ + clientDataHash.size(); try / 等待连接到主机的信息 inputData = new DataInputStream(clientSocket.getInputStream(); sendInitMsg(); while (true) String message = inputData.readUTF(); dealWithMsg(message); catch (IOException esx) finally if (!isClientClosed) closeClient(); 桂林电子科技大学课程设计说明书用纸 第 23 页 共 55 页 4.24.2 客户端客户端 客户端主类即客户端的运行类,用户通过运行该类连接服务器, 也是通过在该类的窗体中与其他玩家对弈。 FIRClientThread.java 类: public class FIRClientThread extends Thread public FIRClient firClient; public FIRClientThread(FIRClient firClient) this.firClient = firClient; public void dealWithMsg(String msgReceived) if (msgReceived.startsWith(“/userlist “) / 若取得的信息为用户列表 StringTokenizer userToken = new StringTokenizer(msgReceived, “ “); int userNumber = 0; / 清空客户端用户列表 firClient.userListPad.userList.removeAll(); / 清空客户端用户下拉框 firClient.userInputPad.userChoice.removeAll(); / 给客户端用户下拉框添加一个选项 firClient.userInputPad.userChoice.addItem(“所有用户“); while (userToken.hasMoreTokens() / 当收到的用户信息列表中存在数据时 String user = (String) userToken.nextToken(“ “); / 取得 用户信息 if (userNumber 0 / 将用户信 息添加到用户列表中 firClient.userInputPad.userChoice.addItem(user); / 将用户信息添加到用户下拉框中 userNumber+; firClient.userInputPad.userChoice.setSelectedIndex(0);/ 下 拉框默认选中所有人 else if (msgReceived.startsWith(“/yourname “) / 收到的信息为用户本名时 firClient.chessClientName = msgReceived.substring(10); / 取 得用户本名 firClient.setTitle(“Java 五子棋客户端 “ + “用户名:“ + firClient.chessClientName); / 设置程序 Frame 的标 题 else if (msgReceived.equals(“/reject“) / 收到的信息为拒绝用户时 try firClient.firPad.statusText.setText(“不能加入游戏!“); firClient.userControlPad.cancelButton.setEnabled(false); firClient.userControlPad.joinButton.setEnabled(true); firClient.userControlPad.createButton.setEnabled(true); catch (Exception ef) firClient.userChatPad.chatTextArea .setText(“Cannot close!“); firClient.userControlPad.joinButton.setEnabled(true); else if (msgReceived.startsWith(“/peer “) / 收到信息为游戏中的等待时 桂林电子科技大学课程设计说明书用纸 第 25 页 共 55 页 firClient.firPad.chessPeerName = msgReceived.substring(6); if (firClient.isCreator) / 若用户为游戏建立者 firClient.firPad.chessColor = 1; / 设定其为黑棋先行 firClient.firPad.isMouseEnabled = true; firClient.firPad.statusText.setText(“黑方下.“); else if (firClient.isParticipant) / 若用户为游戏加入者 firClient.firPad.chessColor = -1; / 设定其为白棋后性 firClient.firPad.statusText.setText(“游戏加入,等待对手. “); else if (msgReceived.equals(“/youwin“) / 收到信息为胜利信息 firClient.isOnChess = false; firClient.firPad.setVicStatus(firClient.firPad.chessColor); firClient.firPad.statusText.setText(“对手退出“); firClient.firPad.isMouseEnabled = false; else if (msgReceived.equals(“/OK“) / 收到信息为成功创建游戏 firClient.firPad.statusText.setText(“游戏创建等待对手“); else if (msgReceived.equals(“/error“) / 收到信息错误 firClient.userChatPad.chatTextArea.append(“错误,退出程序. n“); else firClient.userChatPad.chatTextArea.append(msgReceived + “n“); firClient.userChatPad.chatTextArea.setCaretPosition( 桂林电子科技大学课程设计说明书用纸 第 26 页 共 55 页 firClient.userChatPad.chatTextArea.getText().length(); public void run() String message = “; try while (true) / 等待聊天信息,进入 wait 状态 message = firClient.inputStream.readUTF(); dealWithMsg(message); catch (IOException es) 4.34.3 棋盘以及规则棋盘以及规则 FIRPad.java 类: public class FIRPad extends Panel implements MouseListener, ActionListener / 鼠标是否能使用 public boolean isMouseEnabled = false; / 是否胜利 public boolean isWinned = false; / 是否在下棋中 public boolean isGaming = false; / 棋子的 x 轴坐标位 public int chessX_POS = -1; / 棋子的 y 轴坐标位 public int chessY_POS = -1; 桂林电子科技大学课程设计说明书用纸 第 27 页 共 55 页 / 棋子的颜色 public int chessColor = 1; / 黑棋 x 轴坐标位数组 public int chessBlack_XPOS = new int200; / 黑棋 y 轴坐标位数组 public int chessBlack_YPOS = new int200; / 白棋 x 轴坐标位数组 public int chessWhite_XPOS = new int200; / 白棋 y 轴坐标位数组 public int chessWhite_YPOS = new int200; / 黑棋数量 public int chessBlackCount = 0; / 白棋数量 public int chessWhiteCount = 0; / 黑棋获胜次数 public int chessBlackVicTimes = 0; / 白棋获胜次数 public int chessWhiteVicTimes = 0; / 套接口 public Socket chessSocket; public DataInputStream inputData; public DataOutputStream outputData; public String chessSelfName = null; public String chessPeerName = null; public String host = null; public int port = 4331; public TextField statusText = new TextField(“请连接服务器!“); public FIRThread firThread = new FIRThread(this); public FIRPad() setSize(500, 500); setLayout(null); setBackground(Color.ORANGE); addMouseListener(this); add(statusText); 桂林电子科技大学课程设计说明书用纸 第 28 页 共 55 页 statusText.setBounds(new Rectangle(40, 5, 360, 24); statusText.setEditable(false); / 连接到主机 public boolean connectServer(String ServerIP, int ServerPort) throws Exception try / 取得主机端口 chessSocket = new Socket(ServerIP, ServerPort); / 取得输入流 inputData = new DataInputStream(chessSocket.getInputStream(); / 取得输出流 outputData = new DataOutputStream(chessSocket.getOutputStream(); firThread.start(); return true; catch (IOException ex) statusText.setText(“连接失败! n“); return false; / 设定胜利时的棋盘状态 public void setVicStatus(int vicChessColor) / 清空棋盘 this.removeAll(); / 将黑棋的位置设置到零点 for (int i = 0; i 19 | chessY_POS / 20 19) / 下棋位置不正确时,不执行任何操作 else paintFirPoint(a, b, chessColor); / 画棋子 public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) public void actionPerformed(ActionEvent e) 5 5 软件实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论