已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java大赛黑白棋 说明书 一、开发综述 1小组成员及其分工:2设计时间:07年5月5号-07年5月7号3所用工具: Jbuilder 2006二、功能描述本程序可实现三种功能:a、本机两人对战b、人机对战(有一定程度的人工智能,可以选择“计算机执黑”或“计算机执白”) c、网络对战(功能还不完备,不过可以实现在线交互聊天)。下面对这三个模块进行详细说明:游戏主界面如下:1、 本机两人对战:打开游戏主界面后,依次点击菜单“游戏-重新开局-两人对弈”,此时,游戏区显示游戏的初始状态:2白子2黑子以及先走棋方棋子可以放置的位置(以“X”表示),最下方动态显示走完一步棋后各方棋子数、空棋数及下一步轮到哪方走棋。默认黑棋先走棋,两人私下里决定谁当黑方,谁当白方。然后开始走棋,每走一步棋,系统处理“吃棋”情况,并动态修改画面(调用repaint()方法)及底部各方棋子数目信息。(注:走棋时必须在可以放置棋子的地方走棋,否则弹出对话框提示用户“此处不能下子!”)如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。将对手棋子吃光的一方获胜。(算法及实现方法后面详细介绍)2、 人机对战打开游戏主界面后,依次点击菜单“游戏-重新开局-计算机执黑 或 计算机执白”,选择下棋方式。若选择“计算机执黑”,则计算机先走棋,计算机会调用事先编好的搜索方法(详见后面算法部分)决定该棋子放在哪里,然后人每走一次棋,电脑就根据估价函数自动走一步棋,如此循环往复,直到一方棋子被吃完或棋子填满棋盘或两人均无法走棋,游戏中止,棋子多者取胜。同样,中间若有一方无棋可走,则自动把走棋权让给对方,自己停走一轮。3、 网络对战网络对战连接及在线交互聊天界面如下:如果两个人想要联网对战,则必须有一方充当服务器端,一方充当客户端。建立连接流程如下:1、服务器端开启服务:在“ConnectHost IP”后的文本框中输入欲连接的客户端IP,点击右边的“Connect”按钮,此后要求客户端同时打开该程序并输入服务器端IP并点击“Connect”。当两方都点击连接后,在右上角的文本框显示连接状态,若尚未连接,则显示“Waiting for Connect”,若建立连接,则显示“Connecting”,若出现异常(如网络中断等)则弹出对话框显示“Disconnected“,需重新连接!然后可以在下面的文本区域里写入欲发送的文本,点击“Send“即可发送(类似QQ),在上面的文本域里会显示两人的聊天记录。两人在下棋区域下棋,通过网络功能进行传输(类似管道),则下棋信息同步的显示在联机对战的两台电脑上。若一方要求悔棋,则须征得对方的同意方可。三、类概述本程序有两个类:MainControl类 该类主要负责人机对战、人人对战及界面的维护NetWork类这个类主要负责网络对战及其交互四、算法及实现思想描述此程序用的最重要的数据结构就是一个8*8的二维数组matrix,用于存储每一时刻前台64( 8*8 )个位置的状态(共有3种状态:-1、0、1,-1表示此处放置的事黑子,0表示此处没有棋子,1表示放置的是白子),即每一时刻都由这个程序中的二维数组与前台图形界面上的64个位置一一对应,形成一个映射关系,任何想要了解前台图形界面上各位置状态的方法都可通过访问这个二维数组来实现。还有一个int类型的全局变量 nextToGo ,用于标示下一步该走棋的是哪一方,分别用 -1和 1 表示黑方和白方,在走棋权的交接时使用nextToGo = (-1)*nextToGo来实现,用于黑棋白旗交替走棋。当刚打开游戏界面时,需要对界面进行初始化,在主界面的构造函数里,已经对一些需要用到的量进行了相应的初始化,其次就是:1、调用ini()方法对程序中所要用到的二维数组进行初始化,程序如下:public void ini() /初始化matrix矩阵 LINE_NUM = COLUMN_NUM = 8 ,分别为二维数组的行数与列数 for( int i = 0 ; i LINE_NUM ; i+ ) for( int j = 0 ; j COLUMN_NUM ; j+ ) if( ( i = 3 & j =3 ) | ( i = 4 & j = 4 ) ) matrixij = 1; /此处初始时放置白子 else if( ( i = 3 & j =4 ) | ( i = 4 & j =3 ) ) matrixij = -1; /此处初始时放置黑子 else matrixij = 0 ; /其它位置初始时无子 2、调用checkObjects( nextToGo )方法检查下一个要走棋的一方所能到达的所有地方(即目标位置、将要走棋的一方可以放棋的地方),这个方法里边会修改matrix矩阵的值,在能到达的位置处修改其matrix值使其大于1。(说明:nextToGo是一个全局变量,用来标志下一步要走棋的是哪一方,初始值为-1,表示黑方)调用repaint()方法时遍历matrix矩阵根据每个位置的值进行画图,伪码如下:/应该根据matrix数组来画图 for( i = 0 ; i LINE_NUM ; i+ ) for( j = 0 ; j 1 ) /画“X”,标志下一步可到达之处 下面再说一下checkObjects( nextToGo )的主要思想:该方法主要目的:寻找nextToGo这一方所能放棋子的所有位置,并在paint()方法中在这些位置处画“X”表示,以提示下棋者。实现:遍历二维数组matrix,每到达一个位置,先判断该位置现有棋子是否与下一步要走的棋子同颜色,若是,则从上、下、左、右、左上、右上、左下、右下八个方向进行遍历寻找能放棋子的地方(判断原则:在每个方向上紧挨着这个位置的必须为对方棋子,否则该方向遍历停止。若满足以上条件,则继续搜索直到找到最近的还没放棋子的位置并且在这个方向上两者之间全为即将下棋方nextToGo的对方棋子,那么修改该位置的matrix值(matrix += 2) ) ,当8个方向都遍历完毕,则nextToGo这一方所能放棋子的所有位置处其对应的二维数组的值均1(因为每次到达这样符合条件的位置,都对matrixij += 2,故严格的来说,不仅大于1,而且必然大于等于2且为偶数 ) !这时调用repaint()方法对棋面进行重绘,即可在棋面上显示出nextToGo这一方所能放置棋子的地方,用“X”表示。3、以下要做的就是对鼠标事件进行监听,在鼠标监听方法里进行相应的处理。a.获取欲走棋位置的横纵座标,根据转化规则转化为二维矩阵中的下标(如(i,j)),先看一下if( matrixij 1 ),说明:若matrixij = -1 ,说明此处已放置一黑子,不能再放置棋子了;若matrixij = 1 ,说明此处已放置一白子,不能再放置棋子了;若matrixij = 0 ,说明此处虽未放置棋子,但不符合游戏规则(即放上后不能吃掉对方的任何棋子),故不能放置棋子;只有matrixij 1,说明此位置经过checkObjects( nextToGo )的处理后被标记为可放棋子的地方,可以放棋子。b.在能放置棋子的地方,调用eat( int i , int j , int side )方法进行吃子,看由于这一棋子的引入能吃掉对方的哪些棋子,同时修改那些被吃掉的棋子的matrix二维数组中的值,实现这些棋子的翻转。eat(int i ,int j , int side )方法简介:该方法看由于side这一方(-1表示黑方,1表示白方)在matrixij这个位置下子所能吃掉对方哪些子,并将他们翻转。 实现:对matrixij这一位置从上、下、左、右、左上、右上、左下、右下八个方向进行遍历寻找能吃掉对方的哪些棋子(判断原则:在每个方向上紧挨着matrixij这个位置的必须为对方棋子,否则该方向遍历停止。若满足以上条件,则在此方向上继续搜索直到找到最近的放置本方nextToGo棋子 并且 两者之间全为即将下棋方的对方棋子的位置 , 那么把两者之间的棋子全部翻转为nextToGo方的棋子) ,当8个方向都遍历完毕,则完成了吃子的工作,并修改了matrix二维数组中的相应内容,这时调用repaint()方法对棋面进行重绘,即可在棋面上显示出吃棋后的新局面。c.吃棋完毕后,把下一步的走棋权交给对方(即nextToGo = (-1)*nextToGo ,因为分别用 -1和 1 表示黑方和白方 ),但要注意的一点是:不能随便的把走棋权交给对方,因为有可能对方这时无棋可走,故应该先调用checkObjects(nextToGo)方法看一下对方是否有棋可走,checkObjects(nextToGo)在修改matrix中内容时会同时修改一个全局变量objectPlaces(用于标示nextToGo方可以放置棋子的位置数),故若objectPlaces = 0,则说明这一方已无棋可走,应把走棋权回让给对方。故再调用一次nextToGo = (-1)*nextToGo,又把走棋权传了回来,但还要检测本方是否有棋可走,若本方也无棋可走,则出现死锁情况(即两方都无棋可走),这时宣布两方成绩,游戏结束;若本方有棋可走,则走棋并重复以上所说的流程!五、几点补充1、人工智能的实现: 电脑本身并没有智能,所谓的电脑的智能只是在编程人员告诉了它一系列规则后它才具有了推理判断能力,在该程序的编制中,想使电脑能够自动走棋,则必须告知电脑一个估价函数,即在面临一系列可走棋的地方时该选择哪个地方走棋,这时电脑就对每一个位置根据事先设定好的估价函数得出一个分数,并在分数最高的地方下棋子(编制程序时,设定分数越高,对自己越有利) ,估价函数我们是这么设定的:首先,我们对棋盘的每个地方设置了一个权重,如下:01234567050433405100111100241222214331222213431222213541222214600111100750433405注:其中红色的代表数组中的第几行第几列。黑色的数字代表的是这个位置所表示的权重,权重越大就表明这个位置越重要。在给每个位置打分时,最终成绩=0.9*该位置权重 + 0.1*若走这一步棋所能吃掉的对方的棋子数-0.1*若走这一步棋后对方所有可走棋位置的权重的平均值;遍历所有当前走棋方可达到位置(由函数checkObjects(nextToGo)来确定),从中选择一个得分最高的位置走棋。2、网络对战的实现: 用到Sockect,就像管道一样,任意时刻只能一方发送数据而另一方接受数据,伪码如下:if( /*当前选择的是网络对战*/ ) /*谁先走棋按随机方法产生*/ /*这一点类似操作系统中刚学的管道的用法,相当于两个联机对战的机器间建立了一个管道,并通过这个管道传递信息,一端传一端接收*/ if( /*该本机走棋了*/ ) /正常监听,并把欲走棋点坐标通过网络传给对手(同时反映在自己这一边的屏幕上,对手接受到信息后反映在他那一方) else if( /*该对手走了*/) /这边点击鼠标没任何反应,此时应等待对方动作 /有一个方法等待并接受对方传过来的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026冰雪推介会面试题目及答案
- 2026标签审核员面试题及答案
- 2026编程压力面试题及答案大全
- 2026年高考语文全国I卷作文立意解读及写作指导课件
- 汽车基础网络安全 3
- 《足部防护 铸造作业防护鞋(靴)》
- 2026年生产经营负责人员考试题库(附答案)
- 小学二年级上册科学观察
- 小学二年级下册留言条知识点巩固试卷
- 2026年国家电网职称考试(电力系统及其自动化)(副高)练习题及答案
- 14 《我们都是中国人》 第一课时(教学设计)道法统编版二年级上册(新教材)
- 液体复苏策略的“精准化”与“个体化”融合
- 2025年自治区体育局直属单位自治区体育科研中心(自治区反兴奋剂中心)面向社会工作人员(5人)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2026年高考全国I卷物理试题(附答案)
- 建筑国企合规管理培训
- 山林地置换协议书
- (零模)2026届广州市高三年级调研测试地理试卷(含答案及解析)
- 雨课堂学堂在线学堂云《劳动教育(西安理大 )》单元测试考核答案
- 药物临床试验与生物统计方法
- 2025年30道逻辑思考题及答案合编
- GB/T 41424.2-2025皮革沾污性能的测定第2部分:马丁代尔摩擦法
评论
0/150
提交评论