




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息科学与工程学院 课程设计题 目: TicTacToe游戏 姓 名: 郭磊 学 号: 201312310109 班 级: 3+2 课 程: java项目实训 任课教师 刘梦琳 2014年12月20日课程设计任务书及成绩评定题 目TicTacToe游戏课程设计的任务及要求任务: 开发一个分布式的井字游戏的applet,分布式的井字游戏运行用户在因特网上任意不同机器上玩游戏。具体要求: 服务器创建一个服务器套接字,并接受两个玩家一组的连接请求,构成一个会话,每个会话都是一个线程,管理两个玩家之间的通信并且判断游戏状态。服务器可以建立任意多个会话,在每一个会话中,第一个与服务器连接的客户端标志为玩家1,使用的棋子为x,第二个与服务器连接的客户端标志为玩家2,使用的棋子标记为o,服务器通知玩家各自使用的标记。一旦两个客户端都与服务器建立连接,服务器就启动一个线程,实现两个玩家的游戏 课程设计所需的软件、硬件等硬件环境:Iterl(R) Core(TM)2 Duo CPU,主频2.31GHz;内存3G; 硬盘320G以上;1024768显示分辨率软件环境: JDK6.0以上、eclipse 等设计报告:1、设计目的和任务2、总体设计:包括程序设计组成框图、流程图。3、详细设计:包括模块功能说明:函数功能、入口及出口参数说明,函数调用关系描述等。4、调试与测试:包括调试方法,测试结果分析与讨论,测试过程中遇到的主要问题及采取的解决措施。5、源程序清单和执行结果:清单中应有足够的注释。任课教师评语 成绩: 教师签名: 日期: 目 录绪 论11.1 设计目的11.2 设计任务11.3 运行环境12总体设计22.1 游戏运行原理22.2 程序设计组成框图22.3 程序设计流程图33详细设计实现43.1系统结构43.2 服务器端43.3 客户端123.4 连接服务器143.5游戏开始154心得体会18 绪 论1.1 设计目的 学习如何使用套接字数据流,使用多线程和网格开发一个分布式的井字游戏,分布式的井字游戏运行用户在因特网上任意不同的机器上玩游戏1.2 设计任务 开发一个井字游戏的Applet,该游戏允许两个游戏者在同一台机器上玩游戏。1.3 运行环境 环境是在个人笔记本上搭建的,根据运行情况得出本系统的运行环境至少为:硬件环境:Iterl(R) Core(TM) 2 Duo CPU,主频2.31GHz;内存3G; 硬盘320G以上;1024768显示分辨率软件环境: JDK6.0以上、eclipse 等2总体设计2.1 游戏运行原理服务器创建一个服务器套接字,并接受每两个玩家一组的连接请求,构成一个会话,每个会话都是一个线程,管理两个玩家之间的通信并且判断游戏状态。服务器可以建立任意多个会话,如图2-1所示: 服务器会话2会话1玩家1玩家2玩家2玩家1 图2-1游戏运行原理服务器创建一个服务器套接字,并接受两个玩家一组的连接请求,构成一个会话,每个会话都是一个线程,管理两个玩家之间的通信并且判断游戏状态。服务器可以建立任意多个会话,在每一个会话中,第一个与服务器连接的客户端标志为玩家1,使用的棋子为x,第二个与服务器连接的客户端标志为玩家2,使用的棋子标记为o,服务器通知玩家各自使用的标记。一旦两个客户端都与服务器建立连接,服务器就启动一个线程,实现两个玩家的游戏2.2 程序设计组成框图Tic-Tac-Toe游戏设计时,把它分为了不同的模块,每个模块赋予了不同的功能。程序的整体结构设计,如下图2-2所示TicTacToe客户端服务器图2-2 服务器Socket网络连接会话处理界面生成 图2-32.3 程序设计流程图开始 请求连接服务器,并从服务器获知标记 从服务器获取开始信号 等待玩家标记第一个单元格,发送该单元格的行列索引给服务器如果状态为Win,显示赢家,如果玩家2获胜,接收玩家2的最后一步移动,打断循环从服务器接收状态如果状态为CONTINUE,获取玩家2选中的行列索引,并标记该单元格如果状态为DRAW,显示游戏结束,打断循环结束3详细设计实现3.1系统结构 该游戏主要分为服务器和客户端两部分,服务器主要负责创建对话,并传递数据,客户端用来显示对方的动作,在界面上显示出来。3.2 服务器端 创建服务器套接字,接受来自第一个玩家的连接并且通过玩家谁是使用标记X的玩家1,接受来自第二个玩家的连接并且通知玩家谁是使用标记O的玩家2,启动会话线程。 连接服务器端Socket try / create a server socket ServerSocket serverSocket = new ServerSocket (8000); jtaLog.append(new Date () + : Server started at socket 8000n); / Number a session int sessionNo = 1; / Ready to create a session for every two players while (true) jtaLog.append (new Date () + : Wait for players to join session + sessionNo + n); / connect to player 1 Socket player1 = serverSocket.accept (); jtaLog.append(new Date() + : Player 1 joined session + sessionNo + n); jtaLog.append(Player 1s IP address + player1.getInetAddress().getHostAddress() + n); / notify that the player is Player 1 new DataOutputStream( player1.getOutputStream().writeInt(PLAYER1); / connect to player 2 Socket player2 = serverSocket.accept(); jtaLog.append(new Date() + : Player 2 joined session + sessionNo + n); jtaLog.append(Player 2s IP address + player2.getInetAddress().getHostAddress() + n); / notify that the player is Player 2 new DataOutputStream( player2.getOutputStream().writeInt(PLAYER2); / Display this session and increment session number jtaLog.append(new Date() + : Start a thread for session + sessionNo+ + n); 处理会话1) 通知玩家1开始2) 接受来自玩家1的被选中单元格的行列索引3) 确定游戏状态(WIN,DRAW,CONTINUE)。如果玩家1获胜或者平局,就发送状态(PLAYER1_WON,DRAW)给两个玩家,然后发送玩家1的移动给玩家2,退出。4) 如果状态为Continue,则通知玩家2参加投票,然后发送玩家1新选中的行列索引给玩家25) 接收来自玩家2的被选中单元格的行列索引26) 如果玩家2获胜,就发送状态(Player2_WON)给两个玩家,然后发送玩家2的移动给玩家1,退出7) 如果是状态为CONTINUE,则发送这个状态,然后发送玩家2新选中的行列索引给玩家1 class HandleASession implements Runnable, TicTacToeContants private Socket player1; private Socket player2; / create and initialize cells private char cell = new char33; private DataInputStream fromPlayer1; private DataOutputStream toPlayer1; private DataInputStream fromPlayer2; private DataOutputStream toPlayer2; / continue to play private boolean continueToPlay = true; /* Construct a thread */ public HandleASession(Socket player1, Socket player2) this.player1 = player1; this.player2 = player2; / Initialize cells for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) cellij = ; /* Implement the run() method for the thread */ public void run() try / Create data input and output streams DataInputStream fromPlayer1 = new DataInputStream( player1.getInputStream(); DataOutputStream toPlayer1 = new DataOutputStream( player1.getOutputStream(); DataInputStream fromPlayer2 = new DataInputStream( player2.getInputStream(); DataOutputStream toPlayer2 = new DataOutputStream( player2.getOutputStream(); / Write anything to notify player 1 to start / This is just to let player 1 know to start toPlayer1.writeInt(1); / Continuously serve the players and determine and report / the game status to the players while (true) / Receive a move from player 1 int row = fromPlayer1.readInt(); int column = fromPlayer1.readInt(); cellrowcolumn = X; / Check if Player 1 wins if (isWon(X) toPlayer1.writeInt(PLAYER1_WON); toPlayer2.writeInt(PLAYER1_WON); sendMove(toPlayer2, row, column); break; / Break the loop else if (isFull() / Check if all cells are filled toPlayer1.writeInt(DRAW); toPlayer2.writeInt(DRAW); sendMove(toPlayer2, row, column); break; else / Notify player 2 to take the turn toPlayer2.writeInt(CONTINUE); / Send player 1s selected row and column to player 2 sendMove(toPlayer2, row, column); / Receive a move from Player 2 row = fromPlayer2.readInt(); column = fromPlayer2.readInt(); cellrowcolumn = O; / Check if Player 2 wins if (isWon(O) toPlayer1.writeInt(PLAYER2_WON); toPlayer2.writeInt(PLAYER2_WON); sendMove(toPlayer1, row, column); break; else / Notify player 1 to take the turn toPlayer1.writeInt(CONTINUE); / Send player 2s selected row and column to player 1 sendMove(toPlayer1, row, column); catch(IOException ex) System.err.println(ex); /* Send the move to other player */ private void sendMove(DataOutputStream out, int row, int column) throws IOException out.writeInt(row); / Send row index out.writeInt(column); / Send column index /* determine if the cells are all occupied */ private boolean isFull() for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) if (cellij = ) return false; / At least one cell is not filled / All cells are filled return true; /* determine if the player with the specified token wins */ private boolean isWon(char token) / Check all rows for (int i = 0; i 3; i+) if (celli0 = token) & (celli1 = token) & (celli2 = token) return true; /* Check all columns */ for (int j = 0; j 3; j+) if (cell0j = token) & (cell1j = token) & (cell2j = token) return true; /* Check major diagonal */ if (cell00 = token) & (cell11 = token) & (cell22 = token) return true; /* Check subdiagonal */ if (cell02 = token) & (cell11 = token) & (cell20 = token) return true; /* All checked, but no winner */ return false; 界面显示JTextArea jtaLog = new JTextArea(); / create a scroll pane to hold text area JScrollPane scrollPane = new JScrollPane (jtaLog); / Add the scroll pane to the frame add(scrollPane, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); setTitle(TicTacToeServer);setVisible(true);3.3 客户端 客户端负责与玩家交互。它创建了一个包含9个单元格的用户界面,并在标签中为用户显示游戏名称和游戏状态。1) 初始化用户界面2) 客户端请求连接服务器,并从服务器获知使用哪个标记3) 从服务器获取开始信号4) 等待玩家标记一个单元格,发送该单元格的行列索引给服务器5) 从服务器接收状态6) 如果状态为WIN,显示赢家;如果玩家2获胜,接收玩家2的最后一步移动。打断循环7) 如果状态为DRAW,显示游戏结束,打断循环8) 如果状态为CONTINUE,获取玩家2选中的行列索引并标记该单元格 创建TicTacToeClient为游戏客户端主界面详细描述客户端的工作 public void init() / Panel p to hold cells JPanel p = new JPanel(); p.setLayout(new GridLayout(3, 3, 0, 0); for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) p.add(cellij = new Cell(i, j); / Set properties for labels and borders for labels and panel p.setBorder(new LineBorder(Color.black, 1); jlblTitle.setHorizontalAlignment(JLabel.CENTER); jlblTitle.setFont(new Font(SansSerif, Font.BOLD, 16); jlblTitle.setBorder(new LineBorder(Color.black, 1); jlblStatus.setBorder(new LineBorder(Color.black, 1); / Place the panel and the labels to the applet add(jlblTitle, BorderLayout.NORTH); add(p, BorderLayout.CENTER); add(jlblStatus, BorderLayout.SOUTH); / Connect to the server connectToServer(); 3.4 连接服务器 private void connectToServer() try / Create a socket to connect to the server Socket socket; if (isStandAlone) socket = new Socket(host, 8000); else socket = new Socket(getCodeBase().getHost(), 8000); / Create an input stream to receive data from the server fromServer = new DataInputStream(socket.getInputStream(); / Create an output stream to send data to the server toServer = new DataOutputStream(socket.getOutputStream(); catch (Exception ex) System.err.println(ex); / Control the game on a separate thread Thread thread = new Thread(this); thread.start(); 3.5游戏开始部分代码:public void run() try / Get notification from the server int player = fromServer.readInt(); / Am I player 1 or 2? if (player = PLAYER1) myToken = X; otherToken = O; jlblTitle.setText(Player 1 with token X); jlblStatus.setText(Waiting for player 2 to join); / receive startup notification from the server fromServer.readInt(); / Whatever read is ignored / The other player has joined jlblStatus.setText(Player 2 has joined. I start first); / It is my turn myTurn = true; else if (player = PLAYER2) myToken = O; otherToken = X; jlblTitle.setText(Player 2 with token O); jlblStatus.setText(Waiting for player 1 to move); / continue to play while (continueToPlay) if (player = PLAYER1) waitForPlayerAction(); / Wait for player 1 to move sendMove(); / Send the move to the server receiveInfoFromServer(); / Receive info
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数据分析师笔试重点考点及模拟题集
- 2025年政府会计准则实施能力考试重点题库
- 2025年宠物营养师营养伦理方向笔试模拟题及答案
- 领导谢辞致词模板
- 2025年安全员岗前考核模拟题含解析
- 2025年人力资源管理师职业能力测评试卷及答案解析
- 2025年协管员岗位面试模拟题及答案
- 2025年烹饪厨艺技能考试试题及答案解析
- 2025年考古发掘工程师专业水平评定试题及答案解析
- 2025年健身教练专业知识考核试题及答案解析
- 2025四川省公安厅招聘辅警(448人)笔试备考题库及答案解析
- 土地使用权法律风险尽职调查指南
- 2025年内容分发网络(CDN)行业当前市场规模及未来五到十年发展趋势报告
- 故宫博物馆院课件
- 2025年8月16日贵州省黔东南州事业单位遴选笔试真题及答案解析(专业水平测试)
- 2025-2026秋季学年第一学期学生国旗下演讲稿(20周):第一周 新程启航礼润心田-开学典礼
- 2025年教师招聘小学语文真题及答案
- 2025年突发疾病应急演练方案(脚本)
- 幼儿园保安人员培训记录
- 2025年北京市中考语文真题(含答案)
- 2025年运城社区专职工作人员招聘真题
评论
0/150
提交评论