




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计说明书基于javaGUI的五子棋游戏的设计与实现基于javaGUI的五子棋游戏的设计与实现 摘要:随着互联网的快速发展,软件开发行业得到了很大的提升。游戏开发作为软件开发的热门选择,更使得游戏与人们的生活息息相关。五子棋游戏作为一种简单而易于上手的游戏,深受广大玩家所喜爱。 本游戏利用java语言去实现开发,实现人人模式、人机模式两种玩法。在人机模式中,实现了简单的人工智能功能,去完成五子棋的博弈。在人人模式中,采用Socket和ServerSocket去实现,在服务器端用集合添加所连接的线程,对多线程进行管理。 通过开发五子棋游戏,能够去研究和推广五子棋游戏,不仅可以使人们修养身心,同时还可以促进不同文化间的交流。有很深的推广意义。关键词:javaGUI;五子棋游戏;人工智能;多线程 全套设计加扣 3346389411或3012250582IGobang Game Based On javaGUIDesign And ImplementationAbstract: With the rapid development of the Internet, the software development industry has been greatly improved. Game development as a popular choice of software development, but also makes the game and peoples lives are closely related. Backgammon game as a simple and easy to use the game, loved by the majority of players.The game uses java language to achieve the development, to achieve everyone model, man-machine mode two games are played. In the man-machine mode, to achieve a simple artificial intelligence function, to complete the game backgammon. In everyone mode, the use of Socket and ServerSocket to achieve, in the server side with the collection to add the thread connected to the multi-threaded management.Through the development of the game, can go to research and promotion of backgammon game, not only can make people cultivate physical and mental, but also can promote the exchange between different cultures. There is a deep promotion significance. KeyWords:javaGUI; Gobang; game; multithreadingII目 录摘要IABSTRACTII目 录III1 绪论11.1 五子棋开发背景11.2 五子棋的国内外研究现状11.3 五子棋开发意义22 五子棋的介绍32.1 五子棋的棋盘与棋子32.2 五子棋的游戏规则32.3 五子棋的棋型介绍43 开发环境与语言53.1 java语言53.2 eclipse工具63.3 windows开发环境74 五子棋的设计与实现84.1 程序结构84.2 五子棋的棋盘与棋子实现84.2.1 棋盘的实现84.2.2 棋子的实现104.3 胜负功能的实现114.4 棋盘按键功能的实现154.4.1 认输功能的实现154.4.2 悔棋功能的实现174.4.3 时间功能的实现194.5 人人模式214.5.1 服务器端的实现234.5.2 客户端的实现244.6 人机模式264.6.1 算法的实现265 游戏测试315.1 测试目的315.2 测试步骤315.5.1 悔棋功能的测试315.5.2 认输功能的测试315.5.3 退出游戏功能的测试325.3 测试结果326 结论33参考文献34致 谢35IV1 绪论1.1 五子棋开发背景随着科学技术的发展,软件开发已经成为当代科技中必不可缺的技术,而游戏开发更是成为软件开发的热门之选,现如今游戏已经越来越多的出现在我们的日常生活中,博弈游戏更是深受人们的喜爱。而五子棋作为一项有趣、益智的游戏,是我们开发智力,调节压力的不二选择。1.2 五子棋的国内外研究现状五子棋最早的原型是黑白棋,它是一种双人的博弈类游戏,叫法比较多,其中有“五格”,“五子连”等。据史料证明,五子棋最早是从中国流传到日本的,当时在日本贵族中比较流行,元禄末期,五子棋才由贵族传到民间中去,这也是五子棋发展的重要过程。直到20世纪初,五子棋才由日本传到了欧洲,在全世界流行起来。五子棋有着诸多比赛,其中五子棋锦标赛已经有许多届比赛,正是由于这些比赛的进行,使得更多的人热爱上了五子棋,在不同的国家,不同的地方对五子棋有同样的热爱,它已然成为了人们情感交流的方式。 五子棋起源于我国,后五子棋由日本传入欧洲后,不断发展。1988年,日本、前苏联、瑞典在瑞典成立了国际连珠联盟。在之后加拿大、丹麦等国后来也加入到其中,于1989年举办了第一届五子棋世界锦标赛,在这次比赛中日本凭借实力得到了比赛第一名,并在之后比赛中中保持了很高的水平,仅仅在第三届世界锦标赛中被爱沙尼亚夺去了冠军。五子棋在世界上各个国家中取得了不俗的地位,人们对它的重视程度不断提高。20世纪初,我国试办了全国性五子棋大赛。在2009年,我国还将五子棋设为全国智力运动会的比赛项目等。我国对于五子棋的比赛进行了比较规范的管理,对五子棋比赛进行大力的提倡,这使得五子棋的玩家人数不断增加,使得五子棋游戏地位不断提高。这说明五子棋在我国已经越来越重要,开发一款五子棋的游戏既能增加对五子棋游戏的热爱,又能使自己得到动手锻炼。1.3 五子棋开发意义 五子棋的规则简单而有趣,是修养身性,提高身心健康的一种娱乐方式,人们喜欢它,不仅简单深奥,而且富含哲理。五子棋的深奥之处在于,不断的学习钻研之后,既能学习到不断变化的攻防技巧,又能体会到阴阳易理的高深哲理。它的由来历史悠久,不仅仅可以起到放松身心的作用,而且还是我们进行文化交流的重要途径之一。 现如今人工智能已经有了很大的发展,出现在了我们生活的方方面面。对人工智能的研究已经越来越重要。五子棋人机博弈的实现,采用了一些算法去实现,应用了人工智能的一些方法。 网络游戏的出现改变了原来单一的模式,使得游戏更加充满丰富性,不再是原来单一的人机对战,这种游戏模式使得玩家数量不断增长。所以我开发的游戏是网络版的人人对战,充分满足玩家的对战模式,使玩家增加游戏的体验性,游戏性。 通过开发五子棋游戏,去理解五子棋中所包含的道理,它能够帮助青少年更好的思考,锻炼青少年的思维能力,提高他们的计算能力。另一方面它能够培养一个人的情操,养成冷静思考,知书达理,温文尔雅的礼仪习惯。提升一个人的品质,从五子棋的不同下子方来锻炼自己,黑方先手锋芒凌厉,白方后手冷静执着。还能够培养一个人的自信心,增强一个人的意志力。2 五子棋的介绍 2.1 五子棋的棋盘与棋子五子棋的棋盘均为方形棋盘,与围棋棋盘相同,正式棋盘大小为15x15,中间有225个交叉点,并且在五子棋盘中心有天元点,在其四周围有星,其中黑棋为先手下棋,所以黑棋有113颗,而白棋则有112颗。棋盘如图2.1所示。棋子为扁圆形,有黑白两色,棋子为硬质,这样不容易被损坏,重量适中,适合于玩家移动。 图2.1 五子棋棋盘2.2 五子棋的游戏规则一:无禁手规则: 游戏开始后黑白双方进行轮流下子,由黑方先手,当棋盘中棋子数量达到三颗时,白方有权提出进行交换下子,黑方可以接受,如果黑方不接受,那么白方有主动权。二:禁手规则 禁手规则适用于黑方,则指有些棋型一旦出现,则判定黑方为输,如三三禁手,四三禁手等,因此白方可以主动逼黑方形成禁手局面,从而获胜。我所设计的五子棋游戏没有考虑禁手行为,是无禁手规则。2.3 五子棋的棋型介绍连: 相同的棋子颜色在一条线上连住。长连: 指有五颗棋子或五颗以上的棋子在一条线上连成一排。五连: 为五子棋获胜棋型,指五颗棋子在一条线上连成一排。成五: 包括五连和长连,指五颗棋子在一条线上形成一排。四: 是指在一条线上,只有四颗棋子相连的棋型。活四: 有两个点可以成五的四。冲四: 只有一个点可以成五的四。死四: 不能成五的四。三: 是指在一条线上只有三颗棋子形成一排的棋型。活三: 再走一子可以形成活四的三。连活三即:相连的活三即为连活三。简称“连三”。跳活三: 在中间有一个位置为空的活三,简称“跳三”。眠三: 再走一子可以形成冲四的三。死三: 不能成五的三。二: 是指在一条线上只有两颗棋子相连成一排的棋型。活二: 再走一着可以形成活三的二。连活二即:在一条线上相连的活二,简称“连二”。跳活二: 在活二中间隔有一个空点的简称“跳二”。眠二: 再走一着可以形成眠三的二。死二: 不能成五的二。先手: 即下子先下者即为先手,一般五子棋有先手优势,所以有禁手规则的存在保证游戏的公平。三三: 在棋盘上只下一子,就可以形成两个活三的。也称“双三”。四四: 在棋盘上只下一子,就可以形成两个活四的。也称“双四”。四三: 在棋盘上只下一子,就可以形成一个活三和活四。 3 开发环境与语言3.1 Java语言 Java语言是由Sun公司于1995年推出的一种跨平台的、适用于分布式计算机环境的纯面向对象的编程语言1。Java语言最大的特点就是封装,继承,多态,它有跨平台,安全,高效的优点。它省去了多重继承、指针等概念,使人们更容易上手,并通过自动垃圾回收机制简化了程序设计者的内存管理工作。大大提高了安全性。Java语言的跨平台特性,决定了它不依赖于计算机操作环境去实现,能够更加方便的使用。Java程序中的多线程使得程序可以并发执行,而且保证了对数据操作的一致性,可以分别完成特定的操作而不需考虑对整体的影响,实现实时交互行为。Java语言之所以能够这么发展这么快,是因为JDK1.2的发布,并且将它分为了J2EE、J2SE、和J2ME三部分,适用于不同的用户群体。得到了市场的强烈反响,这一变化是革命性的,一直沿用至今。在世界上,java语言的成功发展,使它成为了不可或缺的语言,在众多的公司,软件中有很大的比重。在很多领域也有着重要的地位。Java在我国的发展也是势头猛劲,在诸多行业都有它的身影,例如西安电力高等专科学校采用Java技术,开发了交互式电站仿真系统,实现了电站锅炉仿真等技术。Java语言已经在如今是不可替代的语言。 Java语言的主要特点: a). 跨平台性 跨平台的优点就是不需要去关注操作环境的变化,一心实现功能代码即可,现在的公司所使用的计算机种类比较多,计算机的操作环境也比较复杂,为了能够更好地去实现跨平台,就要求它不能够依赖平台去实现。而在Java语言中,java虚拟机的存在解决了这一问题,它去实现代码的解释执行,去解析java程序所生成的字节码文件,帮助使用者去把问题优化,提供一个更加安全,方便的编程环境。 b). 面向对象Java语言是面向对象而言的,所谓的面向对象,即把一个问题看作一个对象去处理,用属性去体现对象的特点,用方法去实现对象的行为,实现对一个对象的封装,保证数据的安全,把代码进行优化,利于整理和优化,同时也可实现代码的复用,在其自身的基础上进行扩展等。 c). 安全性Java语言的编译可以对java语义是否规范等进行检查,以确保不会造成错误,Java语言对数据进行了封装处理,对于其他访问者而言,不能够在对数据进行随意的更改,而是去依靠一个给定的接口依赖给定的方法去访问,这就确保了不会造成数据的随意更改,保证了它的安全等。 d). 多线程Java语言中多线程的存在,让我们不在是单一的访问,而可以通过多线程去实现实时,共同的访问。所谓的多线程,即两个或两个以上的线程能够同时去运行。Java语言的多线程实现可以从继承和实现接口两种方式实现,保证了程序实现的可能,避免了多继承的发生。 e). 简单易用Java语言的使用简单,编程风格多样,Java可以使用记事本,也可以使用eclipse编写。这就使得我们可以更快的运用java去实现编程。而不需要去提供更多的工具来进行Java语言的编写,运行。javaGUI:AWT提供了建立窗口操作应用程序所必需的最少功能,从Java1.0开始,AWT就是GUI程序开发的主要技术。1997年,Sun公司用Java Foundation Classes(JFC)替代AWT,JFC主要由AWT,Swing和Java2D组成。可以开发界面更加丰富多彩的GUI程序。3.2 Eclipse工具 Eclipse是一个非常优秀的,功能强大的集成开发环境2。Eclipse可以添加不同工具的插件,使得程序去实现更多,更复杂的功能。它是可扩展的编程工具。 Eclipse框架的灵活性来自于它的扩展点。可以去实现一个字符串,到一个类编写,描述。Eclipse的使用方便简洁,有良好的界面,而且可以更改字体,背景等,定制个人的编程风格。Eclipse可以使我们在运行时,免去一些基本代码的书写,可以一键生成,这就大大加快了我们编程的速度,提高了效率。3.3 Windows开发环境Microsoft Windows是美国微软公司所研发的操作系统,迄今为止的使用者已经不计其数,占据了大部分电脑市场,其中windows95,windows98的操作系统的发布,更是有着非常重要的里程碑意义,它改良了硬件标准的支持。Windows98在windows中整合了IE浏览器的技术,让用户的使用更加方便,速度也更加的快,这也是Windows98的最大的特点。我开发所使用的是windows7的开发环境,windows7有着特别多的优点。更加简单:Windows7界面简洁,操作简单,对使用者而言,更加方便,同时它对信息的获取也更加快捷。更好的连接:Windows 7能够更加方便地去实现连接,它使得移动连接更加方便,不用再去考虑时间,地点,性能有更大的提升,硬件得到更大的优化,扩展更多的功能。更低的成本:Windows 7通过对硬件和软件进行简化,保证了使用者的需求的同时,做到了简化成本,提供专业的手段帮助使用者运行,简化了操作的繁琐,提供专业的环境来帮助企业去使用。4 五子棋的设计与实现4.1 程序结构 本程序结构如图4.1所示。 新游戏 人机模式(单机) 人人模式(网络) 开始游戏 悔棋 退出游戏 选择认输 结束图4.1 五子棋结构流程图4.2 五子棋的棋盘与棋子实现4.2.1 棋盘的实现棋盘是游戏的基础,所有功能都是在棋盘类的基础上实现的,是用户操作的主要界面。包括悔棋,选择模式等。通过调用paint方法,去实现画棋盘。这里采用的是双缓冲技术,以往的paint方法中,当调用repaint方法时,会先去调用父类的paint方法,这时会清除组件,用背景色填充窗体,再调用重写的paint方法,这时就会造成闪烁。而采用缓冲技术,会在内存中现分配一个缓冲区,去缓冲所画的图案,最后一次性出现,就不会造成闪烁的出现。棋盘类如下:/ 初始化棋盘public void paint(Graphics g) ImageIcon im = new ImageIcon(src/bg/bg.jpg);Image image = im.getImage();BufferedImage bi = new BufferedImage(440, 440, BufferedImage.TYPE_INT_RGB);Graphics gi = bi.createGraphics();gi.drawImage(image, 0, 0, this);/ 画棋盘for (int row = 0; row 15; row+) gi.setColor(Color.black);gi.drawLine(10, 30 * row+10, 430, 30 * row+10);for (int line = 0; line 15; line+) gi.drawLine(30 * line+10, 10, 30 * line+10, 430);/ 绘制天元点gi.fillOval(97, 97, 6, 6);gi.fillOval(337, 97, 6, 6);gi.fillOval(97, 337, 6, 6);gi.fillOval(337, 337, 6, 6);gi.fillOval(217, 217, 6, 6);4.2.2 棋子的实现 棋子的实现是游戏进行的重要保证,棋子的实现是通过paint方法绘制的,在棋盘上画出两个圆形,黑子用黑色填充,白子用白色填充,轮廓用黑色画出,从而实现棋子的模型。通过对棋子进行赋值,确定棋子的颜色,当棋盘上位置为空时,设置为0;当棋盘上位置为1时,设置为黑子;当棋盘上位置为2时设置为白子。通过玩家对棋盘位置的点击,从而对该位置赋值,每次点击均调repaint方法,实现重绘,完成玩家的走子。如图4.2所示,具体实现:/棋子的实现for (int i = 0; i 15; i+) for (int j = 0; j 15; j+) if (chessij = 1) gi.setColor(Color.BLACK);/ 棋子大小为20gi.fillOval(i * 30 , j * 30, 20, 20);if (chessij = 2) gi.setColor(Color.white);gi.fillOval(i * 30 , j * 30 , 20, 20);gi.setColor(Color.BLACK);gi.drawOval(i * 30 , j * 30 , 20, 20);super.paint(g);g.drawImage(bi, 0, 50, this); 图4.2 五子棋的棋盘与棋子4.3 胜负功能的实现 五子棋游戏的最终目的是要实现玩家的获胜,如何判断玩家是否获胜就显得尤为重要,当棋子在棋盘上水平,垂直或斜向上构成连续五子后即判断该玩家获胜。当玩家下子后,对该位置进行赋值,若为黑子,则为1;若为白子,则为2.每次下子后,均判断该位置是否获胜。从下子的位置向8个方向判断,若连子数达到五个,则判断该玩家获胜。若棋盘上所有棋子均占满棋盘,这时依然没有棋子获胜,那么判断为和局,双方都未获胜,重新开局。如图4.3所示,该功能的具体实现:/ 判断是否获胜public boolean isWin(int x, int y, int PieceColor) int count = 1;/ 横向for (int i = 1; i = 0) if (chessx - iy = PieceColor) count+; else break;for (int i = 1; i 5; i+) if (x + i = 5) return true; else count = 1;/ 纵向for (int i = 1; i = 0) if (chessxy - i = PieceColor) count+; else break;for (int i = 1; i 5; i+) if (y + i = 5) return true; else count = 1;/ 斜向for (int i = 1; i = 0 & y + i = 14) if (chessx - iy + i = PieceColor) count+; else break;for (int i = 1; i 5; i+) if (x + i = 0) if (chessx + iy - i = PieceColor) count+; else break;if (count = 5) return true; else count = 1;/ 反斜向for (int i = 1; i = 0 & y - i = 0) if (chessx - iy - i = PieceColor) count+; else break;for (int i = 1; i 5; i+) if (x + i = 14 & y + i = 5) return true; else count = 1;return false; 图4.3 五子棋胜负结果图4.4 棋盘按键功能的实现4.4.1 认输功能的实现五子棋游戏中,需要实现的一个功能就是认输功能。玩家进行游戏时,若发现己方获胜已经不可能,那么这时我们可以通过认输来完成游戏的对决。另一方面若玩家因为某些原因需要离开时,也可以通过认输去结束游戏。所以认输功能的实现也很重要。通过在面板中设置认输按钮,当玩家点击认输按钮时,由线程去发送一个信息,经服务器接受转发给另一个玩家,判断出一方选择认输,而另一方获胜,并重置两个玩家的棋盘。如图4.5所示,该功能的实现如下:giveUp.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) int i =JOptionPane.showConfirmDialog(panel, 你要选择认输吗?,2);if(i=0)if(writer!=null)/发送标志码22-22-22给对方玩家 即为认输writer.println(22-22-22);writer.flush();JOptionPane.showMessageDialog(panel, 你败了!再来一局吧);restart=false;reset();/重置时间 面板isStart=false;button(true,false,false, false);if(t1!=null&t2!=null)t1.suspend();t2.suspend();time1.setText(黑子玩家:+00:00:00); time2.setText(白子玩家:+00:00:00);); 图4.5 五子棋认输提示图 图4.6 五子棋认输结果图4.4.2 悔棋功能的实现 五子棋的悔棋实现是五子棋的一个重要功能,当玩家进行游戏时,难免会出现决策失误,从而影响游戏的体验。也会出现玩家点击位置出错等问题,为了更好的解决这个问题,所以需要去实现悔棋功能。当玩家下子后,发现走法错误这时可以点击悔棋按钮,去悔棋,如图4.7所示。但是这些错误由于是自己造成的,因此悔棋需要对方玩家的同意才可以。在程序中当点击悔棋按钮后,由线程去发送信息给服务器,并转接给对方玩家,这时对方玩家可以选择同意或拒绝,然后再返回给玩家,从而实现悔棋功能。如图4.8所示,该功能实现如下:regret.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) if(num()=false)JOptionPane.showMessageDialog(panel, 您还没有下子);elseif(isPc)JOptionPane.showMessageDialog(panel, 电脑已下子!);if(isPerson)if(isRegret)JOptionPane.showMessageDialog(panel, 正在请求对方同意。);if(writer!=null)/发送标志码19-19-19给对方玩家 发送悔棋请求writer.println(19-19-+order);writer.flush();elseJOptionPane.showMessageDialog(panel, 不能悔棋!);); 图4.7 五子棋悔棋提示图 图4.8 五子棋接受悔棋提示图4.4.3 时间功能的实现在五子棋的人人对战中加入了时间限制,时间设置为10分钟,当游戏开始后黑子方时间同时开始计时,黑方下子后,白方时间开始计时,黑方停止,反之。双方轮流交替。如果时间到达10分钟后,没有一方获胜,那么率先到达10分钟者则判断为失败。时间计时采用的是线程控制,通过在面板标签上显示,来达到时间的计时。当游戏开始后,启动两个线程,白方暂时线程停止,而后交替启动,停止。当达到时间限制后,判断输赢,而后重置棋盘,重新进行开局。如图4.9所示,该功能的实现如下:public class Time extends Thread /判断时间是否到达if(i=1)Chessboard.time1.setText(黑子玩家: + m1 + + h + : + m2 + m + : + m3 + s);if(Chessboard.limit=m2*10)config(黑子);isRun=false;elseChessboard.time2.setText(白子玩家: + m1 + + h + : + m2 + m + : + m3 + s);if(Chessboard.limit=m2*10)config(白子);isRun=false;/时间到达后重置面板public void config(String str)JOptionPane.showMessageDialog(Chessboard.panel, 时间到,+str+输了!);Chessboard.button(true, false, false, false);Chessboard.time1.setText(黑子玩家:+00:00:00);Chessboard.time2.setText(白子玩家:+00:00:00);Chessboard.isStart=false;Chessboard.restart=false; 图 4.9 五子棋时间显示图4.5 人人模式 人人对战是通过网络对战来实现的,主要应用的是Socket,ServerSocket去实现。 服务器端需要指定端口号,来等待客户端的连接。当客户端未连接时,在服务器端则处于等待,当客户端连接时,则去生成一个Socket去实现连接,并加入到集合中去,对客户端进行管理。 客户端指定端口号和服务器端的ip地址,运行后去主动连接服务器端,向服务器端发出请求,当服务器端收到请求后,在服务器端去启动一个线程去实现与客户端的通信,当客户端失去连接或退出时,服务器端从集合中删除该客户端。 Socket中tcp的三次握手连接如图4.10所示: 客户端 服务器端Accept(阻塞)Connect(主动打开) SYN J SYN K,ACK J+1Accept(返回)Connect(返回) ACK K+1 图4.10 tcp三次握手示意图 客户端去主动进行连接,发送SYN J包给服务器端,当服务器端收到所发信息后,会发送SYN K包给客户端,这时客户端收到确认,同时把ACK K1发送给服务器端,完成三次握手连接。Socket的4次握手释放连接如图4.11所示: 服务器端 客户端 FIN M ACK M+1 Close(主动)被动关闭 FIN NClose(主动) ACK N+1 图4.11 tcp四次释放示意图客户端去发送FIN M包,然后主动关闭,服务器端收到FIN M包之后,去执行被动的关闭,并对这个FIN进行确认,同时结束对应用进程的连接。 客户端确认后去关闭它的socket。并向服务器端发送一个ACK N1包,接收到这个FIN的源发送端TCP对它进行确认。4.5.1 服务器端的实现 通过ServerSocket去创建一个服务器端,指定它的端口号,调用accpet方法去不断的接受客户端,即Socket端。通过线程的缓冲流实现信息的交互。五子棋游戏需要有两名玩家才可以实现对战,当我们接收到客户端后建立一个集合去进行管理客户端,当玩家人数达到两名后,即可开始游戏。当玩家进行游戏时,有更多的玩家加入进来,这时对他们进行分开管理,分别加入不同的集合中去,不会发生多人游戏错乱,游戏异常等行为。当服务器端出现异常后,向客户端发送信息,客户端重置棋盘。如图4.12所示,服务器端的实现如下:public void run()try server = new ServerSocket(8888); catch (IOException e1) System.out.println(服务器错误!);System.exit(0);while(true)try socket = server.accept();if(socket!=null)area.append(ip:+socket.getInetAddress()+ port:+socket.getPort()+已连接!+tn);if(i%2=0)i+;l = new ArrayList();c = new Client(socket, true,l,true);l.add(c);c.start();c=null;elsei+;c = new Client(socket, true,l,false);l.add(c);c.start();c=null; catch (IOException e) e.printStackTrace(); 图4.12 服务器端连接图4.5.2 客户端的实现客户端用来将棋盘的信息发送给服务器端,用线程去实现信息的交互,棋盘上所有的操作都需要线程的缓冲流去提交给服务器端。通过使用Socket套接字,去指定ip地址,端口号,从而实现和客户端的连接。当玩家下子,悔棋,认输等功能实现时,客户端线程发送不同的信息给服务器端,由服务器端转发给对方的客户端,通过对信息的接受和判断,完成游戏的进行。客户端的实现:class Client extends Thread String position; Socket socket; boolean isConnect=true; public Client() try socket = new Socket(127.0.0.1, 8888);read = new BufferedReader(new InputStreamReader(socket.getInputStream();writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(); catch (IOException e) JOptionPane.showMessageDialog(panel, 服务器未启动!); public void run()try while(isConnect)send();recive(); catch (Exception e) System.out.println();4.6 人机模式 去实现人机博弈,完成电脑与玩家的对战,在电脑与人对战时,我们需要解决的是电脑如何去选择下子,如何从棋局中找到更好的走法,这里我所采用的是对棋局进行评分,从而去对所有位置进行选择。对棋局所采用的评分是参照山东师范大学董红安在2005年的硕士毕业论文中的所采用的评分表。4.6.1 算法的实现评分表如下:成五 评分为50000活四 评分为4320活三 评分为720死四 评分为720活二 评分为120一子 评分为20当计算机实现博弈功能时,首先判断当前棋局,从棋盘中找到位置为空的点,即值为0的点,依次判断该点位置周围的八个方向,采用数组形式返回该点位置下棋后的棋型,从评分表中得出分数,然后综合所有方向上的分值,从而得出该点位置的分值,遍历棋盘中所有空的位置,从中选出分值最大的点,即为电脑所下子的位置。判断下子位置时,需要去考虑当前位置若为对手所下时,该点的分值是否大于自己所选位置的分值,如果大于,那么我们需要先去阻挠对手获得成功,先走对手所下位置分值最大的点,从而来让自己获胜。游戏中所设计的有两种难度,简单难度和困难难度。简单难度只考虑当前位置黑子的分值,即电脑只会一味的去堵玩家所下子的位置。而困难难度电脑不仅需要考虑玩家的位置分值,也需要考虑自己的分值,从而实现真正的博弈。我所实现的五子棋智能程度不高,因为自己能力有限未能实现更加智能的算法,希望以后可以去实现智能程度更高的五子棋游戏。五子棋游戏要想更加的富有难度,那么需要我们实现电脑下子时,能够往前想几步,这在人机博弈时可以大大加深电脑的智能程度。在博弈游戏中,下棋时双方总是选择对自己有利的局面去进行,对于一方来说,他的选择之间是“或”的关系,而对方的选择是“与”得关系,彼此之间交替进行就会形成一棵博弈树。在博弈树中,极大极小值算法很重要,它以一方去实现择优,对棋盘局面实现估值函数,对己方来说,我们要去选择最有利的位置,而对对方来说,也会选择最有利的位置。对于“或”节点,选其子节点中一个最大的分值作为父节点的分值;对于“与”节点,选其子节点中最小的分值作为父节点的分值3。从而实现博弈选择。五子棋中节点众多,例如象棋来说,大约有10的150次方个节点。因此我们要去有选择性的实现。-剪枝算法,即可以实现博弈功能,减少时间浪费,加快电脑的运算速率。 我的实现如下所示:public int value(int color,int a,int b) int chess = new int11; int va
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司画册怎样策划方案
- 公司新闻播放策划方案
- 公司百家宴活动策划方案
- 公司组织敬老院活动方案
- 2025年移动通信工程师考试试题及答案
- 2025年信息检索与知识管理考试题及答案
- 2025年生物技术相关领域资格考试试卷及答案
- 2025年软装设计师职业考试试题及答案
- 2025年青年志愿者能力测试试卷及答案
- 小学班主任工作计划总结
- GB/T 14450-2016胎圈用钢丝
- 牛生产-繁育课件
- 国家开放大学电大《计算机网络》试题
- 国际标准行业分类第4版 ISICRev
- 计算机行业:信创产业鲲鹏凌云信创提速
- 工程建设标准强制性条文房屋建筑部分(2013年版)完整版
- 装配式钢筋混凝土简支T梁桥计算(G-M法)
- 《苏东坡传》精美(课堂PPT)
- 化学计量学基础
- ISO13485内审检查表
- 人教版二年级语文下册同音字汇总(共9页)
评论
0/150
提交评论