




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1前言跟着计算机技术的不停发展,网络技术的普及范围愈来愈广,网络能够供给的服务多样、便利,已经成为人们生产生活中不行缺乏的重要构成部分。此刻网络休闲游戏发展快速,它依靠健康、方便、互动性强、益智等诸多长处,成为大多半现代人休闲娱乐的首选。网络五子棋游戏是使用Java语言开发的一款游戏。它使用SOCKET成立连结,多线程办理数据,以及可嵌入网络阅读器的APPLET作为客户端,这些特色使这款游戏不论是服务器仍是客户端的实现都相对简单。经过对该软件的编写,还能够稳固学生对以上各样知识的掌握和理解。2JAVA语言概括2.1JAVA简介JAVA是SunMicrosystem企业开发的编程语言,是一个简单
2、,面向对象,散布式,解说性,强健,安全,与系统没关,可移植,高性能,多线程和动向的语言。的基本特色简单性Java与C+语言特别邻近,但Java比C+简单,它扔掉了C+中的一些不是绝对必需的功能,如头文件、预办理文件、指针、结构、运算符重载、多重继承以及自动逼迫同型。Java实现了自动的垃圾采集,简化了内存管理的工作。面向对象Java供给了简单的类体制和动向的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐蔽;而类则供给了一类对象的原型,经过继承和重载体制,子类能够使用或从头定继父类或超类所供给的方法,进而既实现了代码的复用,又供给了一种动向的解决方案。多线程多线程使应用程序
3、能够同时进行不一样的操作,办理不一样的事件。在多线程体制中,不一样的线程办理不一样的任务,他们之间互不干预,不会因为一处等候影响其余部分,这样简单实现网络上的及时交互操作。散布性Java是面向网络的语言。经过它供给的类库能够办理TCP/IP协议,用户能够经过URL地点在网络上很方便的接见其余对象。系统结构中立Java是一种网络语言,为使Java程序能在网络的任何地方运转,Java解说器生成与系统结构没关的字节码结构的文件格式。为了使Java的应用程序能不依靠于详细的系统,Java语言环境还供给了用于接见基层操作系统功能的类构成的包,当程序使用这些包时,能够保证它能运转在各样支持Java的平台上
4、。安全性用于网络、散布环境下的Java一定要防备病毒的入侵,Java不支持指针,全部对内存的接见都一定经过对象的实例变量来实现,这样就防备了程序员使用欺诈手段接见对象的私有成员,同时也防止了指针操作中简单产生的错误。中输入/输出流观点过滤流DataInputStream和DataOutputStream除了分别作为FilterInputStream和FilterOutputStream的子类外,还分别实现了接口DataInput和DataOutput。接口DataInput中定义的方法主要包含从流中读取基本种类的数据、读取一行数据、或许读取指定长度的字节数,如readBoolean()、rea
5、dInt()、readLine()、readFully()等。接口DataOutput中定义的方法主假如向流中写入基本种类的数据或许写入必定长度的字节数组,如writeChar()、writeDouble()。DataInputStream能够从所连结的输入流中读取与机器没关的基本种类数据,用以实现一种独立于详细平台的输入方式;DataOutputStream能够向所连结的输出流写入基本种类的数据。体制Socket是面向客户/服务器模型设计的,网络上的两个程序经过一个双向的通信连结实现数据的互换,这个双向链路的一端称为一个Socket。Socket往常用来实现客户方和服务方的连结。客户程序能够
6、向Socket写恳求,服务器将办理此恳求,而后经过Socket将结果返回给用户。Socket通信体制供给了两种通信方式:有联接和无联接方式,分别面向不一样的应用需求。使用有联接方式时,通信链路供给了靠谱的,全双工的字节流服务。在该方式下,通信两方一定创立一个联接过程并成立一条通信链路,此后的网络通信操作完整在这一对进度之间进行,通信完成封闭此联接过程。使用无联接方式时其系统开支比无联接方式小,但通信链路供给了不行靠的数据报服务,不可以保证信源所传输的数据必定能够抵达信宿。在该方式下,通信两方不用创立一个联接过程和成立一条通信链路,网络通信操作在不一样的主机和进度之间转发进行。应用程序相对简单。
7、JAVA支持流套接字(streamsocket)和数据报套接字(datagramsocket)。流套接字使用TCP(TransmissionControlProtocol,传输控制协议)进行数据传输,而数据报套接字使用UDP(UserDatagramProtocol,用户数据报协议)。在Socket层实现的Java网络程序是严格同步的。从一台机器发送数据的操作要求对应一个从其余机器接受数据的操作。2.2JAVA工具JDK1)Java编译器Java编译器将Java源代码文件编译成可履行的Java字节码。Java源代码文件的扩展名为.java,Java编译器把这类扩展名的文件编译成扩展名为.cla
8、ss的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。2)Java解说器Java解说器对编译生成的字节码格式的可履行程序的运转供给支持,它是运转非图形Java程序的命令行工具。程序的设计思路和算法3.1人机博弈的重点人机棋战的程序,起码应具备以下5个部分:某种在机器中表示棋局的方法,能够让程序知道博弈的状态。产生合法走法的规则,以使博弈公正地进行,并可判断人类敌手能否乱走。从全部合法的走法中选择最正确的走法技术。一种评估场面好坏的方法,用以同上边的技术配合做出智能的选择。一个界面,有了他,这个程序才能用。2五子棋特色及规则五
9、子棋的娱乐性强、规则简单、易学、流行性广。一般人不需长时间特意训练即可自如行棋。所以极受大众欢迎。五子棋的规则为:棋盘采纳像围棋盘相同的15路或19路线的棋盘,在此采纳19路的棋盘。下法两人分别执黑白两色棋子。轮番在棋盘上选择一个无子的交错点落子,无子的交错点又被称为空点。胜败判断黑、白两方有一方的五个棋子在横、竖或斜方向上连结成一线即为该方赢。3.3算法设计博弈树的搜寻过程在以下议论中,命名2个博弈者MAX和MIN。下边的任务是为MAX找最正确的挪动。假设MAX先挪动,而后2个博弈者轮番挪动。所以,深度为偶数的节点,对应于MAX下一步挪动的地点,称为MAX节点;深度为奇数的节点对应于MIN下
10、一步挪动的地点,称为MIN节点(博弈树的顶节点深度为0)。k层包含深度为2k和2k1的节点。往常用层数表示博弈树的搜寻深度,他能够表示出向前展望的一定认识到搜寻到终点是不行能的(除了在博弈快结束时),所以,常采纳在有限范围搜寻方法。这里使用启迪式搜寻。在启迪式搜寻的过程中,重点的一步是怎样确立下一个要观察的节点,在确立节点时只需能充分利用与问题有关的信息,预计出节点的重要性,就能在搜寻时选择重要性较高的节点,以利于博弈者以较快的速度求出最正确的棋步。3.32采纳静态评估函数这里用评估函数h(i)权衡每一个叶节点地点的“值”。一个最正确首步能够由一个最小最大化过程产生。假定轮到MAX从搜寻树的叶
11、节点中选用,他必定选择拥有最大值的节点。所以,MIN叶节点的一个MAX节点双亲的倒推值就等于叶节点的静态评估值中的最大值。另一方面,MIN从叶结点中选用时,一定选用最小的节点(即最负的值)。既然这样,MAX叶节点的MIN双亲节点被分派一个倒推值,他等于叶节点静态评估值的最小值。在全部叶节点的父节点被给予倒推值后,开始倒推另一层,假定MAX将选择有最大倒推值的MIN的后继节点,而MIN会选择有最小倒推值的MAX后继节点。持续逐层对节评论估,直到最后开始节点的后继者被给予倒推值。MAX将选择有最大倒推值的节点作为他的首步。整个过程的有效性鉴于这样的假定。用整个棋盘估值的函数h(n)为静态估值函数。
12、假想目前棋局S为轮到计算机方下棋(用表示),任选一空点作为计算机方的下棋地点(可有若干种选择),接着考虑在此状况下游戏者一方下棋的棋局(用O表示);从某一“O”棋局出发,任选一空点作为游戏者一方的落子处(又有若干种选择),再次形成计算机方下棋的“”棋局;依此类推,这样可形成一棵以S为根结点的博弈树,该树以O棋局为第2层子结点,以棋局为第3层子结点等等。假如持续向前搜寻,可形成多层子结点,此刻以向前搜寻3层子结点为例来说明极大极小值的过程。对第3层子结点的某一棋局n,求出其预计值h(n),假定有一博弈树已形成,如图1所示,h(n)的值由各结点旁的数值给出。依据极小极大化剖析法,先计算第3层子结点
13、h(n)值,而后第2层子结点的预计值取他的各后继子结点的极小值,根结点的预计值取他的各子结点的极大值。这个获得最大预计值的子结点即为从S出发的计算机方的最正确落子方案。棋盘上某一行、某一列或某一对角线为一路,这里使用的棋盘为19行19列,所以,行和列方向上共有191938路;从左下到右上方向的对角线有37路,相同,从左上到右下方向的对角线也有37路。但关于五子棋来说一定在一条直线上有连续五个棋子才能赢。所以,在对角线上就能够减少8路。所以,整个棋盘路的总数为:对某一棋局n,第i路得分:h(i)hc(i)hm(i)。此中:hc(i)为计算机方在第i路预计值得分,hm(i)为游戏者一方在第i路得分
14、。对的得分规则作以下说明。规则中代表一空点;o代表对方棋子;代表有计算机方棋子;表示连续2点为空点;表示连续3个空点接一个计算机方棋子,再接两空点。某一规则表示如在i路上有棋子构成形如则hc(i)30。其余规则表示相同。在系统中使用的主要估值规则以下:由对称性可知和的估值相同,同理可得其余拥有这样对称性的估值都以为是相等的。在连续两路上出现(3)的情况=hc(i)=5000,一路出现,此外一路出现(4)=hc(i)=5000。所以在整个棋盘上的总估值为:为了增添系统的智能化也能够增添其余的一些规则。33遗传算法优化估值函数在博弈程序的几大主要部分里,估值函数是与详细的棋类知识密切联合的一部分。
15、能够说估值函数在很大程度上决定了博弈程序的棋力高低。上边给出的估值是依据实质经验给出的。怎样对上述的估值进行优化呢?下边采纳遗传算法来改良静态估值。遗传算法的预计值在很大的程度上也依靠于实行者的经验。可是能够利用一些高水平名局棋谱或同其余博弈程序棋战,看使用某一组参数时取胜的机率有多大来进行较验。经过几次的试验一般就能够获得较好的静态估值。传统的算法一般只好保护一组较好的参数。遗传算法同传统的算法对比能够同时保护几组较好的参数,经过向此中增添一组新参数,往常是将几组老参数中选出的值组合在一同做一点变化。而后同几组老的参数比较孰优孰劣,将最差的一组从中去除。这里面较重要的操作是交错和变异操作。交
16、错经过随机互换父代个体的信息来继承已有参数中的优秀内容;变异经过随机改变个体中的基因此增添种群的多样性,防止优化的因局部震荡而失败。能够将遗传算法的优化估值参数的过程用图2表示。遗传算法的长处:因为搜寻算法是从问题的解开始的,而不是一组参数。所以被局部震荡扰乱致使求最优解失败的可能性大大减小。此算法能将搜寻重点集中于性能高的部分,能较快地求出最正确的参数。在使用中应该注意的问题以下:种群数量这是影响算法性能的重要要素。种群数量过大,会致使运算时间太长,结果收敛迟缓;种群数量太小则可能致使算法精度过低,甚至停止不前。交错概率这个用于控制交错操作的频度。此概率过大会致使种群中的个体更新过快,较优的
17、个体不可以稳固的保持和传达信息;此概率过小则会使优化的过程迟缓甚至停止不前。变异概率这个概率用于控制产生变异个体的频度,目的是防备整个种群中随意参数的几个基因保持不变。一般使用一个很小的概率即足以达成此任务;概率太大则遗传信息没法稳固传达,进而使优化过程变为随机过程,失掉切实的方向而致使失败。程序实现4.1程序设计思路实现一个用户能够Internet上任何地方的不一样机长进行游戏,使用多线程和网络套接字数据流的散布式五子棋游戏,依据要达成的功能,本程序采纳多客户服务方式。服务器创立服务器Socket,一直处于监听等候状态。客户端是动作的倡始者,何时发出申请由客户端决定。客户端向服务器发出申请,
18、服务器赐予响应,客户端发出申请后立刻可从Socket通道去取服务方的结果。服务器接受两个客户端连结后开始一个线程,不停接受客户端发来的数据,并把办理后的数据传递给客户端。服务器能够创立随意多局(图3-1)。服务1N客户端客户端客户端客户端图3-1系统框架Fig.3-1FrameofSystem在对服务器与客户端的设计开发以前,为了使开发方便,将服务器与客户端之间用以通信的变量规定好。经过编写一个接口GameConstant(),在此中定义各个常量的值:publicstaticintPLAYER1=1;publicstaticintPLAYER2=2;publicstaticintPLAYER1
19、_WON=1;publicstaticintPLAYER2_WON=2;publicstaticintDRAW=3;publicstaticintCONTINUE=4;publicstaticintSTOP=100;publicstaticintGAMEPORT=8000;服务器和客户端在设计时继承接口GameConstant()里面的全部数据。4.2服务器的设计与实现为了使界面友善,服务器使用图形组件,创立成一个能够显示游戏信息的框架。在框架中创立一个包含文本区的转动窗格,并在文本区显示游戏信息(图3-2)。图3-2服务器界面Fig.3-2InterfaceofGame-server要成立服
20、务器,需要创立一个服务器Socket,并把它附带到一个端口上,服务器通过这个端口监听连结恳求。端口表记Socket上的TCP服务。网络的类寄存在包中,引入包后经过实现一个ServerSocket的实例就能够创立一个服务器Socket,并把它附带到一个端口(GAMEPORT)上:ServerSocketserverSocket=newServerSocket(GAMEPORT);而后,服务器使用以下语句开始监听连结恳求:Socketplayer1=serverSocket.accept();Socketplayer2=serverSocket.accept();服务器开始等候,直到客户提出连结恳
21、求。连结成立后,服务器经过数据输入流从客户端接收信息,而且经过数据输出流把相应的标记发送给客户端。newDataOutputStream(player1.getOutputStream().writeInt(PLAYER1);newDataOutputStream(player2.getOutputStream().writeInt(PLAYER2);当客户端知足开局条件时,就开启一个线程办理客户之间数据,同时持续监听其余客户端的连结恳求。多线程是Java的一个特色,多线程能够使程序反响更快、交互性更强,并能提升履行效率。创立一个新的线程的生命周期以下状态:新建,就绪,运转,堵塞,死亡。在Ja
22、va中,供给了多种控制线程的方法,在服务器顶用到的主要以下几种:publicvoidrun()Java运转系统调用这个方法来履行线程。在用户线程类中,一定覆盖这个方法而且供给线程履行的代码。publicvoidstart()该方法启动线程,它惹起对run()方法的调用。客户类中的可运转对象调用该方法。服务器程序采纳类HandleGame继承Thread类来实现对线程的调用,同时对run()方法覆盖。以下是HandleGame()类里面主要的数据域和方法:privatecharcell:Char种类数组用来记录玩家的标记。privateDataInputStreamisFromPlayer1;p
23、rivateDataOutputStreamosToPlayer1;privateDataInputStreamisFromPlayer2;privateDataOutputStreamosToPlayer2;:四个数据流用来实现与两个玩家之间信息的传达。publicHandleGame(Socketplayer1,Socketplayer2):结构函数,两个参数用以接收传达过来的Socket对象。publicvoidrun():对继承Thread类中的run()方法进行覆盖。privatebooleanisFull():判断能否满格。privatebooleanisWon(introw,in
24、tcolumn,chartoken):判断新标记的单元格能否使一方获胜。游戏局一旦成立起来,服务器便于工作交替地从客户端那边接收数据。从客户端接收到数据后,服务器判断游戏状态,并依据结果进行有关操作,直至游戏结束。4.3客户端的设计与实现客户端负责与玩家的交互。所以要创立一个界面,包含一个20*20的下棋地区,当玩家选定单元格或接收到其余玩家选定的单元格时,用不一样的标记显示;两个显示游戏名称和游戏状态的标签和两个菜单栏上的按键用以进行控制,如图3-3:图3-3客户端界面Fig.3-3InterfaceofGame-client翻开这里客户程序设计成一个JavaAppletGameClient
25、.html文件时,阅读器调用,用户能够在Web阅读器里运转。init()方法对界面进行初始化。点击当用户Start时开启一个线程和服务器连结,经过数据流进行数据互换。connectToServer=newSocket(localhost,GAMEPORT);isFromServer=newDataInputStream(connectToServer.getInputStream();osToServer=newDataOutputStream(connectToServer.getOutputStream();下边是类GameClient的主要方法和数据:publicclassGameCli
26、entextendsJAppletimplementsRunnable,ActionListener,GameConstantsprivatebooleanmyTurn=false;:标记能否轮到自己下棋privatecharmyToken=;:标记自己的棋子privatecharotherToken=;:标记敌手的棋子privateCellcell=newCell2020;:生成20*20privateintrowSelected;:记录所选单元格的行privateintcolumnSelected;:记录所选单元格的列个单元格privatebooleancontinueToPlay=tru
27、e;privatebooleanwaiting=true;:记录游戏进行中的状态publicvoidinit():初始化用户界面,翻开网页时由阅读器调用publicvoidactionPerformed(ActionEvente):覆盖ActionListener接口里面actionPerformed()方法,用来办理用户点击菜单栏惹起的操作。publicvoidrun()覆盖Runnable接口里的run()方法,用以对游戏过程中的数据传输,办理,控制。在客户程序的类中,因为它继承了Applet类,所以不可以再经过申明Thread类的扩展来实现,只好经过实现Java供给的一个Runnable
28、接口,进行线程的创立和运转。Runnable接口的实现是特别简单的,它只包含run()方法,使用时只需将该方法覆盖。从游戏设计来看,单元格是办理鼠标点击事件和显示标记的GUI对象。在这里使用的是面板,设置单元格Cell为JPanel的子类。将Cell类申明为内部类,能够直接使用GameClient类中定义的变量与方法,使程序简短了然。Cell类中包含以下主要数据和方法:publicclassCellextendsJPanelimplementsMouseListenerprivateintrow;privateintcolumn;privatechartoken=;publicCell(int
29、row,intcolumn):结构函数publicvoidpaintComponent(Graphicsg):Graphics对象g是由Java运转系统自动创立,这个对象控制信息的绘制方式。能够使用定义在Graphics类中的多种画法绘制字符串的几何图形。publicvoidmouseClicked(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseReleased(MouseEvente)publicvoidmousePressed(MouseEvente):接口MouseListener中的方法。4.4程序的运转第一将编写好的程序使用Java编译器编译,生成以class为扩展名的类文件,而后使用Java解说器分别运转服务器和客户端。客户端发出连结,服务器接收后开启线程对游戏进行控制,游戏结束时封闭线程。详细流程如图3-4所示:玩家一服务器1.初始化用户界面创立一个服务器套接字。向服务器恳求连结收第一个玩家的连结恳求,而且接,并从服务器获通知玩家他是玩家一,使用标记知所用棋子的标“X”。记。接收第二个玩家的连结恳求,而且3.从服务器获得开始通知玩家他是玩家二,使用标记标记。“O”。启动对局线程。4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省湖州市长兴县德清县安吉县2025届生物高二下期末预测试题含解析
- 盐城市高三上学期期中统一考试地理试题
- 餐饮店租赁及特色餐饮研发合同
- 森林公园草坪围栏施工与生态旅游合同
- 茶山茶树种植与采摘合作合同协议
- 员工健康管理与劳动合同细则
- 食品企业厂长食品安全与质量管理体系合同
- 小区购销合同(4篇)
- 云南德宏州专用通信局引进研究生考试真题2024
- 2025市场部个人年终工作总结范文(30篇)
- 铁路机车电工(高级工)技能鉴定理论考试题及答案
- DBJ13-255-2016福建省民用建筑外窗工程技术规范
- 江苏省南京市2022-2023学年八年级下册期末物理试卷(含答案)
- 《实验室质量控制》课件
- 湖南省长沙市雅礼集团2023-2024学年八年级下学期期末考试物理试卷
- 世界环境日主题课件
- 职业道德与法治 第13课《学会依法维权》第一框课件《依法理性维权》
- 邻近铁路营业线施工安全监测技术规程 (TB 10314-2021)
- 妇科常见病科普知识讲座
- 城市土壤主要类型及特点
- 宾馆财务安全管理制度
评论
0/150
提交评论