已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录摘 要1关键词:1abstract1key words:1第一章:绪论21.1 前 言2第二章 五子棋的相关基础22.1五子棋解释22.2五子棋基本规则32.3五子棋常用术语3第三章 开发工具、环境及其技术53.1 java简介53.2 java 编程环境:7第四章 程序具体研究方法74.1程序设计思路74.2程序设计94.3程序的运行结果17结 语18参考文献19致 谢19摘 要五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为socket编程应用,客户端和服务器端的交互用class message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑ai方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。关键词: 深度搜索;估值;电脑ai;五子棋;算法abstractas a sport, gobang is very popular in civil, in order to become familiar with gobang rules and techniques, and the study of simple artificial intelligence, i decide to use the java to develope gobang games and complete the two functions including man-machine war and man-man war. network connection is socket programming for some applications, client and server interaction is definited by class message, which is a very good scalability, client interface is responsible for the collection and maintenance of user input information, and error handling. server users maintain online basic information and arbitrary two-time users of the chessboard of information, dynamic maintenance user list. during the man-machine players, it improves intelligence of the computer players through depth search and valuation module. analyzes module valuation of the precise elements, as well as a number of increased precision, and compares their search for nodes, which raises some computer ai programs on the basis of analysis, such as recursive algorithm, computer learning. algorithm of procedures contribute to the understanding of the structure, logical thinking ability, in other areas of artificial intelligence has great references. key words: search depth; valuation; computer ai; gobang ; algorithm第一章:绪论1.1 前 言电脑已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。java语言作为一种面向对象的编程语言,具有分布式,可移植,高性能,多线程等特点。通过系统的学习,人们就可以使用它开发出功能齐全,满足特殊需求的应用程序。java语言易学易用,对学习者掌握技能,开拓思维都有很大的帮助。 我作为一名学生,在系统的学习了java语言之后,经常用它搞一些小程序。这次毕业设计,正好将学过的java语言中的各种技术综合起来,用jbuilder2006开发工具编写一个小游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复习巩固。随着计算机技术的不断发展,网络技术的普及范围越来越广,网络能够提供的服务多样、便捷,已经成为人们生产生活中不可缺少的重要组成部分。如今网络休闲游戏发展迅速,它凭借健康、方便、互动性强、益智等诸多优点,成为大部分现代人休闲娱乐的首选。网络五子棋游戏是使用java语言开发的一款游戏。它使用socket建立连接,多线程处理数据,以及可嵌入网络浏览器的alet作为客户端,这些特点使这款游戏无论是服务器还是客户端的实现都相对容易。通过对该软件的编写,还可以巩固我们对以上各种知识的掌握和理解。第二章 五子棋的相关基础2.1五子棋解释引用辞海中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜。”。五子棋的名称:日文亦有“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”等多种称谓,英文则称之为fir (five in a row的缩写)、gomoku(日语“五目”的罗马拼音)、gobang、connect 5、mo-rphion。捷克语piskvorky,韩语omok、韩国人还称之为情侣棋2.2五子棋基本规则 1.五子棋行棋时,黑棋先下第一子,由天元开始,后白棋在黑棋周围的交叉点的落子。接着黑方再以天元中心的25个交叉点的范围内落盘面的第三子,之后黑白双方相互顺序子。 2.最先在棋盘线交点横向,纵向,斜向形成已方的五个棋子连续的一方为胜。 3.出现禁手对方指出后将判负,其中包括两个或两个以上的活三,活四,长连均称之为禁手。 4.禁手只对黑棋有效,白棋无禁手。 5.黑方禁手形成时,白方需立即指出,黑方将被判负。若白方未发现黑方禁手存在而继续应子,其后指出黑方禁手不能判黑方负。 6.黑方连五与禁手同时形成,因黑方已连成五即黑方已获胜,故禁手规则失效。 7.在对局中,在盘上落下的子又拿起来,此动作称为拔子,若拔子将被判为负。 8.在对局中棋子掉落在棋盘上将被判负。若推子或蹭子,以盘面第一落点为准。用手将棋子推正不算违犯规则。 9.在对局中,一方自行中止比赛如:中途退场,将被判负。 10.在对局中对方宣布认输,本局获胜。 11.超过比赛规定所用时间限制,将被判为负:正式比赛期间,迟到时间超过比赛容许时间将被判负。 12.如下至最终一子仍不分胜负则定为平局。 13.中盘期间双方 同意和局提议,判定为平局。2.3五子棋常用术语1.着:也称“步”。对局中把一个棋子按照规则放到某一交叉点,称之为一着棋。一着是否完成有两种规则: (1)在执行落子无悔规则是,以行棋者的手离开棋子为一着已完成。 (2)在执行限时规则时,以行棋者按下棋钟作为一着已完成。 2.pass :五子棋中引入的英文名称,即应该行棋的一方主动放弃此次行棋的机会,由对方继续行棋。 3.先手:对方必须应答的着法,如对方形成活三必须阻止其形成活四。 4.绝对先手:相对先手而言,即形成同色连四或嵌五,对方必须应着,就是绝对先手。绝对先手又叫“冲”。 5.vcf:(victory of continus four 的缩写) 意思是利用连续冲四取胜之意。利用连续不断的冲四或嵌五的绝对先手,制止形成连五获得胜利的一种方法。在对局接近尾声或排局解题中一种常见的取胜技巧。 6.追下取胜:是指白棋利用黑棋禁手取胜的战术。白1 冲四,迫使黑2 形成“四、四”禁手( 即冲四,活四禁手), 这种取胜方法叫做追下取胜。 7.自由取胜:追下取胜以外的取胜方法,即未利用黑棋禁手战术而取胜。 8.一子双杀:是指对局中一方落子后出现两个叫杀点即两个获胜点,而使对方无法防守的情形。一般是有两个冲四活三点,白棋的双活三,双四均可称为一子双杀。 9.阳线:棋盘上可见的横线与直线的总称。 10. 阴线:也称“斜线”。是棋盘上不可见的斜行线。 11. “四、三”:指同时具备两个先手,其中一个四,另一个是活三。 12. “活三”、“嵌五”、“冲四”:参见五子棋重要棋形讲座。 13. 禁手:对局中禁止使用的战术或被判为负的行棋手段。 14. 开局:也称“布局”。布局阶段大体为七至十几着之内。种类繁多,职业连珠五子棋有二十四种开局。 15. 局面:亦称“局势”。为对局中某一段时间内双方子力的配置情况。 16. 优势:是指足以取胜的优势局面,其对方即为败势。 17. 妙着:对局中走出的一步精妙的着法。既合乎逻辑又出人意料,有使局面顿时改观的效果,对局势的发展及对局的质量都有重大影响。 18. 好着:也称“佳着”。对局中成功的某一步。 19. 正着:对局的某一局面中的正确着法。 20. 劣着:对局中,导致严重不利后果的一步错误着法。 21. 败着:也称“失着”“漏着”。对局中造成局面恶化的一步严重错误着法。 22. 等着:对局中具有等待性的一步着法,主要意图是等待有利时机。 23. 废着:也称“空着”。对局中不起作用的着法。实际上指浪费时间毫无疑义的错着。 24. 抢先:对局中利用反活三或冲四的强制手段夺取主动权的着法。 25. 打谱:按照棋谱演练着法,是提高棋艺水平的重要方法之一。 26. 复局:也叫“复着”。对局结束又重演对局的过程。一般用以研究、比较双方的成败得失和着法的优劣。第三章 开发工具、环境及其技术3.1 java简介java技术介绍:java技术是一门编程语言,也是一个平台,它基于java虚拟机技术,借助这个东西建立了跨平台的优势。(题外话:java热门的原因之一就是一个跨平台的概念,和跨平台类似跨浏览器的好处也是如此,这也是现在ajax技术流行的原因之一。另外现在热炒的ria富客户端的概念下的技术除了ajax外还有adobe的flash/flex,微软的silver light,sun的javafx等,个人更看好flash/flex,原因是flash插件在浏览器端占用率很高)java技术的重要性就不讲了,从最近流行的一个统计数据上来说,目前世界上编程语言java 、c 、vb、c+依次排名前4位,这排名本身不说明什么,至少也是工业界对编程语言使用上一个侧面的反映吧。java编程语言与众不同之处在于:java程序既是编译型的(转换为一种称为java字节码的中间语言),又是解释型的(jvm 对字节码进行解析和运行)。编译只进行一次,而解释在每次运行程序时都会进行。编译后的字节码采用一种针对jvm 优化过的机器码形式;解释器是jvm 的实现。这段是摘自网上的,编译原理学的不是很好,对这门语言的背后运行机制理解到这样了。java平台是一种纯软件平台,它有三个版本java se、javaee、java me。java se(java platform,standard edition)这个版本以前叫做j2se,后来版本号从1.4直接跳到5.0,其实也就是1.5,所以就叫成java se 5.0。目前java开发人员使用较多的版本是5.0,当然还有java se 6.0这个更新的版本。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的java 应用程序。java se还包含了支持java web服务开发的类,并为java ee这个版本提供基础。虽说桌面应用程序,java一直不被看好,但也稍微提一下,负责桌面gui开发的类库我知道的有:jdk自带的主要是awt/swing这个java原生类库;也可以使用ibm的swt/jface这个第三方类库。开发工具我了解的有:netbeans(最近已经是6.0final版了,做gui有使用vb的感觉),eclipse(swt/jface这个项目其实就是做eclipse项目时扩展出来的,所以对swt/jface支持的也不错)。java ee(java platform,enterprise edition)这个版本以前叫做j2ee,也就是大家可能听得比较多的,也是java比较流行的领域,java的企业级版本。java ee下有很多流行的开发框架,像struts、spring、hibernate这种流行的所谓ssh组合等。根据项目大小、应用领域,技术平台的选择面还是很多的,除了java ee,还有.net,lamp组合(linux、apatch、mysql、php组合),相对来说比较新ruby在ruby on rails的框架应用,后两者可能在相对来说比较轻量级的web领域运用成功案例比较多,更重量的企业级潜力还有待挖掘。java me(java platform,micro edition)这个版本以前叫做j2me。应用领域像各种移动设备和嵌入式设备,比如:手机、pda、电视机顶盒和打印机。java me不是太熟悉,不过移动设备和嵌入式设备的开发个人觉得算是比较有意思的领域,最近比较瞩目的业界新闻有一个就是google发布开源智能手机操作系统开发平台android,也就是前一阵子炒得很火的gphone(原来google出的不是手机,而是一个手机操作系统开发平台)。这个平台貌似会对java me有些冲击,按照网上的消息,android包括:1、高度定制的linux操作系统内核及智能手机硬件驱动支持;2、经过google修改过的java虚拟机dalvik,这里的性能比sun的hotspot高,支持大部分java核心类库;3、大量智能手机开发核心类库;4、大量现成的智能手机应用软件;5、基于eclipse的开发环境。也是按照网上的说法,java ee提供了统一的编程平台,但不能调用操作系统的资源;而android下直达操作系统,上直达应用软件,如:浏览器、日历、地图等。java开发工具很多,个人使用的ide有eclipse和netbeans。eclispe比较流行,各种插件也多,当然用起来也不错;netbeans现在也是越做越好了,介绍这两个ide主要是开源的,当然还有其它工具如jbuilder、intellij、jcreator。这些ide各有优势劣势,根据你开发的项目来选择了。3.2 java 编程环境:3.2.1 环境变量(1) java(tm) se development kits,即jdk (2)设置环境变量 右击 我的电脑-属性-高级-环境变量 path:系统在任何路径下都可以识别java命令需要设置的变量 path: ;c:progran filesjavajdk1.6.0_01bin classpath:为java加载类(包括class,lib)的路径,只有类在classpath中, java命令才能识别 classpath: .;progran filesjavajdk1.6.0_01libdt.jar ;progran filesjavajdk1.6.0_01libtools.jar java_home:java的安装路径 java_home: progran filesjavajdk1.6.0_013.2.2 eclipse插件 (1) xmlbuddy:编辑xml文件;下载地址为 (2) fat jar:打包插件,可以方便的完成各种打包任务,可以包含外部的包等; (3) log4e:log4j插件,提供各种与log4j相关的任务,log4j专用于为程序输入调试信息 (4) lomboz:ecilpse的一个j2ee的插件,可以将很多java应用服务器,j2ee组件和 web应用开发集成到eclipse中,可以帮助java开发者使用eclipse建立,测试和 部署j2ee应用。支持jsp编写,包括语法着色和语法检查: (5) myeclipse:j2ee开发插件,支持jsp,ejb,数据库操作; (6) tomcatplugin:支持tomcat插件; 第四章 程序具体研究方法4.1程序设计思路4.1.1程序设计思想1.本程序要实现五子棋的游戏功能,必须先有一个棋盘,所以,通过继承jpanel,然后在jpanel上画出一个18*18的棋盘,另外还有三个按钮:重新开局、请黑方下子和请白方下子,提醒用户进行相应的操作。当然,jpanel必须放在jframe中,所以,又通过继承jframe得到一个实例;2.对于下棋的操作,通过对jpanel增加鼠标事件监听器mouselistener,每次当用户点击鼠标时,先取得点击的坐标值,然后取整得到一个对应棋盘的最近的一个坐标值;3.判断该坐标是否在棋盘之外,如果不是,记录下该坐标值以进行下一步操作。4.判断该位置是否已有棋子,没有的话用类graphics2d画出棋子,并记录下棋盘的状态;5.判断该颜色棋子的上下左右是否满足连续五个,是的话提醒相应玩家获胜,不是的话,更换玩家,监听事件处理结束。6.对于玩家的更换是程序自动的,每次用户点击鼠标后,都会变换玩家,从而画出对应黑方白方的棋子供玩家查看。4.1.2程序设计分析1. 键盘上事先设定8个按键,分作两组,每组四个,分别代表两个人用来控制棋子的上下左右键。2. 绘制棋盘,15条横线,15条竖线,在直线交点处下棋子(实心圆形)。3. 黑子先行,黑白交替下子,在棋盘上设定一个与棋盘格大小边长相等的正方形,初始状态,正方形的中心位于期盼的中心点。当一方欲走棋的时候,应用四个按键来控制所要下棋的位置,每按一次按键,正方形都要向相应方向移动一个格,并且让喇叭发出某种声音,将要移出边界时,发出另一种警告声音并不让其移出边界。当按下回车键时,应在正方形所在位置放下一个棋子,然后此组按键不能操作,换另一个人下棋,用另一组按键,规则同前。4. 当任何一方有五个棋子沿着横,竖,斜连在一起时,系统自动判断赢棋,并显示黑方或白方胜利。棋局结束后,任何一方均不能继续操作。5.程序流程如下图4-1:图4-1程序流程图4.2 程序设计import java.awt.color;import java.awt.dimension;import java.awt.graphics;import java.awt.graphics2d;import java.awt.headlessexception;import java.awt.point;import java.awt.toolkit;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.keyevent;import java.awt.event.keylistener;import java.awt.event.mouseevent;import java.awt.event.mouselistener;import javax.swing.*;public class chessgame public static void main(string args) gameframe gframe = new gameframe();gframe.setdefaultcloseoperation(jframe.exit_on_close);gframe.setvisible(true);class gameframe extends jframe private static final int width = 430;private static final int height = 470;gameframe() settitle(五子棋游戏);centeredframe();setsize(width, height);gamepanel gpanel = new gamepanel();add(gpanel);void centeredframe() toolkit kit = toolkit.getdefaulttoolkit();dimension screensize = kit.getscreensize();int screenheight = screensize.height;int screenwidth = screensize.width;int xposition = (screenwidth - width) / 2;int yposition = (screenheight - height) / 2;setlocation(xposition, yposition);class gamepanel extends jpanel private point cursor = new point(40, 60); / 棋盘坐标private int chessstate = new int1818;/ 棋盘状态private int i = 0;/ 横坐标private int j = 0;/ 纵坐标private final static int testnum = 5;/ 五子棋的规定棋子数private player black = new player(1, color.black, 黑方);/ 黑方棋子private player white = new player(2, color.white, 白方);/ 白方棋子private player cplayer = null;/ 当前用户的引用private jtextfield textblack = new jtextfield(, 5);/ 黑方文本提示框对象和文本长度设置private jtextfield textwhite = new jtextfield(, 5);/ 白方文本提示框对象和文本长度设置private string nothing = ;private string textblack = 请黑方下子;/ 黑方提示文本private string textwhite = 请白方下子;/ 白方提示文本gamepanel() setlayout(null);initialization();setfocusable(true);jbutton rutton = new jbutton(重新开局);rutton.setbounds(20, 14, 100, 26);restartlistener restart = new restartlistener();rutton.addactionlistener(restart);add(rutton);textblack.sethorizontalalignment(jtextfield.center);textblack.setbounds(150, 14, 110, 26);textblack.seteditable(false);add(textblack);textwhite.sethorizontalalignment(jtextfield.center);textwhite.setbounds(290, 14, 110, 26);textwhite.seteditable(false);add(textwhite);chessmanmouselistener mlistener = new chessmanmouselistener();addmouselistener(mlistener);/ 设置第一个jtextfield输出请黑方下棋,坐标为(40,60)void initialization() for (int i = 0, j; i 18; i+)for (j = 0; j 18; j+) chessstateij = 0;cursor.setlocation(40, 60);cplayer = black;textblack.settext(textblack);textwhite.settext(nothing);/ 画棋盘和初始化棋局状态protected void paintcomponent(graphics g) super.paintcomponent(g);graphics2d g2 = (graphics2d) g;for (int i = 60; i = 400; i += 20) g2.drawline(40, i, 380, i);for (int j = 40; j = 380; j += 20) g2.drawline(j, 60, j, 400);for (i = 0; i 18; i+)for (j = 0; j 18; j+) if (chessstateij != 0) if (chessstateij = 1) g2.setpaint(black.getplayerchessmancolor();if (chessstateij = 2) g2.setpaint(white.getplayerchessmancolor();g2.filloval(j * 20 + 40 - 10, i * 20 + 60 - 10,chessman.getchessmansize(), chessman.getchessmansize();/ 判断棋盘的当前位置是否已有棋子boolean ischessstate() this.j = (cursor.x - 40) / 20;this.i = (cursor.y - 60) / 20;if (chessstatethis.ithis.j != 0)return true;elsereturn false;/ 记录落子后棋盘的当前位置的状态void recordchessstate() this.j = (cursor.x - 40) / 20;this.i = (cursor.y - 60) / 20;chessstatethis.ithis.j = cplayer.getcurrentidentify();/ 判断当前玩家落子后是否赢了void judgewin() for (int i = 0; i 4; i+)if (judgewinline(i) / 提示当前玩家已经获得胜利try string ginformation = gameinformation;string message = 恭喜玩家 + cplayer.getsidentify()+ 获胜! + n + 继续游戏还是退出游戏?;string options = 继续, 退出 ;int selection = joptionpane.showoptiondialog(null,message, ginformation,joptionpane.yes_no_option,joptionpane.information_message, null, options,options0);/ throws headlessexceptionif (selection = joptionpane.ok_option) initialization();repaint();return;if (selection = joptionpane.no_option) system.exit(0);/ 退出程序 catch (headlessexception e) e.printstacktrace();/ 如果当前方没有赢棋则双方轮换changecurrentplayer();/ 在当前方向上是否有连续的五只棋子boolean judgewinline(int direction) int i, j, di, dj, count;i = j = di = dj = count = 0;switch (direction) case 0:j = this.j - (testnum - 1);i = this.i;dj = 1;di = 0;break;case 1:j = this.j;i = this.i - (testnum - 1);dj = 0;di = 1;break;case 2:j = this.j - (testnum - 1);i = this.i + (testnum - 1);dj = 1;di = -1;break;case 3:j = this.j - (testnum - 1);i = this.i - (testnum - 1);dj = 1;di = 1;break;for (int k = 0; k = 0 & j = 0 & i = testnum)return true; elsecount = 0;j += dj;i += di;return false;/ 更换当前玩家void changecurrentplayer() if (cplayer = black) cplayer = white;textblack.settext(nothing);textwhite.settext(textwhite); else cplayer = black;textblack.settext(textblack);textwhite.settext(nothing);/ 重新开局监听器private class restartlistener implements actionlistener public void actionperformed(actionevent arg0) initialization();repaint();requestfocus();private class chessmanmouselistener implements mouselistener public void mouseclicked(mouseevent event) int x = (int)(math.round(event.getx() / 20.0)*20);int y = (int)(math.round(event.gety() / 20.0)*20);if (x = 40 & x = 60 & y = 400) cursor.x = x;cursor.y = y;if (!ischessstate() cplayer.performchessman();recordchessstate();repaint();judgewin();/ 判定当前落子后是否赢棋repaint();public void mouseentered(mouseevent arg0) pub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 垃圾清运服务合同报价
- 预制构件购买协议书
- 抽样误差与假设检验
- 九年级化学上册 3.2 制取氧气 氧气的制取教案2 (新版)粤教版
- 二年级品德与生活下册 快乐的六一 2教案 人教新课标版
- 高中信息技术《走近人工智能》教学设计
- 2024-2025学年高中历史 第8单元 第27课 世纪之交的世界格局教案 新人教版必修1
- 广东省廉江市实验学校高中政治 11.1 面对经济全球化教案(必修1)
- 2024秋八年级英语上册 Module 2 My home town and my country Unit 3 Language in use教学设计(新版)外研版
- 租赁空窗期合同(2篇)
- 75t汽车吊起重性能表
- 经肛门微创手术(TME)(课堂PPT)
- 中国围棋竞赛规则(2002)
- 消防检验批验收记录表
- 茶楼股东合作协议(范本)
- 信息化系统集成项目项目竣工报告建文
- 大连市土地一级开发整理财政
- 中国建设银行员工内部等级表
- 《白内障》ppt课件
- 培智学校课程标准
- 2017年泰安市职业技术院校技能大赛
评论
0/150
提交评论