五子棋设计与实现毕业设计(编辑修改稿)内容摘要:

的方法很直接——先判断棋子颜色,再逐个方向去判断,在每个方向进行判定时又分为正方向和负方向,对每一方向的判断都很类似,如以下代码片段用于判断黑子竖直方向的连子个数: ////////////////////////////// // 以下两个大的循环判断竖直方向棋子连接总数 ////////////////////////////// // 向下的方向连子个数 for (step = 1。 step = 4。 step++) { // 下层循环判断竖直向下第step个位置是否有白子 for (chessCompare = 0。 chessCompare = chessBlackCount。 chessCompare++) { // 如果有黑子 if (((a + step) * 20 == chessBlack_x[chessCompare]) amp。 amp。 ((b * 20) == chessBlack_y[chessCompare])) { chessLink = chessLink + 1。 if (chessLink == 5) { return (true)。 } } } if (chessLink == (chessLinkTest + 1))// 竖直向下还有黑色棋子 chessLinkTest++。 else break。 } //向上的连子个数 for (step = 1。 step = 4。 step++) { //下层循环判断竖直向上第step个位置是否有黑子 for (chessCompare = 0。 chessCompare = chessBlackCount。 chessCompare++) { //如果有黑子(其实这里可以break出来) if (((a step) * 20 == chessBlack_x[chessCompare]) amp。 amp。 (b * 20 == chessBlack_y[chessCompare])) { chessLink++。 if (chessLink == 5) { return (true)。 } } } //如果下个位置还有黑色棋子(可以换用标志符判断) if (chessLink == (chessLinkTest + 1)) chessLinkTest++。 else //如果没有,则终止,退出循环 break。 } 程序总体设计程序使用Socket 技术[8]以及java 多线程机制结合在进行客户与服务端之间信息的交互,但一个真正实用程序必须针对具体应用定制一套协议用于用户程序之间进行交互,而该协议的定制往往是编写程序的关键也是核心内容,该协议的完善决定程序是否能够正常运行。 所谓协议就是程序之间交互的信息的格式规定, 服务端和客户端都遵循该协议才能够进行对话, 通俗讲是人类之间的语言。 一、服务端接受的信息:(1)客户端连接信息,一个客户包含两个Socket 连接, 一个为chatSocket,另一个为chessSocket;(2)客户端创建游戏信息;(3)客户端加入游戏信息; (4)下棋信息;(5)放弃游戏信息;(6)公聊和私聊信息;(7)用户列表信息。 服务端发送的信息:服务端接受到客户端发送的各种信息,会做出不同响应, 并发送相应的信息对客户端进行响应或转发相应的信息给对手,并对服务端上存储的全局信息进行更新,服务端可能发送的信息包括:(1)所有用户列表;(2)服务端为该客户生成的客户名; (3)用户游戏创建成功信息;(4)加入游戏成功后,分别向游戏双方发送对手信息;(5)加入游戏拒绝信息;(6)游戏进行信息;(7)游戏胜利信息;(8)公聊和私聊信息。 三、客户端接受的信息:(1)用户列表信息;(2)游戏加入拒绝信息;(3)对手信息;(4)胜利信息;(5)创建成功信息;(6)错误信息;(7)聊天信息。 四、客户端发送的信息:(1)连接服务器;(2)创建游戏信息;(3)加入游戏信息;(4)放弃游戏;(5)公聊信息或私聊信息。 ServerClientClient客户端服务器客户端图31服务器新来客5新来客6新来客3新来客4新来客1新来客2聊天,玩游戏图324 详细设计 客户端程序实现客户端(Client)除了实现网络通信以外,还要实现游戏的一些基本功能,如规则制定、整个界面的布局、动画的实现等。 客户端界面如图41所示,由控制面板、游戏面板、用户面板、聊天面板以及聊天信息面板5个部分组成。 控制面板 用户面板 游戏面板 聊天信息面板 聊天面板 图41 客户端界面客户端实现的难点主要在于棋盘面板类和客户端主类,棋盘面板类实现了棋盘的绘制、鼠标事件的监听、落子的处理、胜负的判断等;客户端主类统筹全局,用于对连接、创建游戏等事件进行处理,同时实现与服务器的聊天、命令通信等。 棋盘面板类实现(1) 连接服务器connectServer方法负责连接至指定IP和端口号的服务器、初始化Socket、获取输入输出流。 connectServer的源代码如下: public boolean connectServer(String serverIP, int serverPort) throws Exception { try { // (in chessClientconnectServer)。 //建立聊天socket chatSocket = new Socket(serverIP, serverPort)。 //由socket得到输入输出流. in = new DataInputStream(())。 out = new DataOutputStream(())。 //创建线程 clientThread clientthread = new clientThread(this)。 ()。 isOnChat = true。 return true。 } catch (IOException ex) {//连接不成功 (chessClient:connectServer:无法连接,建议重新启动程序 \n)。 } return false。 } 其中的chessthread是chessThread类的对象,内部保存有对chessPad的引用,负责监听端口,随时接收服务器端发来的消息,并调用chessPad的相应方法进行处理。 (2)绘制棋盘 Paint方法用于棋盘的绘制,它可以有效地进行重绘,否则当棋盘被遮挡再呈现时将不能得到重绘而出现残缺。 棋盘绘制很简单,只需在相应位置上绘制相应数量的横线和纵线,最后加上棋盘的5个基准点即可。 代码如下: public void paint(Graphics g) { //棋盘的方格线 for (int i = 40。 i = 380。 i = i + 20) { (40, i, 400, i)。 } (40, 400, 400, 400)。 for (int j = 40。 j = 380。 j = j + 20) { (j, 40, j, 400)。 } (400, 40, 400, 400)。 //五个基准点 (97, 97, 6, 6)。 (337, 97, 6, 6)。 (97, 337, 6, 6)。 (337, 337, 6, 6)。 (217, 217, 6, 6)。 }(3)放置棋子放置棋子就是在Panel上的适当位置添加黑色或白色棋子,需要注意的是,每次落子后还要进行记录落子位置和颜色、胜负判定、向服务器发送落子消息、修改相应状态信息等操作。 chessPaint方法可完成以上功能,其代码如下: public void chessPaint(int chessPoint_a, int chessPoint_b, int color) { chessPoint_black chesspoint_black = new chessPoint_black(this)。 chessPoint_white chesspoint_white = new chessPoint_white(this)。 if (color == 1 amp。 amp。 isMouseEnabled) { // 当黑子落子时,记下此子的位置 getLocation(chessPoint_a, chessPoint_b, color)。 // 判断是否获胜 isWin = checkWin(chessPoint_a, chessPoint_b, color)。 if (isWin == false) { // 如果没有获胜,向对方发送落子信息,并绘制棋子 (/ + chessPeerName + /chess + chessPoint_a + + chessPoint_b + + color)。 (chesspoint_black)。 (chessPoint_a * 20 7, chessPoint_b * 20 7, 16, 16)。 // 在状态文本框显示行棋信息 (黑(第 + chessBlackCount + 步) + chessPoint_a + + chessPoint_b + ,请白棋下子)。 isMouseEnabled = false。 } else { // 如果获胜,直接调用chessVictory完成后续工作 (/ + chessPeerName + /chess + chessPoint_a + + chessPoint_b + + color)。 (chesspoint_black)。 (chessPoint_a * 20 7, chessPoint_b * 20 7, 16, 16)。 chessVictory(1)。 isMouseEnabled = false。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。