




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.1 程序设计思路实现一个用户可以Internet上任何地方的不同机上进行游戏,使用多线程和网络套接字数据流的分布式五子棋游戏,根据要完成的功能,本程序采用多客户服务方式。服务器创建服务器Socket,始终处于监听等待状态。客户端是动作的发起者,何时发出申请由客户端决定。客户端向服务器发出申请,服务器给予响应,客户端发出申请后立即可从Socket通道去取服务方的结果。服务器接受两个客户端连接后开始一个线程,不断接受客户端发来的数据,并把处理后的数据传送给客户端。服务器可以创建任意多局(图3-1)。服 务 器游戏局1游戏局N客户端1客户端2客户端M客户端N图3-1 系统框架Fig.3-1 Frame of System在对服务器与客户端的设计开发之前,为了使开发方便,将服务器与客户端之间用以通信的变量规定好。通过编写一个接口GameConstant(),在其中定义各个常量的值: public static int PLAYER1 = 1; public static int PLAYER2 = 2; public static int PLAYER1_WON = 1; public static int PLAYER2_WON = 2; public static int DRAW = 3; public static int CONTINUE = 4; public static int STOP = 100; public static int GAMEPORT = 8000;服务器和客户端在设计时继承接口GameConstant()里面的所有数据。3.2 服务器的设计与实现为了使界面友好,服务器使用图形组件,创建成一个可以显示游戏信息的框架。在框架中创建一个包含文本区的滚动窗格,并在文本区显示游戏信息(图3-2)。图3-2 服务器界面Fig.3-2 Interface of Game-server要建立服务器,需要创建一个服务器Socket,并把它附加到一个端口上,服务器通过这个端口监听连接请求。端口标识Socket上的TCP服务。网络的类存放在包中,引入包后通过实现一个ServerSocket的实例就可以创建一个服务器Socket,并把它附加到一个端口(GAMEPORT)上: ServerSocketserverSocket=newServerSocket (GAMEPORT);然后,服务器使用下列语句开始监听连接请求:Socketplayer1=serverSocket.accept ();Socketplayer2=serverSocket.accept ();服务器开始等待,直到客户提出连接请求。连接建立后,服务器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的标记发送给客户端。new DataOutputStream(player1.getOutputStream().writeInt(PLAYER1);new DataOutputStream(player2.getOutputStream().writeInt(PLAYER2);当客户端满足开局条件时,就开启一个线程处理客户之间数据,同时继续监听其它客户端的连接请求。多线程是Java的一个特点,多线程可以使程序反应更快、交互性更强,并能提高执行效率。创建一个新的线程的生命周期如下状态: 新建,就绪,运行,阻塞,死亡。在Java中,提供了多种控制线程的方法,在服务器中用到的主要以下几种: publicvoidrun ()Java运行系统调用这个方法来执行线程。在用户线程类中,必须覆盖这个方法并且提供线程执行的代码。 publicvoidstart ()该方法启动线程,它引起对run()方法的调用。客户类中的可运行对象调用该方法。服务器程序采用类HandleGame继承Thread类来实现对线程的调用,同时对run ()方法覆盖。以下是HandleGame () 类里面主要的数据域和方法: private char cell:Char类型数组用来记录玩家的标记。private DataInputStream isFromPlayer1; private DataOutputStream osToPlayer1; private DataInputStream isFromPlayer2; private DataOutputStream osToPlayer2; :四个数据流用来实现与两个玩家之间信息的传递。public HandleGame (Socket player1, Socket player2):构造函数,两个参数用以接收传递过来的Socket对象。public void run():对继承Thread类中的run ()方法进行覆盖。private boolean isFull() :判断是否满格。private boolean isWon(int row,int column,char token):判断新标记的单元格是否使一方获胜。游戏局一旦建立起来,服务器便于工作交替地从客户端那里接收数据。从客户端接收到数据后,服务器判断游戏状态,并根据结果进行相关操作,直至游戏结束。3.3 客户端的设计与实现客户端负责与玩家的交互。因此要创建一个界面,包括一个20*20的下棋区域,当玩家选定单元格或接收到别的玩家选定的单元格时,用不同的标记显示;两个显示游戏名称和游戏状态的标签和两个菜单栏上的按键用以进行控制,如图3-3:图3-3 客户端界面Fig.3-3 Interface of Game-client这里客户程序设计成一个Java Applet,用户可以在Web浏览器里运行。当用户打开GameClient.html文件时,浏览器调用init ()方法对界面进行初始化。点击Start时开启一个线程和服务器连接,通过数据流进行数据交换。 connectToServer = new Socket(localhost, GAMEPORT); isFromServer = new DataInputStream(connectToServer.getInputStream(); osToServer = new DataOutputStream(connectToServer.getOutputStream();下面是类GameClient的主要方法和数据: public class GameClient extends JApplet implements Runnable, ActionListener, GameConstants private boolean myTurn = false; :标记是否轮到自己下棋 private char myToken = ; :标记自己的棋子 private char otherToken = ; :标记对手的棋子 private Cell cell =new Cell2020; :生成20*20个单元格 private int rowSelected; :记录所选单元格的行 private int columnSelected; :记录所选单元格的列 private boolean continueToPlay = true; private boolean waiting = true;:记录游戏进行中的状态 public void init():初始化用户界面,打开网页时由浏览器调用 public void actionPerformed(ActionEvent e):覆盖ActionListener接口里面actionPerformed ()方法,用来处理用户点击菜单栏引起的操作。 public void run()覆盖Runnable接口里的run ()方法,用以对游戏过程中的数据传输,处理,控制。 在客户程序的类中,由于它继承了Applet类,所以不能再通过声明Thread类的扩展来实现,只能通过实现Java提供的一个Runnable接口,进行线程的创建和运行。Runnable接口的实现是非常简单的,它只包含run ()方法,使用时只要将该方法覆盖。从游戏设计来看,单元格是处理鼠标点击事件和显示标记的GUI对象。在这里使用的是面板,设置单元格Cell为JPanel的子类。将Cell类声明为内部类,可以直接使用GameClient类中定义的变量与方法,使程序简洁明了。Cell类中包含以下主要数据和方法: public class Cell extends JPanel implements MouseListener private int row; private int column; private char token = ; public Cell(int row, int column):构造函数 public void paintComponent(Graphics g):Graphics对象g是由Java运行系统自动创建,这个对象控制信息的绘制方式。可以使用定义在Graphics类中的多种画法绘制字符串的几何图形。 public void mouseClicked(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseEntered(MouseEvent e)public void mouseReleased(MouseEvent e) public void mousePressed(MouseEvent e) :接口MouseListener中的方法。 3.4 程序的运行首先将编写好的程序使用Java编译器编译,生成以class为扩展名的类文件,然后使用Java解释器分别运行服务器和客户端。客户端发出连接,服务器接收后开启线程对游戏进行控制,游戏结束时关闭线程。具体流程如图3-4所示:玩家一1. 初始化用户界面2. 向服务器请求连接,并从服务器获知所用棋子的标记。3. 从服务器得到开始标志。4. 等待玩家标记单元格,并向服务器发送单元格的行号和列号。5. 从服务器接收游戏状态。6. 如果状态是WIN,显示是胜者,如果玩家二获胜,接收玩家二的最后一步走棋信息。中断循环。7. 如果状态是DRAW,显示游戏结束,中断循环。8. 如果状态是CONTINUE,接收玩家二选定的单元格的行号和列号,标记玩家二选定的单元格。服务器创建一个服务器套接字。接收第一个玩家的连接请求,并且通知玩家他是玩家一,使用标记“X”。接收第二个玩家的连接请求,并且通知玩家他是玩家二,使用标记“O”。启动对局线程。处理对局:1 告诉玩家一开始游戏。2 接收玩家一选定单元格的行和列。3 判断游戏状态(STOP,WIN,DRAW,CONTINUE)。如果玩家一退出,向玩家二发送状态(STOP),退出。4 如果玩家一获胜,给两个玩家都发送状态(PLAYER1_WON),并且向玩家二发送玩家一的走棋信息。退出。5 如果状态是CONTINUE,通知玩家二轮他走棋,并且向玩家二发送玩家一最新选定单元格的行和列。6 接收玩家二选定的单元格的行和列。7 如果玩家二退出,向玩家一发送状态(STOP),退出。8 如果玩家二获胜,给两个玩家都发送状态(PLAYER2_WON),并且向玩家一发送玩家二的走棋信息。退出。9如果状态是CONTINUE,发送状态,并且向玩家一发送玩家二最近选定的单元格的行和列。玩家二1 初始化用户界面2 向服务器请求连接,并从服务器获知所用棋子的标记。3 从服务器接收游戏状态。4 如果状态是WIN,显示是胜者,如果玩家一获胜,接收玩家一的最后一步走棋信息。中断循环。5 如果状态是CONTINUE,接收玩家一选定的单元格的行号和列号,标记玩家一选定的单元格。6 等待玩家标记单元格,并向服务器发送单元格的行号和列号。图3-4 运行流程Fig.3-4 Flow Chart4 小结随着计算机和网络技术的不断发展,信息技术给人们带来的帮助越来越大,单独一台计算机已经不能满足人们的需求
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幕墙材料性能检测与评估技术方案
- 专业能力评估题库及答案
- 广东省佛山市三水区2023-2024学年高一下学期期中考试语文考试题目及答案
- 数字经济产业园建设项目建筑工程方案
- 房屋建筑施工现场设备与工具管理方案
- 离婚协议彩礼退还与个人财产分割合同范本
- 离婚协议书多语种专业翻译与本地化合同
- 物业租赁合同范本:包含设施更新改造协议
- 私立幼儿园教师聘用合同中的师德师风建设协议
- 离婚诉讼财产分割与子女抚养权法律援助合同
- DLT 5035-2016 发电厂供暖通风与空气调节设计规范
- 新药研究与开发技术 课件2.新药的发现研究
- 销售合规风险管理制度
- 药房员工销售培训
- 盾构施工安全管理
- 职场动物进化手册
- 警校联动方案
- 2025中国农业银行贷款合同
- 青少年脊柱侧弯预防
- 2025年静脉输液考试题及答案2024
- 10 ai ei ui 教学设计-2024-2025学年语文一年级上册统编版
评论
0/150
提交评论