




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 五子棋人机对战设计方案 五子棋游戏介绍 五子棋起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠”,英译为“ 英文称之为“ “ in a 缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。 五子棋游戏方法简单,即在棋盘上走黑白棋子,可选择人机对战的一人游戏,也可选择人人对战的,两人游戏,先将五个棋子连成一串者获胜。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征 “短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。 第一章 概述 1统要求简述 本系统主要为游戏者提供了娱乐,有益于为人们的日常生活带来快乐,为人们适当的减压,另外还可以提高游戏者的反应能力,和动手能力。 1用语言概述 自从计算机问世以来,程序设计有了很大的进展。进入 20 世纪 80 年代,出现了 一种新的程序设计方法 面向对象的程序设计( ,简称 向对象的程序设计的特性,为程序设计人员提供了分析和解决问题的一种全新的方法。 C+语言是 70 年代出现的一种非常卓越的程度设计语言,是由贝尔实验室的 计的一个通用的面向对象的程序设计语言。 C+语言具有丰富的数据类型和结构化设计所需要的语句。 C+ 2 语言的特点是效率高、功能强、简洁灵活。 C+语言所具有的地址操作和位操作,是它在一定程度上具有了低级语言的特性,因而可以在 相当大的程度上,代替设计难度较大的汇编语言。目前 国际上广泛流行的计算机高级语言 ,既可用来写系统软件,也可用来写应用软件 。 1发工具 本项目所用的开发工具如表 1示 表 1发工具表 开发语言 C+ 开发环境 xp 006 开发工具 006 第二章 功能与设计思想 2机对战 程序功能 五子棋是一个经典的小游戏,游戏者打开游戏后将会看到一张棋盘 ,这时游戏者可选择人对战或者人机对战,本程序主要功能来实现人机对战,游戏者通过鼠标的移动来移动棋子,通过单击鼠标来确定棋子的最终位置,先将棋子排成五子一线者为最终获胜者。游戏结束 3 2机对战 设计思想 图 2戏的实现 先看上图,玩过五子棋的人一眼就能看出这才是一场真正的战斗!(至少它不允许你随便下棋。) 那么,我们该如何实现? 其实,只是在原来的基础上,把其中一个人用计算机代替而已。也就是说,我们只要在原来的基础上,加上计算机的下棋算法就好了。 而计算机下棋的算法,正是一个程序的重点和难点 。这里先介绍一下: 计算机是没有头脑的,但是,计算机必须下棋。那么,它该怎么办呢?我们必须自己编程序,“教”计算机下棋。然而,我们是否只是让计算机随便在棋盘上面放一颗棋子呢?事情并不是这么简单。计算机要下的那个位置,必定是它认为最好的!当然,这里的最好是程序员给予计算机的,是计算机算法的体现。 最好的位置,人都难以保证! 但是,计算机可以。这正是计算机能够在我们这个社会迅速发展的一个重要原因。当然,计算机的可以是建立在人的程序的基础上的。计算机的会是依赖于它的速度,人所不能及的速度。 上面说过,为什么要把数 组的值赋值为 1 和 不是 0, 1 或者其它的数字呢?这里就涉及到数字的妙用。前面说了,五个连续棋子的值相加,如果绝对值是五,则不是五个棋子同色,应该结束游戏。那么,如果绝对值不是五呢?它就没有意义了吗?不是!不但不是, 4 而是它有着更重要的意义。它关系到我们这个程序的几乎全部的算法。下面细说(数字是表示绝对值的): 4: 表示五个棋子中有一个空位置和四个同色的棋子。 3: 表示五个棋子中有两个空位置和三个同色的棋子; 也表示五个棋子中有四个同色棋子和一个异色棋子。 注意:此时没有空位置,可以不考虑。 2: 表示五个棋子中有三个空位置和两个同色棋子; 也表示五个棋子中一个空位置和三个同色棋子和一个异色棋子; 1、 0: 由于出现 1 和 0 的机会太少(除了开始的时候),我们不必多加考虑。但是,因为刚才对方下棋的对方必定有一定的危险,我们只需要在刚刚下棋的附近找一个空位置下棋就可以了。 第三章 五子棋人机对战 程序设计 3菜单设置 对菜单进行设置,游戏中分别添加开始,打开,退出和保存,其中开始中又包括人对人和人对机两项,并且对他们分别关联和做相应 的消息映射。 5 图 3游戏菜单 从上面图中,我们可以看到,工具栏变了。因此我们也可以想到菜单也应该变了。它们的修改如下: 修改菜单 : 删除菜单项 开始: 加菜单项 人对人游戏: 对机游戏: 改工具栏: 删除原来的按扭 对应 加两个新按扭 对应 3 变量和函数 在 中添加变量函数如下 : /保存 白棋位置 ?是人与机游戏? /这个位置空,它旁边有四个黑棋 /这个位置空,它旁边有四个白棋 /这个位置空,它的旁边有三个黑棋 /这个位置空,它的旁边有三个白棋 /这个位置空,它的旁边有两个黑棋 /这个位置空,它的旁边有两个白棋 /不是以上情况,这个位置空 /在得到最大值和方向上寻找落棋点(具体见后面介绍) /其中 i、 j 表示搜索起点, n 表示方向 i,j,n); i,j,n); i,j,n); 6 i,j,n); /计算最大值及方向 a,b,c,d); /最好落棋点 i,j); /计算机下棋 ; /在位置 下棋子 /人对人菜单 ; /人对机菜单 ; 3单函数 添加了菜单项,我们必须添加一个变量 值为 1,并约定: / 表示人对人, 1 表示人对机 / ; ; / ; ; 其中,我们只是添加一个变量,而仍然利用原来的开始函数。虽然我们的菜单项已经删除了,但它的函数还在,我们应该加以利用。 3变成计算机 下面,我们就必须把游戏双方中的一方改为计算机。我们把黑棋改为计算机,因为一般情况计算机比人强,应让人先下。当然,要是人赢了,就必须让计算机先下了,在将在以后的算法中体现。 由于下棋只是在 数中,我们把它改为如下: / or ; c; =t C); /显示棋子 /人对机 if(1) if(0&0+32,0+32,160,160,&,0, 1; ; /计算机下棋 ; /人对人 if(2) if(0&0+32,0+32,160,160,&,0, 1; if(=0) 0+32,0+32,160,160,&,0, 由上面可知,我们对人对机游戏的方法是采用:人下完了之后,检查是否胜利,是则结束游戏,重新开始,并改为黑棋(即计算机)先下;如果人没有胜利,也改为计算机下。而对于计算机怎么下棋,我们只是用了一个函数 表示。但是现在我们并不能运行程序,因为有一个没有定义的函数,怎么办呢? 仔细看程序的话,你还会发现一个变量 是后来添加的它的用处是保存刚才白棋下的位置,有利于黑棋下棋时的定位。 接着,我们的主要问题就是实现 函数,让计算机能够自动下 棋! 3算机下棋 计算机是怎样下棋?这就是定位的问题了。即搜索棋盘,找出一个最佳点,放下黑棋。 8 我们实现的方法是:全盘搜索,并把搜索到的位置,保存在变量。由于有多种情况,我们定义变量如下: ,它旁边有四个黑棋 ,它旁边有四个白棋 ,它的旁边有三个黑棋 ,它的旁边有三个白棋 , 它的旁边有两个黑棋 ,它的旁边有两个白棋 ,这个位置空 并在搜索之前都赋值为( 然后,进行搜索,并把相应的值保存在相应变量里面,而如果前面已经对变量赋值,我们依然赋值,用新值代替旧值。注意:我们只保存最后一个值,这样的一个好处是,避免了每次都从左上角开始,并且它的随机性比随机函数还随机。 全盘搜索完之后,由于上面的变量中至少有一个已经被赋值,即不是( 我们可以采用多数优先的方法,让已经有多个同 色棋子的位置先下棋。其原理是,如果已经有四个黑棋,计算机再下一个黑棋就赢了;否则,如果人已经有四个白棋,那么计算机就必须放下一个黑棋,阻止白棋下一步赢;如果已经有三个黑棋,再下一个黑棋,变成四个;否则,如果已经有三个白棋,下一个黑棋,破坏它;两个棋子的同理;否则,在刚才白棋下的地方,顺便找一个位置,下棋。 函数如下: /轮到计算机下棋 /把各种情形赋值为如下 1); 1); 1); 1); 1); 1); 1); /搜索最好的落棋点 i=0;0+32,0+32,160,160,&,0, ,而现在 /数用的是数组棋盘的坐标,所以必须转换 x=0+30; y=0+30; 3索最佳落棋点 10 现在就剩下 i,j)函数没有定义了(虽然前面的变量函数已经说明了,当时我们这里是用程序扩展的思路进行的,故如此说明)。它的 实现原理是:在四个方向上,各自计算那个方向上棋子的状态,我们的思路是利用原来定义的白棋为 1,黑棋为 思想,让同个方向上的五个棋子的值相加,取绝对值并赋值给为这个方向定义的局部变量i。 为什么要用五个棋子的值相加呢?因为,如果几个棋子是同色的,无论黑白,它的绝对值必然大,而对于几个棋子中有黑棋和白棋的,其值必然相加而抵消变小。所以我们可以利用这种方法来寻找旁边有多个同色棋子的空位置(前面已经具体说明)。 在每一个棋盘位置,计算以它为起点的四个方向(横、竖、撇、捺),再比较这四个方向中哪 个值最大,然后在这个方向上寻找落棋点。我们添加函数如下: /检查四个方向,各算出五个棋子的和并赋值 i,j) /四个方向的值 ; a,k; / a=0; if(&(j=b) ; y=a; ; y=b; if(c ; y=c; if(d ; y=d; 而另外的四个函数,有其相似性,分别介绍如下: 3大函数的实现与功能 12 i,j,n)函数 如果最大值是四,它必然有一个空位置;我们可以这样计算,如果第一个是空,那我们把它赋值给相应变量;否则,先找那个空位置,然后判断第一个棋子的颜色,并赋相应的值。 /由于相似,下面代码只解释第一个方向 /有四个同色棋 i, j, n) k; / if(n=0) k=0;k5;k+) /如果第一个是空 if(ij=0) /如果下面有白棋 if(i+1j=1) /下面位置可以下棋,已经有四个白棋 x=i; y=j; /下面位置可以下棋,已经有四个黑棋 x=i; y=j; /如果找到下棋位置,一定能找到! if(i+kj=0) /如果第一个是白棋 if(jj=1) x=i+k; y=j; /否则第一个是黑棋 x=i+k; y=j; / | if(n=1) k=0;k5;k+) if(ij=0) 13 if(ij+1=1) x=i; y=j; x=i; y=j; if(ij+k=0) if(ij=1) x=i; y=j+k; x=i; y=j+k; / if(n=2) k=0;k5;k+) if(ij=0) if(i+1j+1=1) x=i; y=j; x=i; y=j; if(i+kj+k=0) if(ij=1) x=i+k; y=j+k; 14 x=i+k; y=j+k; / / if(n=3) k=0;k5;k+) if(ij=0) if(j+1=1) x=i; y=j; x=i; y=j; if(j+k=0) if(ij=1) x=y=j+k; x=y=j+k; i,j,n)函数 如果最大值是三,它有两种情况,一种是三个同色和两个空;一种是四个同色和一个异色。前一种必定能找到一个空位置,赋值;后一种必定找不到空位置,不赋值。所以我们的想法很简单,先找到空位置,证明有三个同色,这对于玩五子棋来说三个同色是很重要的,再判断是哪种颜色,赋相应的值。 /最多有三个同色 i, j, n) k=0; / 15 if(n=0) k=0;k5;k+) /找到位置 if(i+kj=0) /下一个是白棋 if(i+k+1j=1) /下面位置可以下棋,已经有三个白棋 x=i+k; y=j; /下一个是黑棋 if(i+k+1j= x=i+k; y=j; / | if(n=1) k=0;k5;k+) if(ij+k=0) if(ij+=1) x=i; y=j+k; if(ij+k+1= x=i; y=j+k; / if(n=2) k=0;k5;k+) if(i+kj+k=0) if(i+k+1j+k+1=1) x=i+k; y=j+k; if(i+k+1j+k+1= x=i+k; y=j+k; / / if(n=3) k=0;k5;k+) if(j+k=0) if(j+k+1=1) 16 x=y=j+k; if(j+k+1= x=y=j+k; i,j,n)函数 如果最大值是二,也有两种情况:一种是有两个同色和三个空位置;一种是有三个同色和一个异色和一个空位置,并且只算三个同色不连在一起的情况(因为如果有三个连续的情况,重全盘搜索的角度看,必然会被另外的情况所代替)。 分两种算法:一种是有一个空位置,一种是有三个空位置。前者先找到空位置,再判断它下面两个是否同色,同色则赋值给相应变量,异色则不赋值,因为意义 不大;后者只要找到一个空位置就行了。 /最多有两个同色 i, j, n) k=0,m=0,a=0,b=0; / if(n=0) /判断有多少个空位置 k=0;k5;k+) if(i+kj=0) m+=1; /如果只有一个空位置 if(m=1) a=0;a5;a+) /找到空位置 if(i+aj=0) /下面两个棋子值的和 b=i+a+1j+i+a+2j; /都是黑棋 if(b= /下面位置可以下棋,旁边有两个黑棋 x=i+a; y=j; /都是白棋 if(b=2) x=i+a; y=j; /如果有三个空位置,说明另外两个同色 17 if(m=3) a=0;a5;a+) /如果两个是黑棋 if(i+aj= b=0;b5;b+) /如果找到空位置 if(i+bj=0) /下面位置可 以下棋,旁边有两个黑棋 x=i+b; y=j; (i+aj=1) b=0;b5;b+) if(i+bj=0) x=i+b; y=j; / | m=0; if(n=1) k=0;k5;k+) if(ij+k=0) m+; if(m=1) a=0;a5;a+) if(ij+a=0) b=ij+a+1+ij+a+2; if(b= x=i; y=j+a; if(b=2) x=i; y=j+a; if(m=3) a=0;a5;a+) if(ij+a= b=0;b5;b+) 18 if(ij+b=0) x=i; y=j+b; if(ij+a=1) b=0;b5;b+) if(ij+b=0) x=i; y=j+b; / m=0; if(n=2) k=0;k5;k+) if(i+kj+k=0) m+; if(m=1) a=0;a5;a+) if(i+aj+a=0) b=i+a+1j+a+1+i+a+2j+a+2; if(b= x=i+a; y=j+a; if(b=2) x=i+a; y=j+a; if(m=3) a=0;a5;a+) if(i+aj+a= b=0;b5;b+) if(i+bj+b=0) x=i+b; y=j+b; if(i+aj+a=1) 19 b=0;b5;b+) if(i+bj+b=0) x=i+b; y=j+b; / / m=0; if(n=3) k=0;k5;k+) if(j+k=0) m+; if(m=1) a=0;a5;a+) if(j+a=0) b=j+a+1+j+a+2; if(b= x=y=j+a; if(b=2) x=y=j+a; if(m=3) a=0;a5;a+) if(j+a= b=0;b5;b+) if(j+b=0) x=y=j+b; if(j+a=1) b=0;b5;b+) if(j+b=0) x=y=j+b; 20 i,j,n)函数 最后的一个函数是 i, j, n),这是为了预防用的,如果以上情况不发生怎么办,总该下棋吧!而这个函数就是为了它而生的。这里就说明了为什么我们要添加 原因了,它保存了上次白棋下棋的位置,而我们在没有办法的情况下,也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年度注册公用设备工程师常考点试卷及答案详解【夺冠系列】
- 安全教试题及答案
- 乐高碰撞测试题及答案
- 能源互联网背景下的智能电网重构研究-洞察阐释
- 基于AI的能源消耗预测与优化研究-洞察阐释
- 出租车公司新能源汽车运营权与股权转让合同
- 2025年四川省非全日制新劳动合同书样本
- 茶园资源整合与茶叶产业链承包合同
- 时尚家居定制安装与售后保修合同
- 2025国内货物买卖合同范本示例
- 2024年攀枝花市仁和区向招考社区工作者真题
- 2024-2025学年人教版数学一年级下学期期末模拟试卷(含答案)
- 安徽省合肥一中2025届高三最后一卷英语试题及答案
- 有关工厂实习心得体会模版
- 2025年组织行为学专业考试试题及答案
- 智能化汽车中的专利战略布局-洞察阐释
- 不寐的中医护理常规
- 天津市两学校2025届生物七下期末达标检测试题含解析
- 创新设计思维
- 2024年新疆维吾尔自治区、新疆生产建设兵团中考语文试卷(含答案与解析)
- 客诉处理培训课件
评论
0/150
提交评论