五子棋游戏的设计与实现_第1页
五子棋游戏的设计与实现_第2页
五子棋游戏的设计与实现_第3页
五子棋游戏的设计与实现_第4页
五子棋游戏的设计与实现_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaGUI实现五子棋游戏摘要博弈论是二人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜的目的。博弈论最初主要研究象棋、桥牌、赌博中的胜负问题,人们对博弈局势的把握只停留在经验上,没有向理论化发展。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。棋子分为黑白两色,棋盘为1515,棋子放置于棋盘线交叉点上。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,图形用户界面(GUI)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。随着互联网的发展,网上PK已经普遍,玩家可以不受地域的限制,自由的选择对手,通过socket实现客户端和服务器的连接,通信。人工智能AI是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。玩家可以和计算机进行对决。计算机可以分析棋盘局势,给空位估值,找到最佳落棋点,如极大极小博弈树估值搜索算法、阿尔法贝塔剪枝算法和Negascout搜索算法。二十世纪七十年代以来人工智能被称为世界三大尖端技术之一。本课程的研究将会加深对人工智能的理解。关键词:博弈,GUI,五子棋,Socket,人工智能JavaGUIRealizedGobangGameAbstractGametheoryisthetwoonanequalgameintheiruseofeachothersstrategytotransformhimselfconfrontationstrategytoachievevictorypurposes.Gametheoryfirstmajorstudychess,bridge,gamblingintheoutcomeoftheproblem,peopleofgamesituationgrasponlystayintermsofexperience,failedtotheorydevelopment.Gametheoryconsideringthegamesindividualforecastbehaviorandactualbehavior,andtostudytheiroptimizationstrategies.Backgammonisatwogamesofpurestrategybasedboardgames,chessandGoGM,isoriginatedinancientChinastraditionalOthelloonespecies.Piecesintoblackandwhite,theboardof1515,piecesplacedontheboardlineintersection.Javaisawaytowritecross-platformapplications,object-orientedprogramminglanguage,graphicaluserinterface(GUI)isagraphicaldisplayofthecomputeroperatingtheuserinterface.Withearlycomputersusingthecommandlineinterfaceascomparedtothegraphicalinterfacefortheusertovisuallyeasiertoaccept.WiththedevelopmentoftheInternet,onlinePKhasbeengenerally,playerscanwithoutgeographicalrestrictions,freedomofchoiceopponents,throughthesockettoachieveclientandserverconnectionsandcommunications.ArtificialIntelligenceAIistheresearch,developmentforsimulation,extensionandexpansionofhumanintelligencetheories,methods,techniquesandapplicationsofanewtechnicalsciences.Playerscanandcomputersshowdown.Computercananalyzechessboardsituation,givespacevaluationtofindthebestdropchesspoints,suchastheminimaxgametreevaluationsearchalgorithm,AlphaBetapruningalgorithmandNegascoutsearchalgorithm.1970ssincetheartificialintelligenceknownastheworldsthreecutting-edgetechnologies.Thecourseofstudywilldeepentheartificialintelligencetounderstand.Keywords:Game,GUI,Backgammon,Socket,ArtificialIntelligence目录1引言.11.1课题背景.11.1.1博弈.11.1.2五子棋简介.21.1.3java及java开发平台.31.2本课题研究的意义.72开发环境的配置.103五子棋探索.123.1五子棋的相关术语.123.2五子棋的攻防.134概要设计.164.1层次图.164.2客户端和服务器程序流程图.165详细设计及代码实现.195.1客户端界面的实现代码如下.195.2人机对战.215.3人人对战.265.4运行结果.29参考文献.31致谢.32第0页共32页1引言1.1课题背景1.1.1博弈博弈论(GameTheory),亦名“对策论”、“赛局理论”,属应用数学的一个分支,博弈论已经成为经济学的标准分析工具之一。博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。也是运筹学的一个重要学1。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。生物学家使用博弈理论来理解和预测进化论的某些结果。博弈论是二人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜的目的。博弈论最初主要研究象棋、桥牌、赌博中的胜负问题,人们对博弈局势的把握只停留在经验上,没有向理论化发展。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略2,3。决策人:在对决的过程中第一个发出谋略的人,该方一般情况下根据自身的所处情形、拥有的感受、已有的实践经验和表面状态率先有预谋的发动着行为。对抗者:在俩方对决的过程中行动相对比较晚的那个人,和决策人相比,大体上要作出相反的对策,而且他的行为是在决策者之后的、相对默认的、比较被动的,但结局中他反而获取优势。他的进攻和防守的策略很有可能取决于决策人比较弱势的策略决择,所以对抗是其优先选择的方式,也是唯一的方式,也就是领导人的阶段性完结行动。局中人:在一次对决中,每一个有决策权力的参赛者都是一个局中人。通常情况下,只有两个局中人的对决就是所谓的“两人博弈”,而多于两个局中人的博弈就是“多人博弈”。策略(strategies):一次对决中,每个局中人都有各自不同的实际可行的比较完整的行为指南,该指南不是特定的某阶段的行动指南,而是在整个行动中的一个指南,每个局中人的一个可行的自始至终、从头到尾的全局筹划的一个行动方案,也就是这个局中人的一个策略。假如在一个对决中局中人都总共有有限个策略,那就是“有限博弈”,否则就是“无限博弈”。第1页共32页得失(payoffs):一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付(payoff)函数。次序(orders):各博弈方的决策有先后之分,且一个博弈方要作不止一次的决策选择,就出现了次序问题;其他要素相同次序不同,博弈就不同。博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓均衡,它是一稳定的博弈结果。极大极小博弈树(MinimaxGameTree,简写为MGT,译者注)用于编写电脑之间的游戏程序,这类程序由两个游戏者轮流,每次执行一个步骤。当然,所有可能的步骤构成了一个树的结构4。它对于所有的GameAI(游戏智能)开发来说都是非常重要的数据结构。对一棵完整的极大极小树来说,计算机能够向前遍历每一步,直到找到最佳步骤为止。像人类的棋类游戏一样,程序的能力高低取决于计算机对所处形势的评估能力,以及程序搜索的深度。一位国际象棋大师对形势的估计误差要大大小于余位业余选手,而且象棋大师对于棋局的预测也远比一般人更远。计算机同样也可以对棋局做出很长远的预测,并且它着棋不会失误,因为它会看到对手由于失误而做出的回应。1.1.2五子棋简介五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜。五子连珠游戏其中包含着一个极为深刻的数学问题。被当代科普作家傅小松称之为五子连珠问题,又称五子连珠猜想。其准确表述是:在以横线、竖线互相交叉(一般各为15条)的方形平面(棋盘)中,黑白两种“点”(棋子)先后沿横线、竖线排列(行棋),在平面(棋盘)横线、竖线、斜线(无实线连接)上形成连续的同色“点”(棋子),五个“点”(棋子)为可能达成连珠的最大值。“五子连珠问题”的证明可能非常复杂,这是因为,第一,它不是一个静态的问题,而是一个动态的问题5。棋盘是一个静态的二维平面,但行棋博弈第2页共32页是一个动态的过程。第二,这不是一个线性和确定性的问题,而是一个非线性和模糊性问题。所谓“五子连珠”的最佳值,是在千变万化的攻与防中达到的一种默契。因此,要解决“五子连珠猜想”,可能要运用到博弈论、模糊数学等工具。1.1.3java及java开发平台Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。今天,全球有25亿Java器件运行着Java,450多万Java开发者活跃在地球的每个角落,数以千万计的Web用户每次上网都亲历Java的威力。Java运行在7.08亿手机、10亿智能卡和7亿PC机上,并为28款可兼容的应用服务器提供了功能强大的平台。这么多应用,彻底改变了用户的生活。越来越多的企业,因为使用了Java而提高了生产效率。在中国,越来越多的用户,因为Java而降低了成本,享受到了Java带来的便利。Java技术已经日渐成熟,使用Java语言设计五子棋游戏有很大的优越性。这是由于Java是一门经过长时间发展,现在已经充分完善的面向对象程序设计语言,使用Java开发游戏很大程度的方便了游戏脚本的使用和Java使用套接字的网络功能。这些都足以说明Java开发本项目的优势。(1)Java长期发展,现在已经相当成熟。企业级应用使用Java这么多年,实践说明了它有利于开发大型软件。随着Java的运行效率的不断提高,Java语言易学、严格、抽象度高、可读性好的优势就凸显出来。当今游戏软件的规模越来越大,java的优点也吸引了众多游戏开发者。(2)方便了游戏脚本的使用第3页共32页游戏脚本Script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件又称批处理文件。对于游戏开发者,经常关系到相对复杂的情形(比如美学问题),软件开发过程是一个不断完善不断改进的过程,因此便捷的修改游戏内容是很必要的。由于其虚拟机的特点,可以使用java来完成游戏脚本的编辑,是一种完全的面向对象语言,也就是说,开发者能在游戏中十分便利地扩展和继承之前的代码,而不需要再重新开发新的类库。比如同一类游戏的引擎不用重复的编写,只是替换游戏中涉及到的图片、音乐、动画、布局、组件等,就可以设计出一个新的游戏,极大的节约的时间,节省人力物力的资源浪费。(3)网络功能Java一向强于解决网络方面的问题,在这方面Java主要有两个优势,第一是基于Applet和JavaWebStart的游戏非常容易更新,不会像其他游戏那样需要用户手动下载全新版本;第二是Java在网络交互的Api相对比较友好,而对于大型网络游戏来说,分布式系统非常重要。Java拥有强大的网络功能,能很容易的和网页结合在一起发布到世界各地。游戏者只要通过浏览器就可体会到游戏所带来的乐趣。这意味着,游戏将面临着拥有全世界的玩家这个巨大市场。这些年由于Java技术的不断发展,Java程序的运行速度有了显着提升,同时硬件技术也在不断进步,从而使得Java处理比较复杂的3D图形成为可能。Java多线程模型、主动绘图,双缓冲技术、页面交换技术、Lwjgl、Jogl、Java3D等技术的出现,使Java语言可以方便的利用现在的显卡日益强大的硬件加速能力。实际上目前已经有许多基于Java的2D和3D游戏,其中不乏大型多人在线游戏。(1)Java多线程模型多线程的实现有两种方法,可以继承Thread类或者实现Runnable接口。众所周知线程通过start方法后不是立即运行,而只有处于Runnable状态的线程会被调度执行,被调度执行的线程此时就处于Running的状态,线程开始执行run方法,线程将执行完成或者被调用interrupt方法中断成为Dead状态,线程执行过程中执行任何对象的wait方法,执行sleep方法、或执行同步IO操作时会分别转换第4页共32页为Waiting、Sleeping、Blocked的状态,这些都是Non-Runnable的状态,即使CPU有空余时间,处于这些状态的线程也不会被调度运行,当导致他们停止运行的情况解除时,他们可以重新转换为Runnable的状态,等待下次被调度运行。相对于Dead状态,Runnable、Running、Non-Runnable的状态下的线程都是Alive的。在进行动画编程时,我们经常接触的是sleep方法,该方法容许线程暂停一段指定的时间,然后恢复执行。(2)主动绘图一般编写Java的绘图程序都是在Component类的paint(Graphics曲方法中进行,在动画线程中调用repaint()方法,repaint方法只是往组件的事件队列中添加了UPDATE的事件,当Java的AWT线程处理到这个事件时,会调用Component的update()方法,在update()方法中才会调用paint(Graphicsg)方法。由于我们采用了一个单独的动画线程,我们也可以主动绘图,主动绘图就是要通过Component类的getGrahics0取得Graphics对象,然后将该对象传入paint(Graphicsg)方法中绘图,利用主动绘图一般可以提高绘图的效率。(3)双缓冲技术双缓冲技术主要用来消除屏幕闪烁,因为显示屏上不同的屏幕区域分别对应着显卡中的一段缓存,假如直接把图片写进缓存里,与此同时写入的操作花费的时间较长,这时屏幕上就会看到闪烁。该技术,就是另外建立一个离屏的缓存,写进图片时,首先写进离屏缓存中,然后将离屏缓存中的内容一次性复制到显卡的缓存中,这样达到地消除闪烁的目的。在JavaAWT/Swing中,在没有使用主动绘图的情况下,我们通过调用repaint()函数来间接调用paint(Graphicsg)函数,而paint(Graphicsg)函数是由update(Graphicsg)函数来调用的。这样update(Graphicsg)函数就成为我们建立离屏缓存的理想场所,而paint(Graphicsg)函数可以保持不变。(4)页交换技术在处理屏幕闪烁的问题上,双缓冲技术有着明显的优越性,但它也有一个缺点,每次绘图都需要把离屏缓存中的图片全部复制进屏幕缓存里,假如屏幕的分辨率是800*600,颜色是16位,一屏就需要800600+2=938KB,也就是1M的数据,假如程序中每秒画30帧图像,每秒种就要复制大约30M的图像数据!第5页共32页一般情况下这是可以实现的,但我们需要技术的改进,页交换技术就应运而生了。页交换技术也是包含两个缓存,却不同于双缓冲那样将数据从离屏缓存黏贴到屏幕缓存中,而是将屏幕缓存直接指向离屏缓存,原来的屏幕缓存变成离屏缓存,这样就循环往复,就不需要不断地拷贝数据了。使用页交换又引出另外一个问题,如果在显示器刷新的过程中我们交换了屏幕缓存,那么就会导致用户看到的屏幕内容一部分来自于原来的屏幕缓存,一部分来自于当前的屏幕缓存,从而导致屏幕撕裂的情况,为了防止这种情况,我们必须在显示器更新的间隙交换缓存。幸运的是,Java图像库中已经提供了BufferStrategy类来解决这个问题。BufferStrategy类会根据系统环境自动选择最佳的方案来实现缓存,首先,会尝试页交换,如果不行就使用双缓冲,当使用页交换时,它会等待显示器刷新完毕才进行页交换。Canvas和Window子类的实例都能有一个BufferStrategy对象,至少需要两个缓存,可以使用window.createBufferStrategy来使用BufferStrategy,以下代码通过BufferStrategy取得Graphics对象来绘图。(5)Java3D技术作为Sun公司较早推出的一项3D技术,是一种高度封装的api,构建在Opengl和Direct3D之上,可以说是最有名的Java的3D技术。由于种种原因(api设计,面向用户的不明确),Java3d一直没有办法流行,不久前Java3d的团队宣布暂停对Java3d新功能的开发,转而为JavaFX开发3D渲染引擎。同时Sun的另一个项目ProjectWonderland宣布将其渲染引擎由Java3D转为JMonkeyEngine。令人遗憾的是Sun的Java3D再次进入尘封状态,大量基于Java3D的程序和教程都面临一个非常尴尬的境地,令人高兴的是在这一领域终于有比Sun做得更好的团队出现了。(6)LWJGL全名LightWeightJavaGameLibrary。作为一个非官方的对Java游戏的全面解决方案,LWJGL将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的Directx(不是Direct3D)而努力。其在图形方面采用了opengl的Java绑定,其函数与c语言版的完全相同,所以对于习惯opengl编程的程序第6页共32页员来说比较友好。目前有大量的Java游戏和游戏引擎是基于LWJGL的,它可以说是Java游戏社区最广为被使用的函数库之一。(7)JoglJogl是Java对opengl的一个绑定,或者说是opengl接口的Java实现,它是由sun支持的。其语法与opengl完全相同,api也紧跟随着opengl的版本进行更新,而Nehe的opengl范例程序大多数都有Jogl版本。去年Jogl正式通过jcp审核成为jsr231,是lwjgl的主要竞争者。值得一提的是,Jogl项目的领导者KenRussell曾经声明并不希望Jogl成为jre的一部分,因为他认为这样会使Jogl的更新周期与jre相同,从而变得过于缓慢。KenRussell目前全力工作在新的Javaplug-in的开发上,而opengl的api也没有进行更改,所以现在的jogl版本将持续较长的一段时间。图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受6。GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用。人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。而嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。Eclipse是一个开放源代码的基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C+和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的第7页共32页IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。1.2本课题研究的意义本课题用Java语言在相关开发环境中,设计五子棋的GUI界面,主要分为两大功能:人人联网对战和人机对战。人人联网利用C/S结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。人机对战涉及到人工智能(ArtificialIntelligence,AI)。人工智能主要研究模拟人的智力的理论和方法,并且开发具有人工智能的应用系统解决人类自身很难解决的一些问题,比如机器人、无人机等8。人工智能自从出现在人类的社会中,理论的研究逐渐深入,技术的应用日益成熟,需要人工智能大显身手的领域持续不断地扩大,却始终没有一个大家都公认的比较统一的概念。现在计算机实现人工智能的比较成熟的原理类似于人的大脑般自动、智能的计算机的制造,使得计算机的应用范围达到更高的一个层次,现代社会更快更好地朝着现代化前进。此外,人工智能同时关系多个已存在的不同的学科,比如计算机科学、心理学、哲学、生物学和语言学等学科。简而言之,几乎是关于自然和社会的所有学科,其范围已经不止局限于计算机科学的范畴。人工智能和思维学科是应用与理论的联系,思维科学大该可以分为基础科学、技术科学和工第8页共32页程技术3个层次,而人工智能是思维学中的的技术应用层次里的一个应用分支。如果站到思维的角度来观看人工智能,则它不仅仅关系到逻辑思维,在形象思维、灵感思维的密切配合下才能最终实现人工智能的跨越式的大发展。众所周知,从小学就开始接触的数学是其它众多不同学科的基石,数学同样服务于语言、思维领域等领域,人工智能也要而且是必须使用数学这种学科工具,数学不仅作用于标准逻辑、模糊数学等抽象学科,如今数学进入人工智能学科,它们将互相促进而更快地发展。人工智能是计算机学科的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪(基因工程、纳米科学、人工智能)三大尖端技术之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。第9页共32页2开发环境的配置JDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。SE(J2SE),StandardEdition,标准版,是我们通常用的一个版本,从JDK5.0开始,改名为JavaSE。EE(J2EE),EnterpriseEdition,企业版,使用这种JDK开发J2EE应用程序,从JDK5.0开始,改名为JavaEE。ME(J2ME),MicroEdition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK5.0开始,改名为JavaME。没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。JDK第10页共32页安装完后要配置环境变量。JAVA_HOME:D:ProgramFilesJavajdk1.6.0_01;CLASSPATHD:ProgramFilesJavajdk1.6.0_01libtools.jar;D:ProgramFilesJavajdk1.6.0_01jrelibrt.jar;PATH:C:ProgramFilesLenovoLenovoHomeDCMainWin.exe;D:ProgramFilesJavajdk1.6.0_01bin;如图2.1:图2.1变量配置Eclipse直接下载压缩包后,解压到文件夹,可直接使用。创建快捷方式,创建工作空间文件夹。Eclipse也叫做IDE,是方便你写代码的(比如当你写一个方法(method),写一半的时候,他会自动补全全名)。JDK,是用来编译和运行代码的。有些Eclipse会自动夹带自身的JDK。但是我建议你两个都安装。Jdk是Java开发工具包和编译运行环境,包含开发Java的基础类库。WindowBuilder是一款基于Eclipse平台的双向Java的GUI设计插件式的软件。它具备SWT/JFACE开发、Swing开发及GWT开发三大功能,是一款不可多得的Java体系中的WYSIWYG工具。WindowBuilder工具开发商Instantiations已经于2010年8月被Google收购,WindowBuilder也作为免费工具开放了。利用Java开发桌面程序的界面比使用HTML设计Web界面要复杂很多,纯手工编写Java代码来开发界面是非常困难的,借助WindowBuilder设计器工作会变得简单很多。WindowBuilder也就是原来的SWTDesigner。Google收购了Instantiations,把它的工具也重新免费发布了。用过SWTDesigner的人都知它是非常好用的swing/swt可视化开发工具,有了它,swing/swt也可以像visualstudio一样拖拉控件写程序(虽然netbean也可以,不第11页共32页过没怎用),可惜是个收费产品,后来把改名为WindowBuilder。不过Google把这个工具的开发公司Instantiations收购了,并把这个产品免费发布。Google收购Instantiations是为了给它的GWT设计开发工具,据说也是为了它的Anroid搞开发工具。打开Eclipse,打开菜单HelpInstallNewSoftware,单击Workwith后的Add按钮,输入与你Eclipse对应版本的更新地址。安装完后的界面设计工具如图2.2所示:图2.2WindowBuilder界面3五子棋探索3.1五子棋的相关术语:“连”同色棋子在一条阳线或阴线上相邻成一排。“长连”五枚以上同色棋子在一条阳线或阴线上相邻成一排。“五连”只有五枚同色棋子在一条阳线或阴线上相邻成一排。“成五”含有五枚同色棋子所形成的连,包括五连和长连。“四”在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。“活四”有两个点可以成五的四。“冲四”只有一个点可以成五的四。“死四”不能成五的四。第12页共32页“三”在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。“活三”再走一着可以形成活四的三。“连活三”即:连的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。“跳活三”中间隔有一个空点的活三。简称“跳三”。“眠三”再走一着可以形成冲四的三。“死三”不能成五的三。“二”在一条阳线或阴线上连续相邻的5个点上只有两枚同色棋子的棋型。“活二”再走一着可以形成活三的二。“三三”一子落下同时形成两个活三。也称“双三”。“四四”一子落下同时形成两个冲四。也称“双四”。“四三”一子落下同时形成一个冲四和一个活三。“禁手”对局中如果使用将被判负的行棋手段。禁手的分类:三三禁手(黑棋一子落下同时形成两个或两个以上的活三,此子必须为两个活三共同的构成子)、四四禁手(黑棋一子落下同时形成两个或两个以上的冲四或活四)、长连禁手(黑棋一子落下形成一个或一个以上的长连)。构成禁手的基本要素:活三(本方再走一着可以形成活四的三)、活四(有两个点可以成五的四)、冲四(只有一个点可以成五的四)、长连(在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连)。关于禁手的规定:黑方五连与禁手同时形成,禁手失效,黑方胜。第13页共32页图3.1活二图3.2死二第14页共32页图3.3活三图3.4死三3.2五子棋的攻防五子棋的基本防守技巧如下:靠:由于五子棋是平衡的艺术,因此原则上每步棋都应下在对方上一步棋周围贴身的八个位置上。当你不知道该怎么下时可按此考虑,特别是对方在外围远处下子时,则在其左右必有好点。可降低对方的活动能力。压:活动需要空间,防守主要的目的是压迫对方的活动空间,在对方棋形的上方进行挤压,使其不能抬头,限制其发展,防止敌人以几何倍数向外扩张(如果这样你肯定完了)。下在外围也能为将来自己的扩展做准备。托:将对方的棋形托向底线,使其失去根基,发展无望。即分割其与总体的联系,将之孤立起来,起到无为而治的目的。点:在情况不明的地方点一手,看对方的应手而后定。将变化走明有时是明智之举。穿心:功聚内力,防守就是要破坏其凝聚力,在对方集中之处的中心筋络上下子能起到事半功倍的效果。不过“心”一定要选准,否则事得其反。分割:在对方二块棋的交汇点上进行分割,以防止相互呼应。只要制住三点,连神龙也腾飞不起来。应特别注意对方的接应子,要坚决切断,不留活口,封杀出局。反打:争取主动是积极的防守。反打即作出活二或死三,使之能在对方活三冲四时反活三反冲四。使自己能更灵活地防守,在对方进攻时进行反打有抢先防御,争取主动的效果12。棋无常型,水无常势,以柔克钢,以阴柔化致钢是五子棋的要诀。如果下棋双方都无错误,则每盘都是和局,只有抓住对方的防守失误才有获胜的希望。提剑当胸时,浑身无处不戒备,凶猛攻击之时,自身必然露出弱点,这正是反击之时。下五子棋须得法,法中变化有莫测;五子之变如水势,因势避高而趋第15页共32页下。战不过攻守,法不过奇正,奇正之法:往复循环,“不竭如江海,无穷如天地”13。五子棋的开局也称布局,一般在37手左右完成。五子棋的开局是十分重要的。一局五子棋的着数在20至40着之间,因此,它的开局阶段是非常短暂的,大约在七八着至十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。在开局阶段,双方主要是二的争夺9,10。双方必须设法创造自己的连二、活二、跳二或大跳二等,同时要阻挡对方的活二。无论哪种开局,均体现出这一规律。可以说,哪一方的二做得多(有两个以上的活二),或者有效地阻挡住对方的活二,那么,哪一方的胜率就比较大。另外,开局时每一个次序、每一种节奏都不能忽视,输赢就在一步之差。为了便于记忆、区分以及比赛。只对前3步组成的棋形进行了部分取名。进攻始于活二,要尽可能的利用好棋盘上的每一个子,多形成活二。所有成功的攻击都要依赖“组合攻击”。“组合攻击”是指一子落下,同时产生两条或多条攻击线,而且每条线都能取胜,这样对手无法同时防守。组合攻击可以说获胜的唯一之路。最简单的“组合攻击”有三种类型:三三组合,四四组合和四三组合。根据五子棋禁手规则,黑棋三三和四四是禁手,所以黑棋唯一获胜的方法是四三,而白棋没有禁手的限制。制约与反制约,是五子棋的精彩之处说到制约,我们大家往往都会想到防守。的确,要害一点的防守,可以扼杀对方汹涌的攻势,挽狂澜于即倒,迅速扭转局势。面对对手的活三,做四,我们似乎没有多少选择的余地。当对手活三时,如果我们没有VCF(VictoryofContinuousFour的缩写,五子棋中引入的英文名称,对于黑棋即利用连续冲四,最终形成四三而取胜,对于白棋亦可通过连续冲四后四四、长连或逼迫黑方禁手而取胜。为五子棋残局排局解题的一种取胜技巧。利用连续不断冲四或嵌五的绝对先手,直至形成四三后变活四而取得胜利的一种方法),就得考虑防守了。在确保防守后对手没有VCF的同时,我们可以形成自己的VCF,就达到了反制约;往往是无论我们防任何一点,自己都形不成VCF,我们就要考虑抓要害了。判断好对方的棋形走势,选取关键的一点,以达到影响对手下一步或几步优势的目的。我们就顺利地进行制约了16。在面对对手做了一点,又有活三的可能,又有做四的机会时,我们应看到第16页共32页对方如果活三(做四),下几步有没有和别处的子联系,从而连续进攻的可能。两者有其一,防住。一般来说活三的防点有两个或三个,而做四的防点只有两个,强防弱防,视具体情况而定(参考前面技巧)11。总之,把握制约,争取主动。无论什么时候,在五子棋里,做四是永远的先手。记住这个,在很关键的时刻,可能会柳暗花明,咸鱼翻身。4概要设计4.1层次图基于Java的五子棋游戏的总体功能是要设计出具有界面有好的、具备人工智能的、支持网络对战的五子棋游戏。本项目最终的目的是建立一个具体规则的五子棋平台,使两个不同的用户通过一定的网络连接,达到网络对战的目的,以及单机上的人机对战。(1)支持人机对战,能够让计算机按照游戏规则通过人工智能自行选择最优走法。(2)模拟网络对战,能够支持两个用户通过网络连接进行对战。(3)具有精美的操作界面,方便用户操作和使用。本程序总体上可分为两大模块,客户端和服务器,客户端有GUI界面,服务器端没有可视的界面,只是在控制台显示已运行。层次图如图4.1:第17页共32页Java五子棋客户端服务器界面设计人机对战人人对战监听并连接客户端发送接收处理消息图4.1层次图4.2客户端和服务器程序流程图人机对战时,玩家下棋,电脑智能的选择最佳位置下棋。要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判定是远远不够的,这样下棋很轻易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们加入递归调用,即:在电脑中猜测出今后几步的各种走法,以便作出最佳选择,这也是我们下棋时常说的“想了几步”。如此一来您的程序便具有一定的水平了。首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组,数组的每一个元素对应棋盘上的一个交叉点,用0表示空位、1代表黑棋、2代表白棋;这张表也是今后分析的基础。先来分析己方的棋型,我们从棋盘左上角出发,向右逐行搜索,当碰到一个空白点时,以它为中心向左挨个查找,假如碰到己方的子则记录然后继续,假如碰到对方的子、空白点或边界就停止查找。左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也第18页共32页就填写完毕了。开始初始化是否人机模式人机控制块玩家放旗子计算机设置棋型表计算机下棋胜负判断与服务器接收发送消息判断消息类型处理消息是是否玩家下棋否否断开连接是否断开连接是否是显示结果结束图4.2客户端程序流程图人人对战主要是通过服务器连接不同客户端,首先服务器设定地址和端口,创建套接字进行监听,客户端根据地址和端口请求建立连接,服务器接收连接,返回新的套接字进行通信,通过识别接收到的消息的类型,执行不同的操作,结果返回到客户端,在客户端响应。服务器控制客户端的玩家列表,显示两玩家的下的棋子,判断输赢。第19页共32页开始服务器开启服务监听客户连接请求是否有连接请求接收并创建新套接字接收消息处理消息发送消息是否断开连接断开连接是否是结束否图4.3服务端程序流程图在主程序运行之前要先运行服务器程序,这样技能满足玩家单机对战又能满足玩家网络对战。运行主程序后,首先用到的是初始化模块。玩家可以选择单机对战,这时就要用到玩家落子模块、电脑落子模块、人机控制模块、设置棋型表模块、胜负判断模块。如果玩家选择网络对战,那么这时就要用到玩家落子模块、主循环控制模块、胜负控制模块。5详细设计及代码实现本程序共分为7个类,BoardPanel,ChessWZQ,Group,Message,Player,ServeOneClient,,Server。其中BoardPanel实现棋盘的初始化,包括棋盘的绘第20页共32页制和鼠标事件的处理;ChessWZQ是客户端主程序,包含窗口的建立、组件的添加及其事件的处理、和服务器的连接、不同消息的处理、及人工智能下棋的估值和搜索;ServeOneClient负责与客户端的发送和接收消息及不同消息的处理;Server负责服务器的开启与监听。5.1客户端界面的实现代码如下JFrame是带有标题和边框的顶层窗口。setTitle(Stringtitle)将此窗体的标题设置为指定的字符串。Java中的Graphics类是用于绘图和显示格式化文本的工具类。在Java程序中绘图必须在一个窗口(容器)中进行,绘图窗口经常被设计为一个组件容器。一般首先在一个面板中进行绘制,然后将这个面板添加到现实窗口中。下面是Graphics类中常用的各种图形的绘制方法。drawChars(chardata,intoffset,intlength,intx,inty)使用此图形上下文的当前字体和颜色绘制由指定字符数组给定的文本。drawLine(intx1,inty1,intx2,inty2)在此图形上下文的坐标系中,使用当前颜色在点(x1,y1)和(x2,y2)之间画一条线。drawOval(intx,inty,intwidth,intheight)绘制椭圆的边框。drawString(Stringstr,intx,inty)使用此图形上下文的当前字体和颜色绘制由指定string给定的文本。fillOval(intx,inty,intwidth,intheight)使用当前颜色填充外接指定矩形框的椭圆。getColor()获取此图形上下文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论