基于Android技术的中国象棋人机对弈游戏的设计与实现.doc_第1页
基于Android技术的中国象棋人机对弈游戏的设计与实现.doc_第2页
基于Android技术的中国象棋人机对弈游戏的设计与实现.doc_第3页
基于Android技术的中国象棋人机对弈游戏的设计与实现.doc_第4页
基于Android技术的中国象棋人机对弈游戏的设计与实现.doc_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

西安邮电大学 毕 业 设 计(论 文)题 目:基于android技术的中国象棋人机对 弈游戏的设计与实现 目 录摘 要iabstractii1 绪论11.1 研究背景11.1.1中国象棋背景11.1.2 android系统简介11.2 本论文研究意义32设计相关技术理论52.1 游戏系统开发平台及搭建52.2 可行性研究63游戏系统功能分析与设计73.1 界面的需求分析73.2游戏走棋需求设计分析73.3类框架的设计84 游戏系统的设计与实现94.1游戏界面的设计94.1.1 共有类chessactivity的实现94.1.2 辅助界面相关类的实现94.1.3 游戏界面相关类的实现94.2 中国象棋的规则及走法的实现104.2.1行棋规则104.2.2棋盘的表示224.3 游戏人机会话的实现234.3.1 着法的生成234.3.2 搜索算法244.3.3 局面评估265 游戏系统模块的设计实现285.1 欢迎界面285.2菜单界面285.3 帮助界面305.4游戏界面306 运行测试347 结束语35致 谢36参考文献37附录:38译文48基于android技术的中国象棋人机对弈游戏的设计与实现摘 要 中国象棋是一款智力休闲游戏,具有历史悠久而且拥有巨大的游戏爱好者群体,他们以中国象棋陶冶情操、锻炼智力、体验象棋带来的快乐,中国象棋还是一个老少皆宜的娱乐游戏。随着手持设备、智能手机的普及,搭载android操作系统的智能手机也已经走进了千家万户,当人们闲暇偶尔需要娱乐时,却发现没有实物象棋,该软件不失为一个很好的替代品,供大家进行娱乐享受,尤其是在现在这个快节奏的社会中 ,人们更满足于手机的使用,可以方便地随意移动,不像实物象棋那样静静的坐着。 本论文通过实际应用软件的开发深入分析和研究android开发技术。实现中国象棋的人机会话。本文实现了中国象棋在计算机中表示问题,基于android平台应用,人机对战模拟现实中的人人对战;讨论走棋规则和着法的实现等一系列问题,最终电脑能够通过产生着法,搜索,估计来产生一步最优的走棋,实现人机会话的目的。关键字:中国象棋,android,智能手机,人机对战abstract chinese chess is an intellectual casual games, has a long history and has a huge game enthusiasts groups, chinese chess edify sentiment, exercise intelligence, experience the joy of chess brought chinese chess is an entertainment for all ages games. with the popularity of handheld devices and smart phone, smart phone equipped with android operating system has entered every household, when people leisure occasionally need entertainment, but found no physical chess, the software would be a good substitute for entertainment, especially in this fast-paced society, people are more satisfied with the use of mobile phones, you can easily move freely, unlike physical chess as sitting quietly. with the development for the practical application of software, android development technology was deeply analyzed and researched to achieve human-machine chess battle of chinese chess in this thesis. this article realization of the chinese chess in the computer representation that the problem, based on the application of android platform, a series of questions were discussed about the man-machine war simulate and related playing chess rules and achieving chess moves. finally, the computer products a best way for computer moves to achieve the purpose of man-machine war with the chess moving and searching and estimating.keywords: chinese chess,android,smart phone,man-machine wari1 绪论1.1 研究背景1.1.1中国象棋背景中国象棋发展至今已有两千三、四百年的历史,早在战国时期就有正式的记载,堪称中国的国粹。中国象棋具有悠久的历史,深的人们的喜爱,象棋的爱好者也更是数不胜数,远在战国中国象棋便在贵族阶层广为流传,早期的象棋是象征着当时战斗场面的游戏,后来这种观念慢慢被改变,经过千年的流传不断的完善和改进,成为人们休闲娱乐、锻炼脑力思维不可获取的好方式。中国象棋体现的是一种策略,方寸之间包含天地玄机,人生哲理,使人越是细玩越觉其味悠然深远。由于简单的行棋规则,趣味性强,便捷的载体,使得象棋成为雅俗共赏的竞技项目。因此,也成为流行极为广泛的棋艺活动。是我国正式开展的78个体育项目之一,为促进该项目在世界范围内的普及和推广,在中国古代,象棋被列为士大夫们的修身之艺,现在则被视为怡神益智的一种有益的活动。有着数以亿计的爱好者。它不仅能丰富文化生活,陶冶情操,在棋战中,人们可以从攻与防、虚与实、整体与局部等复杂关系的变化中悟出某种哲理;更有助于开发智力,启迪思维,锻炼辨证分析能力和培养顽强的意志。象棋是中华民族的传统文化,不仅在国内深受群众喜爱,而且流传国外。1.1.2 android系统简介android 系统构架简介:android是一个基于linuxv2.6内核的交互性操作环境,同时它也是一个分层系统,android系统架构显示如下图1.1。图.a系统构架图 应用层由所有的android应用程序组成。其中包括电子邮件客户端,sms程序,地图,浏览器,联系人及其他。所有的应用程序都是用java编程语言编写的。 应用框架层定义了android应用程序框架。所有的android应用程序都是基于应用框架的。android应用框架包括:l 丰富及可扩展性的视图,可以用来建立一个美观的用户界面,包括列表,网格,文本框,按钮,甚至是嵌入到web浏览器的应用程序。 l 一组内容提供商,使应用程序能够访问其他应用程序的数据(如电话簿),或共享自己的数据。l 资源管理器提供了访问的非编码资源的途径,如本地化的字符串,图形,布局文件。l 通知管理器允许所有应用程序显示定制的提示或通知在状态栏里。l 活动管理器可以管理应用程序的生命周期,并提供一个通用的后台堆栈导航。 库层包括了一套被各类android 系统组件使用的c / c + +库并对应用程序框架提供支持。 android 的运行环境包括一套核心库和 java 虚拟机(dalvik虚拟机),已经由谷歌重新设计和优化来适合android平台。 linux 内核位于 android 系统的底层并作为硬件和软件之间的一个抽象层。它提供了核心系统服务,如安全,内存管理,进程管理,网络协议栈和驱动模型。此外,一些底层功能如 dalvik 虚拟机线程管理也依赖于linux内核。android应用新特点作为一个新的操作系统,一方面,android 可以受益于其他的成熟的操作系统的技术。另一方面,android 也会改善出现在其他操作系统上的缺陷。对于开发商的前瞻性,android系统具有以下新的特点: 允许一个应用程序被明确的定义。android应用程序中,所有的组件可以通过系统独立启动,不过需要在一个xml文件名为androidmanifest的文件中被声明。androidmanifest做许多另外声明应用的组件的东西,包括:l 定义一些应用所需要的用户权限,如互联网接入。仅定义应用程序需要的权限和应用程序必须执行的操作权限。l 声明应用程序所需的最低api级别。l 定义硬件和软件的使用或应用程序所需的功能。l 声明api函数库的应用需要被对应的链接。资源和代码是分开的。在android中,所有的非代码资源是在xml文件中定义。对于每一个包括在 android 项目中的资源,sdk构建工具定义一个唯一的整数id,它可以用来参考从应用程序代码的资源或从xml文件中定义其他资源。提供单独的资源可以从源代码中很容易地更新应用程序的不同特性,从而无需修改代码。同时通过提供一套替代资源集,使开发人员能够针对各种设备配置优化中的应用,如不同的语言和屏幕尺寸。android作为一个完整的,开放的和自由的移动设备平台,凭借其强大的功能和良好的用户体验迅速发展成为最流行的移动操作系统。本文给出了关于android应用框架和android应用程序的主要工作的详细介绍。最后,推出了android平台上的音乐播放器作为一个例子来说明了这个机制。1.2 本论文研究意义 中国象棋是一项智力和策略的游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。控制计算机的是人类,而人机会话综合性很强的一门边缘学科,它的中心任务是研究使计算机如何去做那些过去只能靠人的智力才能做的工作。因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。 本次论文的研究,主要是对中国象棋在android系统中的兼容行性,对游戏界面可观性,游戏中人机会话的研究。对于游戏中的人机会话的要点:a 某种在及其上表示棋局的方法,让程序知道会话的状态;b 产生合法的走棋法则,使得会话双方公正,并可以判断人类对手是否乱走;c 从所有和法定的走法中选择最佳的走法的技术;d 一种评估局面优化的方法,同上面技术配合做出智能选择;e 一个实现游戏的界面;通过对游戏的设计,来实现游戏中棋牌的表示,着法的生成,对着法的搜索,最后对局面的评估来实现中国象棋的人机会话。2设计相关技术理论2.1 游戏系统开发平台及搭建jdk和 eclipse:jdk是sun公司针对java开发员的产品。自从java推出以来,jdk已经成为使用最广泛的java sdk。jdk是整个java的核心。包括运行环境java工具和java基础类库。jdk是学好java的第一步。安装eclipse的开发环境需要jdk的支持,如果没有jdk,则启动eclipse时会报告错误。在windows上安装jdk非常简单首先在sun官网上下载,按照默认路径进行安装。安装完成之后,可以在检查jdk是否安装成功。打开cmd窗口,输入java version 查看jdk的版本信息。出现类似下面的画面表示安装成功了: 图 2.1 jdk测试eclipse如果你还没有eclipse的话,从官网上下载eclipse ide for java developers解压之后即可使用。android sdkandroidsdk 提供了在 windows 平台上的开发安卓应用程序的开发组件,也就是说,不论读者使用什么样的平台都可以开发出安卓平台的应用软件,其中包含了安卓平台上开发移动应用的各种工具集。它不仅包括了安卓模拟器和用于eclipse的安卓开发工具插件(adt),而且包括了各种用来调试,打包盒在模拟器上安装应用的工具。安卓主要是以 java 语言为基础,用户可以使用 java 语言来开发 安卓平台上的软件应用。通过sdk提供的一些工具将其打包成安卓平台使用的apk文件,然后在使用sdk中的模拟器(emulator)来模拟和测试软件在安卓平台运行情况和效果。安装安卓的sdk,安装好jdk和eclipse后,打开eclipse ide。依次单击menu项中的windows-android sdk manager项,进入android sdk manager界面选择tool和需要的android版本项进行更新安装。adtandroid为eclipse定制了一个插件,及adt(android development tools),目的是为用户提供一个强大的综合环境用于开发android应用程序,adt扩展了eclipse的功能,可以让用户快速的建立android项目,创建应用程序界面,在基于android api的基础上添加组件,以及用sdk工具集调试应用程序,甚至导出签名(或未签名)的apks以便发行应用程序。安装android development tool plug-in,打开 eclipse ide。依次单击menu项中的help-software update项2.2 可行性研究 本次毕业设计的题目是:基于android技术的中国象棋人机对弈游戏的设计与实现;主要是在基于android平台开发一个手持设备应用游戏,使得游戏具有兼容性和人机会话;并对整个系统分析,设计过程给出一个论证。中国象棋游戏是棋牌类游戏,体现的是一种策略。对于行棋走棋不同的棋子有不同走棋规则,走棋都必须按照走棋规则要求,双方轮换走棋,吃子,将军。本游戏设计无疑是模拟现实人人博弈,虚拟的替换了真实的棋子棋盘,由人来和电脑直接对弈;在一个人闲暇时也可以体验博弈的乐趣。该应用游戏的设计主要从以下几方面做起:系统流程分析、系统的功能设计、系统的数据结构设计。做好这些工作需要对android开发平台了解,并搭建平台;深入了解数据结构、android应用程序以及各种组件(api)库函数。3游戏系统功能分析与设计3.1 界面的需求分析 通过以往手持设备游戏的体验,和用户对中国象棋游戏需求逻辑,游戏的功能以及操作方法把整个设计划分成单元;先是运行游戏,进入欢迎游戏界面,随后单击欢迎界面的图片进入菜单界面,在菜单中可以点击“打开声音”/“关闭声音”按钮来控制声音开关,单击“帮助”菜单可以进入帮助界面显示游戏操作方法,而在菜单界面单击“开始游戏”菜单将进入游戏主界面开始游戏,在游戏界面玩家可以通过单击自己的棋子按照行棋规则来走棋,同时可以单击声音按钮打开关闭声音,当游戏一方的“将”或者敌方的“帅”被吃掉是,会出现游戏失败或游戏胜利的界面,在游戏过程中玩家可以随时通过单击“退出”按钮返回到游戏主菜单,主菜单中还可以点击“退出游戏”结束关闭游戏。3.2游戏走棋需求设计分析进入游戏界面,游戏提示当前走棋为“帅”或者“将”,双方各走一着,直至分出胜负或者直接点击退出结束游戏,轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走一着,双方各走一着即一个回合,吃子时,任何棋子走动,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,即屏幕上消失在显示自己的棋子。玩家走完棋后电脑相对应搜索出自己相对应的走法。程序需要让计算机在轮到它走子的时候能够执行一步它认为最有利的着法,而不是乱走;那么它就要有在诸多可供选择的着法,提供所有候选着法的列表就是着法生成器所要完成的。之后用搜索函数来搜索列表,并用局面评估函数逐一打分,最后就可以选择出最佳着法并执行。3.3类框架的设计通过对中国象棋游戏的了解,对基于android技术的中国象棋人机对弈游戏的需求分析,游戏实现的理解并结合自己对知识点所掌握的程度;对中国象棋游戏总体设计,主要由三个类组成:共有类,辅助界面相关类,游戏界面相关类。共有类是activity的实现类chessactivity,该类是通过扩展基类activity得到的,是整个游戏的控制器,也是整个游戏程序的入口;辅助界面相关类由welcomeview欢迎界面类(该类为游戏欢迎界面的实现类,主要负责欢迎界面的绘制工作),helpview帮助界面类(该类为帮助界面的实现类),menuview菜单界面类(该类为菜单界面的实现类,负责绘制菜单界面以及对菜单界面的屏幕进行监听)三个类实现;游戏界面相关类由gameview游戏界面类(该类为游戏程序中最主要的类,负责绘制游戏过程中所有的信息,如棋盘、棋子、各个按钮以及胜利或失败菜单等),guize象棋规则类(该类是象棋规则的实现类,其中包含所有棋子的走棋规则以及当前棋牌所有可能走法),chessmove走法类(该类为棋子的走法的封装类,包括棋子的名称,出发点以及目标点)searchengine 类和negamaxengine类对当前棋局进行搜索,搜索出最优的走棋着法; eveluation类和 constdata类对棋局的评估,通过评估给出当前棋局分数;几个类组成。之间关系如图所示: 图 3.1 游戏类框架图4 游戏系统的设计与实现4.1游戏界面的设计 4.1.1 共有类chessactivity的实现 该类的主要作用是通过接受handler消息变量,根据各个界面发送的handler消息的类型判断所需要执行的操作。在适当的时间初始化相应的用户界面,各个界面初始化方法被调用时,并根据其他界面的需求直接将用户界面切换到相应的界面 4.1.2 辅助界面相关类的实现 该游戏的第一个用户界面即欢迎界面,通过welcomeview类来实现该界面加载了一个欢迎中国象棋图片,并通过监听触击屏幕图片,向activity发送handler消息通知控制器切换用户界面;然后切换到菜单界面menuview。 menuview类中通过监听“开始游戏”切换到游戏界面;通过监听“打开声音”/“关闭声音”进行声音的打开与关闭,与此同时“打开声音”、“关闭声音”按钮进行切换;通过监听“帮助”来切换都帮助界面;通过监听“退出游戏”结束游戏用行退出游戏。 帮助界面helpview,该类中加载图片,图片中显示该游戏“怎么玩”同时监听“返回”按钮,向activity发送handler消息通知控制器切换用户界面从而返回到菜单界面。 4.1.3 游戏界面相关类的实现游戏界面gameview,该类是整个程序中最主要的类,该类首先是绘制屏幕上的内容棋盘和对应的棋子。提示一方先走;当“黑帅”或者“红将”被吃的话,弹出您赢了或者您输了通过监听结束游戏切换到菜单界面。或者点击退出按钮也可结束游戏切换至菜单界面。监听声音按钮来控制声音的开与关并以红色显示声音开,消失即为关。在游戏过程中,电脑走棋通过调动negamaxengine类中的search()函数调动guize类中的 allpossiblemoves()产生所有可能的走棋着法,然后在通过eveluation类和constdata类来对当前棋局进行评估得分。给不同的棋子不同的位置给不同的棋子基本值,棋子灵活价值,棋子被威胁价值,棋子被保护价值;按照算法计算出走法的价值,最后对所有的价值进行比较,价值高的也就是最终的要查找最优走棋着法。4.2 中国象棋的规则及走法的实现 4.2.1行棋规则中国象棋分为红黑双方,以楚河汉界为分界线,双方各执16字,分别为2车2马2相2仕2炮1将5卒,各自走法不同,具体如下:车:只可以走直线,且一步可以走任意距离,且起始点与目标点之间不得存在其他棋子。车吃子的条件是与目标棋子在一条直线上,且两子之间不得存在任何其他的棋子。红黑车规则走法的介绍: 图. 車的走法 if(fromy != toy & fromx != tox) / /只能走直线return false;if(fromy = toy) / /走横线if(fromx tox) / /向右走for(i = fromx + 1; i tox; i+) / /循环if(qizifromyi != 0)return false; / /返回falseelse / /向左走for(i = tox + 1; i fromx; i+) / /循环if(qizifromyi != 0)return false; / /返回falseelse / /走的是竖线if(fromy toy) / /向右走for(j = fromy + 1; j toy; j+)if(qizijfromx != 0)return false; / /返回falseelse / /向左走for(j= toy + 1; j fromy; j+) if(qizijfromx != 0)return false; / /返回falsebreak;马:只可以走“日”字方格,因此一匹马的最理想落子点有8个,但存在绊马腿的情况,即从马的位置到要走到的目标位置,顺着此方向,“日”字方格有两个方向,即两格长度和一个长度,马紧挨的两格长度方向的位置不能有子,否则即被绊住,不能走动。若目标位置为空,即可走过,若为对方的棋子,即可吃掉。 图. 马的走法红黑马规则走法的介绍:if(!(math.abs(tox-fromx)=1 & math.abs(toy-fromy)=2)| (math.abs(tox-fromx)=2 & math.abs(toy-fromy)=1)return false; / /马走的不是日字时if(tox-fromx=2) / /向右走i=fromx+1; / /移动j=fromy;else if(fromx-tox=2) / /向左走i=fromx-1; / /移动j=fromy;else if(toy-fromy=2) / /向下走i=fromx; / /移动j=fromy+1;else if(fromy-toy=2)/ /向上走i=fromx;/ /移动j=fromy-1;if(qiziji != 0)return false;/ /绊马腿break;炮:只可以走直线,且一步可以走任意距离,其起始点与目标点之间不得存在其他棋子。炮吃子的条件是与目标棋子在一条直线上,且两子之间必须有且只有一个棋子作为“跳板”,让炮进行跳跃式攻击。红黑炮规则走法的介绍: 图. 炮的走法if(fromy!=toy & fromx!=tox)/ /炮走直线return false;/ /返回falseif(qizitoytox = 0)/ /不吃子时if(fromy = toy)/ /横线if(fromx tox)/ /向右走for(i = fromx + 1; i tox; i+)if(qizifromyi != 0)return false;/ /返回falselse/ /向走走for(i = tox + 1; i fromx; i+)if(qizifromyi!=0)return false;/ /返回falseelse / /竖线if(fromy toy)/ /向下走for(j = fromy + 1; j toy; j+)if(qizijfromx != 0)return false;/ /返回falseelse/ /向上走for(j = toy + 1; j fromy; j+)if(qizijfromx != 0)return false;/ /返回falseelse/ /吃子时int count=0;if(fromy = toy)/ /走的是横线if(fromx tox)/ /向右走for(i=fromx+1;itox;i+)if(qizifromyi!=0)count+;if(count != 1)return false;/ /返回falseelse/ /向左走for(i=tox+1;ifromx;i+)if(qizifromyi != 0)count+;if(count!=1)return false;/ /返回falseelse/ /走的是竖线if(fromytoy)/ /向下走for(j=fromy+1;jtoy;j+)if(qizijfromx!=0)count+;/ /返回falseif(count!=1)return false;/ /返回falseelse/向上走for(j=toy+1;jfromy;j+)if(qizijfromx != 0)count+;/ /返回falseif(count!=1)return false;/ /返回falsebreak;卒、兵:一步只可以走过一个方格的距离。当兵卒位于己方阵营时,只可以向前走动。当兵卒过河后到达对方阵营,可向前、向左、向右三个方向行走,即兵卒遵循的规律是绝不后退。 图. 卒的走法黑兵规则走法的介绍if(toy fromy)/ /不能回头return false;/ /返回falseif(fromy1) / /只能走一步并且是直线return false;/ /返回falsebreak;/红卒规则走法的介绍if(toy fromy)/ /不能回头return false;/ /返回falseif(fromy4 & fromy = toy)/ /过河前只能直走return false;/ /返回falseif(toy - fromy +math.abs(tox - fromx) 1) / /只能走一步并且是直线return false;/ /返回falsebreak;象、相:只可以在己方阵营走动,且仅限于7个点,即己方“田”字格上的7个点,走的是斜线,走动时,起始点与目标点构成一条斜线,若该斜线的中点位置存在其他棋子,则被绊住无法走动。 图. 象的走法黑象规则走法的介绍if(toy 4) / /不能过河return false;/ /返回falseif(math.abs(fromx-tox) != 2|math.abs(fromy -toy) != 2) / /象走“田”字return false; / /返回falseif(qizi(fromy+toy)/2(fromx+tox)/2 != 0) / /象眼处有棋子return false; / /返回falsebreak;/红相规则走法的介绍if(toy 2 |tox 5) / /出了九宫格return false; / /返回falseif(math.abs(fromy-toy) !=1| math.abs(tox-fromx)!=1)/ /走斜线return false;/ /返回falsebreak;/红仕规则走法的介绍:if(toy 7 |tox 5) / /出了九宫格return false; / /返回falseif(math.abs(fromy-toy) !=1| math.abs(tox-fromx)!=1)/ /走斜线return false;/ /返回falsebreak;将、帅:只可以在己方阵营走动,且仅限于9个点,即己方底三行中三列形成的9个交叉点,也就是俗称的“九宫”,一步只可以走动一个方格的直线距离作为本方的主将,镇守大本营,双方的主将是不能够处于同一条直线而主将之间不存在其他的棋子进行隔挡。 图.将帅的走法黑帅规则走法的介绍:if(toy 2 | tox 5) / /出了九宫格return false; / /返回falseif(math.abs(fromy - toy) +math.abs(tox - from)1) / /只能走一步return false; / /返回falsebreak;/红将规则走法的介绍:if(toy 7 | tox 5) / /出了九宫格return false; / /返回falseif(math.abs(fromy - toy) +math.abs(tox - from)1) / /只能走一步return false; / /返回falsebreak; 4.2.2棋盘的表示针对棋盘的设计,每一种棋子对应一个固定的值用以识别该棋子的类型,那么设计就根据红黑双方的棋子以及每个类型的棋子,设计规则类(guize类,调用其中的canmove方法用以判断某一步走棋的是否可行。规则类的设计则采用了常规的办法,因为棋子的种类只有7种,且红黑双方处于棋盘的两端,某些棋子走动时的方向不一样,设计时就要进行分类讨论设计,供存在14中不同的判别方法来对所以的棋子走法进行判别是否可行,每一个判别方法都对应于其独有的判断算法。棋盘上各种棋子以及棋盘的初始布局的设计采用10*9的数组来进行标识,如下图4.8所示 : 图 4.8 棋盘初始布局各个数字的对应关系如下:0-无棋子;1-黑方的帅;2-黑方的车;3-黑方的马;4-黑方的炮;5-黑方的士;6-黑方的象;7-黑方的卒;8-红方的将;9-红方的车;10-红方的马;11-红方的炮;12-红方的士;13-红方的相;14-红方的兵。坐标(0,0)到坐标(8,4)之间的坐标代表楚河汉界的一方,坐标(0,5)到坐标(8,9)之间的坐标代表楚河汉界的另一方,即红黑双方各自的领土。电脑走棋时通过构造一个走法类chessmove,创建一个对象调用negamaxengine类中的search()函数根据当前局势查询一个最好的走法记录棋子的原有位置坐标、目标位置坐标、棋子类型并对该对象进行初始化。然后根据该对象记录的原有位置坐标和目标位置坐标进行数据改变达到行棋目的。玩家走棋是通过对屏幕进行监听,从而记录棋子类型,原有位置坐标和目标位置坐标,通过调用规则类guize中的canmove判断该棋子走法是否可行符合棋子走棋规则,可行就改变原有位置和目标位置数据,达到行棋的目的轮到走棋的一方,游戏界面当前位置显示走棋一方的“黑帅”或者“红将”,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,这样一方走棋结束当前位置显示改变轮到另一方走棋。任何棋子走动,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,即在10*9数组中相应位置的数字变为自己棋子所对应的数字,自己棋子原来所在的位置对应数组的数字变为0,刷帧线程不断的刷新界面改变屏幕显示,这样对方的棋子就被吃掉,在屏幕上消失在对应显示自己的棋子;如果目标位置上没有对方棋子,10*9数组对应目标位置数字改变,原有位置数字变为0,刷帧线程更新界面改变显示。4.3 游戏人机会话的实现4.3.1 着法的生成 在着法生成器中,采用的基本思想就是遍历整个棋盘(一个接一个地查看棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列。这里的合法着法是通过象棋的行棋规则来确定;产生了着法后要将其存入着法队列以供搜索之用,由于搜索会搜索多层(即考虑双方你来我往好几步,这样才有利于对局面进行评估以尽可能避免“目光短浅”),所以在把着法存入着法队列的时候还要同时存储该着法所属的搜索层数。因此可以将着法队列定义为二维数组movelist10100,其中第一个数组下标为层数,第二个数组下标为每一层的全部着法数。关于搜索层数,设定为4,实际使用的是1到3(在界面中将其限定为13)。搜索层数的增加会显著提高电脑的下棋水平(当然计算机的棋力在很大程度上也依赖于局面评估)。在配置为1.5g,512m内存的计算机上最多只能搜索3层,再多将导致搜索时间达到令人无法容忍的地步(这里还需要特别说明的是,搜索的速度也和着法生成的效率以及局面评估的复杂度有关,因为每分析一个结点都要执行这两种操作)。对于每一层的着法数,也就是当前下棋方针对当前局面的所有可选的合法着法,据有关数据统计在象棋实战中一般最多情况下也就五六十种。定义第二个数组下标为100,应当可以保证十分的安全。4.3.2 搜索算法 中国象棋博弈为二人零和,全信息,非偶然博弈,他的特征如下:(1) 对弈的max、min双方轮流采取思考走棋,对弈的结果有三种情况:和局;max方胜,min方败;min方胜,max方败。(2) 在对弈过程中,任何一方都了解当前的格局和过去的行棋历史。(3) 任何一方在采取行动前都要根据当前的实际情况,进行得失分析,选取对自已为最有利而对对方最为不利的走法,不存在掷骰子之类的碰运气因素。即双方都是很理智地决定自己的行动。最终也就组成了一颗博弈树(如图4.9)所示 。 图 4.9 博弈树示意图 在这棵博弈树中,根节点是初始局面,一个节点下的每个分支代表一个着法,分支相连的子节点是走了这个着法后会出现的局面。由于双方交替出着在博弈过程中,任何一方都希望自己取得胜利。因此,当某一方当前有多个行动方案可供选择时,他总是挑选对自己最为有利而对对方最为不利的那个行动方案,使自己利益最大化。让始终从红方的角度来考虑。轮到红方走棋时,红方总是选择对自己最有利的着法,从而在生成的一系列子节点中寻找分值最高的局面(即max层),据此返回最佳着法;然后轮到黑方走棋,黑方也选对自己最有利的着法,但在红方看来,这个着法对自己最不利,所以从红方的角度来看,黑方就选择了分值最低的局面(即min 层),从而返回黑方的最佳着法。 可以用一个简化的博弈树模型来表示(如图4.10)所示: 在这棵树中,矩形代表红方,圆代表黑方,分别取子节点的极大/ 极小值。根据上面的描述,我们选择了第二个着法。而加粗的这条路径就是极大极小算法思考的过程。 图 4.10 博弈树搜索过程示意 下图4.11为负极大值的伪代码的实现 图 4.11 负极大值算法4.3.3 局面评估 局面评估是一个通过既有的棋类知识来评估一个局面的优劣的过程。这一过程对具体的棋类知识的依赖程度很深,但是仍有一般性的规律可循

温馨提示

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

评论

0/150

提交评论