基于Android技术的中国象棋人机对弈游戏的设计与实现Word格式文档下载.docx
《基于Android技术的中国象棋人机对弈游戏的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于Android技术的中国象棋人机对弈游戏的设计与实现Word格式文档下载.docx(55页珍藏版)》请在冰豆网上搜索。
中国象棋体现的是一种策略,方寸之间包含天地玄机,人生哲理,使人越是细玩越觉其味悠然深远。
由于简单的行棋规则,趣味性强,便捷的载体,使得象棋成为雅俗共赏的竞技项目。
因此,也成为流行极为广泛的棋艺活动。
是我国正式开展的78个体育项目之一,为促进该项目在世界范围内的普及和推广,在中国古代,象棋被列为士大夫们的修身之艺,现在则被视为怡神益智的一种有益的活动。
有着数以亿计的爱好者。
它不仅能丰富文化生活,陶冶情操,在棋战中,人们可以从攻与防、虚与实、整体与局部等复杂关系的变化中悟出某种哲理;
更有助于开发智力,启迪思维,锻炼辨证分析能力和培养顽强的意志。
象棋是中华民族的传统文化,不仅在国内深受群众喜爱,而且流传国外。
1.1.2Android系统简介
Android系统构架简介:
Android是一个基于Linux®
V2.6内核的交互性操作环境,同时它也是一个分层系统,Android系统架构显示如下图1.1。
图 1.1 Android系统构架图
应用层由所有的Android应用程序组成。
其中包括电子邮件客户端,SMS程序,地图,浏览器,联系人及其他。
所有的应用程序都是用Java编程语言编写的。
应用框架层定义了Android应用程序框架。
所有的Android应用程序都是基于应用框架的。
Android应用框架包括:
●丰富及可扩展性的视图,可以用来建立一个美观的用户界面,包括列表,网格,文本框,按钮,甚至是嵌入到Web浏览器的应用程序。
●一组内容提供商,使应用程序能够访问其他应用程序的数据(如电话簿),或共享自己的数据。
●资源管理器提供了访问的非编码资源的途径,如本地化的字符串,图形,布局文件。
●通知管理器允许所有应用程序显示定制的提示或通知在状态栏里。
●活动管理器可以管理应用程序的生命周期,并提供一个通用的后台堆栈导航。
库层包括了一套被各类Android系统组件使用的C/C++库并对应用程序框架提供支持。
Android的运行环境包括一套核心库和Java虚拟机(Dalvik虚拟机),已经由谷歌重新设计和优化来适合Android平台。
Linux内核位于Android系统的底层并作为硬件和软件之间的一个抽象层。
它提供了核心系统服务,如安全,内存管理,进程管理,网络协议栈和驱动模型。
此外,一些底层功能如Dalvik虚拟机线程管理也依赖于Linux内核。
Android应用新特点
作为一个新的操作系统,一方面,Android可以受益于其他的成熟的操作系统的技术。
另一方面,Android也会改善出现在其他操作系统上的缺陷。
对于开发商的前瞻性,Android系统具有以下新的特点:
允许一个应用程序被明确的定义。
Android应用程序中,所有的组件可以通过系统独立启动,不过需要在一个XML文件名为AndroidManifest的文件中被声明。
AndroidManifest做许多另外声明应用的组件的东西,包括:
●定义一些应用所需要的用户权限,如互联网接入。
仅定义应用程序需要的权限和应用程序必须执行的操作权限。
●声明应用程序所需的最低API级别。
●定义硬件和软件的使用或应用程序所需的功能。
●声明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已经成为使用最广泛的javaSDK。
JDK是整个java的核心。
包括运行环境Java工具和Java基础类库。
JDK是学好Java的第一步。
安装Eclipse的开发环境需要JDK的支持,如果没有JDK,则启动Eclipse时会报告错误。
在windows上安装JDK非常简单首先在Sun官网上下载,按照默认路径进行安装。
安装完成之后,可以在检查JDK是否安装成功。
打开cmd窗口,输入java–version查看JDK的版本信息。
出现类似下面的画面表示安装成功了:
图2.1JDK测试
Eclipse如果你还没有Eclipse的话,从官网上下载EclipseIDEforJavaDevelopers解压之后即可使用。
AndroidSDK
AndroidSDK提供了在windows平台上的开发安卓应用程序的开发组件,也就是说,不论读者使用什么样的平台都可以开发出安卓平台的应用软件,其中包含了安卓平台上开发移动应用的各种工具集。
它不仅包括了安卓模拟器和用于Eclipse的安卓开发工具插件(ADT),而且包括了各种用来调试,打包盒在模拟器上安装应用的工具。
安卓主要是以java语言为基础,用户可以使用java语言来开发安卓平台上的软件应用。
通过SDK提供的一些工具将其打包成安卓平台使用的apk文件,然后在使用SDK中的模拟器(Emulator)来模拟和测试软件在安卓平台运行情况和效果。
安装安卓的SDK,安装好JDK和Eclipse后,打开EclipseIDE。
依次单击Menu项中的windows->
AndroidSDKManager项,进入AndroidSDKManager界面选择Tool和需要的Android版本项进行更新安装。
ADT
Android为Eclipse定制了一个插件,及ADT(AndroidDevelopmentTools),目的是为用户提供一个强大的综合环境用于开发Android应用程序,ADT扩展了Eclipse的功能,可以让用户快速的建立Android项目,创建应用程序界面,在基于AndroidAPI的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名(或未签名)的APKs以便发行应用程序。
安装AndroidDevelopmentToolplug-in,打开EclipseIDE。
依次单击Menu项中的Help->
SoftwareUpdate项
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卒,各自走法不同,具体如下:
车:
只可以走直线,且一步可以走任意距离,且起始点与目标点之间不得存在其他棋子。
车吃子的条件是与目标棋子在一条直线上,且两子之间不得存在任何其他的棋子。
红黑车规则走法的介绍:
图 4.1車的走法
if(fromY!
=toY&
&
fromX!
=toX){//只能走直线
returnfalse;
}
if(fromY==toY){//走横线
if(fromX<
toX){//向右走
for(i=fromX+1;
i<
toX;
i++){//循环
if(qizi[fromY][i]!
=0){
returnfalse;
//返回false
}
}
}
else{//向左走
for(i=toX+1;
fromX;
if(qizi[fromY][i]!
returnfalse;
}
else{//走的是竖线
if(fromY<
toY){//向右走
for(j=fromY+1;
j<
toY;
j++){
if(qizi[j][fromX]!
=0)
//返回false
for(j=toY+1;
fromY;
if(qizi[j][fromX]!
returnfalse;
//返回false
break;
马:
只可以走“日”字方格,因此一匹马的最理想落子点有8个,但存在绊马腿的情况,即从马的位置到要走到的目标位置,顺着此方向,“日”字方格有两个方向,即两格长度和一个长度,马紧挨的两格长度方向的位置不能有子,否则即被绊住,不能走动。
若目标位置为空,即可走过,若为对方的棋子,即可吃掉。
图 4.2马的走法
红黑马规则走法的介绍:
if(!
((Math.abs(toX-fromX)==1&
Math.abs(toY-fromY)==2)
||(Math.abs(toX-fromX)==2&
Math.abs(toY-fromY)==1))){
//马走的不是日字时
}
if(toX-fromX==2){//向右走
i=fromX+1;
//移动
j=fromY;
elseif(fromX-toX==2){//向左走
i=fromX-1;
elseif(toY-fromY==2){//向下走
i=fromX;
j=fromY+1;
elseif(fromY-toY==2){//向上走
//移动
j=fromY-1;
if(qizi[j][i]!
returnfalse;
//绊马腿
炮:
只可以走直线,且一步可以走任意距离,其起始点与目标点之间不得存在其他棋子。
炮吃子的条件是与目标棋子在一条直线上,且两子之间必须有且只有一个棋子作为“跳板”,让炮进行跳跃式攻击。
红黑炮规则走法的介绍:
图 4.3炮的走法
if(fromY!
=toY&
fromX!
=toX){//炮走直线
//返回false
if(qizi[toY][toX]==0){//不吃子时
if(fromY==toY){//横线
toX){//向右走
for(i=fromX+1;
i++){
//返回false
lse{//向走走
i