基于Android端的飞行棋游戏的设计与实现Word文档下载推荐.docx
《基于Android端的飞行棋游戏的设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于Android端的飞行棋游戏的设计与实现Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
郑重声明
本人呈交的学位论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。
尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。
对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。
本学位论文的知识产权归属于培养单位。
论文作者签名:
日期:
年月日
基于Android端的飞行棋游戏
的设计与实现
摘要
飞行棋是一款智力休闲游戏,具有历史悠久而且拥有巨大的游戏爱好者群体,他们以飞行棋陶冶情操、锻炼智力、体验飞行棋带来的快乐,飞行棋还是一个老少皆宜的娱乐游戏。
随着手持设备、智能手机的普及,搭载Android操作系统的智能手机也已经走进了千家万户,当人们闲暇偶尔需要娱乐时,却发现没有实物飞行棋,该软件不失为一个很好的替代品,供大家进行娱乐享受,尤其是在现在这个快节奏的社会中,人们更满足于手机的使用,可以方便地随意移动,不像实物飞行棋那样静静的坐着。
本论文通过实际应用软件的开发深入分析和研究Android开发技术。
实现飞行棋的人机会话。
本文实现了飞行棋在计算机中表示问题,基于Android平台应用,人机对战模拟现实中的人人对战;
讨论走棋规则和着法的实现等一系列问题,最终电脑能够通过产生着法,搜索,估计来产生一步最优的走棋,实现人机会话的目的。
关键字:
飞行棋;
Android;
智能手机;
人机对战
ABSTRACT
Flightchessisamentalcasualgame,hasalonghistoryandhasahugegameenthusiastsgroups,theycultivate,exerciseandIntelligenceexperiencetobringhappinesstotheflightchesschessflight,flightchessisagameentertainmentforallages.Withthepopularityofsmarthandhelddevices,mobilephone,mobilephoneequippedwithintelligentAndroidoperatingsystemhasenteredthousandsofhouseholds,whenpeopleoccasionallyneedleisureentertainment,butfoundnorealflightchess,thesoftwareisagoodsubstituteforeveryonetoenjoyentertainment,especiallyinthisfast-pacedsocietyintheuseofpeoplemoresatisfiedwiththemobilephone,canfreelymove,unliketherealflightchessthatsitquietly.
Inthispaper,throughthedevelopmentofpracticalapplicationsoftware,theAndroiddevelopmenttechnologyisanalyzedandstudied.Manmachineconversationofflyingchess.Theflightchessrepresentationproblemincomputerapplication,Androidplatformbasedonman-machinebattlesimulationoftherealityforallthewar;
todiscussaseriesofproblemsgochessrulesandthelaw,thefinalcomputercansearchbygeneratingmethod,andestimatedtogenerateonestepoptimalmoves,toachievethepurposeofman-machineconversation.
Keywords:
Flightchess;
Android;
Intelligentmobilephone;
Man-machinewar
1绪论
1.1研究背景
1.1.1飞行棋背景
飞行棋发展至今已有两千三、四百年的历史,早在战国时期就有正式的记载,堪称中国的国粹。
飞行棋具有悠久的历史,深的人们的喜爱,飞行棋的爱好者也更是数不胜数,远在战国飞行棋便在贵族阶层广为流传,早期的飞行棋是象征着当时战斗场面的游戏,后来这种观念慢慢被改变,经过千年的流传不断的完善和改进,成为人们休闲娱乐、锻炼脑力思维不可获取的好方式。
飞行棋体现的是一种策略,方寸之间包含天地玄机,人生哲理,使人越是细玩越觉其味悠然深远。
由于简单的行棋规则,趣味性强,便捷的载体,使得飞行棋成为雅俗共赏的竞技项目。
因此,也成为流行极为广泛的棋艺活动。
是我国正式开展的78个体育项目之一,为促进该项目在世界范围内的普及和推广,在中国古代,飞行棋被列为士大夫们的修身之艺,现在则被视为怡神益智的一种有益的活动。
有着数以亿计的爱好者。
它不仅能丰富文化生活,陶冶情操,在棋战中,人们可以从攻与防、虚与实、整体与局部等复杂关系的变化中悟出某种哲理;
更有助于开发智力,启迪思维,锻炼辨证分析能力和培养顽强的意志。
1.1.2Android系统简介
Android系统构架简介:
Android是一个基于Linux®
V2.6内核的交互性操作环境,同时它也是一个分层系统,Android系统架构显示如下图1-1。
图1-1系统架构图
应用层由所有的Android应用程序组成。
其中包括电子邮件客户端,SMS程序,地图,浏览器,联系人及其他。
所有的应用程序都是用Java编程语言编写的。
应用框架层定义了Android应用程序框架。
所有的Android应用程序都是基于应用框架的。
Android应用框架包括:
丰富及可扩展性的视图,可以用来建立一个美观的用户界面,包括列表,网格,文本框,按钮,甚至是嵌入到Web浏览器的应用程序。
一组内容提供商,使应用程序能够访问其他应用程序的数据(如电话簿),或共享自己的数据。
资源管理器提供了访问的非编码资源的途径,如本地化的字符串,图形,布局文件。
通知管理器允许所有应用程序显示定制的提示或通知在状态栏里。
活动管理器可以管理应用程序的生命周期,并提供一个通用的后台堆栈导航。
库层包括了一套被各类Android系统组件使用的C/C++库并对应用程序框架提供支持。
Android的运行环境包括一套核心库和Java虚拟机(Dalvik虚拟机),已经由谷歌重新设计和优化来适合Android平台。
Linux内核位于Android系统的底层并作为硬件和软件之间的一个抽象层。
它提供了核心系统服务,如安全,内存管理,进程管理,网络协议栈和驱动模型。
此外,一些底层功能如Dalvik虚拟机线程管理也依赖于Linux内核。
1.2本论文研究意义
飞行棋是一项智力和策略的游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。
控制计算机的是人类,而人机会话综合性很强的一门边缘学科,它的中心任务是研究使计算机如何去做那些过去只能靠人的智力才能做的工作。
因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。
本次论文的研究,主要是对飞行棋在Android系统中的兼容行性,对游戏界面可观性,游戏中人机会话的研究。
对于游戏中的人机会话的要点:
(1)某种在及其上表示棋局的方法,让程序知道会话的状态;
(2)产生合法的走棋法则,使得会话双方公正,并可以判断人类对手是否从乱走;
(3)所有和法定的走法中选择最佳的走法的技术;
(4)一种评估局面优化的方法,同上面技术配合做出智能选择;
(5)一个实现游戏的界面;
通过对游戏的设计,来实现游戏中棋牌的表示,着法的生成,对着法的搜索,最后对局面的评估来实现飞行棋的人机会话。
2游戏系统开发平台及搭建
2.1JDK和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解压之后即可使用。
2.2AndroidSDK
AndroidSDK提供了在windows平台上的开发安卓应用程序的开发组件,也就是说,不论读者使用什么样的平台都可以开发出安卓平台的应用软件,其中包含了安卓平台上开发移动应用的各种工具集。
它不仅包括了安卓模拟器和用于Eclipse的安卓开发工具插件(ADT),而且包括了各种用来调试,打包盒在模拟器上安装应用的工具。
安卓主要是以java语言为基础,用户可以使用java语言来开发安卓平台上的软件应用。
通过SDK提供的一些工具将其打包成安卓平台使用的apk文件,然后在使用SDK中的模拟器(Emulator)来模拟和测试软件在安卓平台运行情况和效果。
安装安卓的SDK,安装好JDK和Eclipse后,打开EclipseIDE。
依次单击Menu项中的windows->
AndroidSDKManager项,进入AndroidSDKManager界面选择Tool和需要的Android版本项进行更新安装。
2.3ADT
Android为Eclipse定制了一个插件,及ADT(AndroidDevelopmentTools),目的是为用户提供一个强大的综合环境用于开发Android应用程序,ADT扩展了Eclipse的功能,可以让用户快速的建立Android项目,创建应用程序界面,在基于AndroidAPI的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名(或未签名)的APKs以便发行应用程序。
安装AndroidDevelopmentToolplug-in,打开EclipseIDE。
依次单击Menu项中的Help->
SoftwareUpdate项。
3系统总体设计
3.1功能需求分析
飞行棋游戏是一个比较流行的游戏,本次实验设计主要是对它进行简化设计。
但是仍然保留了它大多数的基本功能。
基本需求如下:
首先,飞行棋游戏是一个在棋盘上进行的游戏。
所以其需要用一个总体棋盘来表示飞机的轨道,在该棋盘上主要对飞机进行游戏规则限定;
其次,飞行棋玩家本次设计主要限定为两个玩家。
故在这里需要设计两个大本营来代表两个玩家的角色;
再次需要设计一个文本框来显示游戏玩家所摇出来的数字以模拟骰子。
最后,游戏需要有一个终点,当玩家的飞机抵达终点时进行判断游戏是否终止。
本次课程设计所安排的玩家角色为两人,在地图上呈对角分布,玩家行走路线为逆时针。
每个玩家拥有两架飞机进行游戏。
详细游戏规则如下:
飞机出动规则:
首先由玩家A点击“开始”按钮摇骰子,显示数字N,当数字框显示的数字N=6时才允许出动一架飞机,如果没有摇到数字6则由玩家B进行相同的操作。
轮流操作,直到有飞机从基地中出发。
当某个基地中存在一架飞机时,游戏玩家通过鼠标选择飞机进行游戏,例如:
当摇出的数字为非6时,可以选择已经出动的飞机进行游戏,数字为几就前进几步;
若为数字为6时可以选择未出动的飞机,使飞机出基地。
当基地中不存在飞机时,摇出数字后玩家通过鼠标选择希望前进的飞机进行游戏,数字为几就前进几步。
飞机在地图中前进时的规则:
点击“开始”按钮,数字显示后,通过鼠标选择需要前进的飞机,数字为几就前进几步。
当飞机在地图上前进时,若两个玩家的飞机均落在了同一个地点,那么后去的飞机将把前一个落在该地点的飞机弹回飞机本来的基地中,被弹回的飞机需要玩家根据“飞机出动规则”再次出动飞机。
飞机到达目的地规则:
玩家需要将自己基地中的飞机通过指定的路线进入目的地,在到达目的地之前,如果摇出的数字刚好使得飞机进入目的地,则该飞机成功完成任务。
如果摇出的数字M多出飞机到达目的地本应该对应的数字N时,则飞机从目的地倒退M-N步,直到某个玩家的飞机全部到达终点,该玩家获胜,游戏结束。
3.2系统功能及结构
3.2.1系统功能
本次设计的系统大致上能够实现飞行棋的一些基本操作,诸如掷骰、然后根据点数判断是否出飞机或走动飞机,飞机的迭加以及撞机后的处理,并严格按照飞行棋的游戏规则进行走动。
用户只能在特定的区域来掷骰以及控制飞机的移动。
最后当有一方所有飞机都到达终点会弹出消息框提示胜利。
3.2.2游戏结构
飞行棋游戏由棋盘,4种颜色的飞机各4个,骰子和相关的后台控制程序组成。
游戏框架结构见图3-1示
图3-1游戏框架结构
图3-2主要类
3.3可行性研究
本次实训的题目是:
基于Android飞行棋游戏的开发与测试;
主要是在基于Android平台开发一个手持设备应用游戏,使得游戏具有兼容性和人机对战;
并对整个系统分析,设计过程给出一个论证。
飞行棋游戏是棋牌类游戏,体现的是一种策略。
对于行棋走棋不同的棋子有不同走棋规则,走棋都必须按照走棋规则要求,双方轮换走棋,吃子,将军。
本游戏设计无疑是模拟现实人人博弈,虚拟的替换了真实的棋子棋盘,由人来和电脑直接对弈;
在一个人闲暇时也可以体验博弈的乐趣。
该应用游戏的设计主要从以下几方面做起:
系统流程分析、系统的功能设计、系统的数据结构设计。
做好这些工作需要对Android开发平台了解,并搭建平台;
深入了解数据结构、Android应用程序以及各种组件(API)库函数。
3.4界面的需求分析
通过以往手持设备游戏的体验,和用户对飞行棋游戏需求逻辑,游戏的功能以及操作方法把整个设计划分成单元;
先是运行游戏,进入欢迎游戏界面,随后单击欢迎界面的图片进入菜单界面,在菜单中可以点击“打开声音”/“关闭声音”按钮来控制声音开关,单击“帮助”菜单可以进入帮助界面显示游戏操作方法,而在菜单界面单击“开始游戏”菜单将进入游戏主界面开始游戏,在游戏界面玩家可以通过单击自己的棋子按照行棋规则来走棋,同时可以单击声音按钮打开关闭声音,当游戏一方的“将”或者敌方的“帅”被吃掉是,会出现游戏失败或游戏胜利的界面,在游戏过程中玩家可以随时通过单击“退出”按钮返回到游戏主菜单,主菜单中还可以点击“退出游戏”结束关闭游戏。
3.5游戏走棋需求设计分析
进入游戏界面,游戏提示当前走棋为“帅”或者“将”,双方各走一着,直至分出胜负或者直接点击退出结束游戏,轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走一着,双方各走一着即一个回合,吃子时,任何棋子走动,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,即屏幕上消失在显示自己的棋子。
玩家走完棋后电脑相对应搜索出自己相对应的走法。
程序需要让计算机在轮到它走子的时候能够执行一步它认为最有利的着法,而不是乱走;
那么它就要有在诸多可供选择的着法,提供所有候选着法的列表就是着法生成器所要完成的。
之后用搜索函数来搜索列表,并用局面评估函数逐一打分,最后就可以选择出最佳着法并执行。
4系统实现
4.1界面制作
4.1.1界面制作的初期准备
首先需要构建一个合适的窗体,并对窗体进行初始化,在CmainFrame类的PreCreateWindow函数中进行如下修改:
图4-0建窗体并初始化
然后便是进行位图的粘贴。
首先在视图类中定义相关的绘图用成员变量。
分别是背景图、骰子图、4架不同颜色的飞机及各自的mask,共需10个成员变量。
然后进行图片的加载,并在视图类中添加一个鼠标移动的消息响应来读取当前光标的坐标,让操作更为方便。
代码如下:
图4-1加载背景图片
4.1.2飞机的绘制
飞机在整个游戏界面出现的地方只有两个,一个是飞机场,另外一个就是棋盘上。
我们可以进行适当的抽象分析,将前一种情况看作是面对点的关系。
将一个飞机场看做是一个面,而其中的飞机是一个点,就是说当点到飞机场范围内任意一点的时候,都可以看作是点到飞机上,至于此时是否应该出动飞机、出动哪一架飞机由具体的代码来决定。
后一种情况可以看做是点对点的情况,将棋盘上的时候一次只会同一个格子对应起来,就是说只有当点中飞机对应的格子的时候才算是点中飞机。
为了方便对所以16架飞机进行管理,在该函数中定义了在Manager中定义的ChessPlane[16],该成员变量用来记录16架飞机的状态。
并用到了类Chess来集成飞机的颜色、状态以及走步等。
其中的成员如下图4-2示:
图4-2绘制飞机
另外在视图类中定义一个函数Drawback对返回飞行点的飞机进行绘图,定义函数Drawplane画指定格子的飞机将棋盘分成4个分区,分别对应不同颜色的飞机区域。
每个分区有12个格子,第一到第四分区分别为0~12格、14~25格、26~48格、49~51格。
其中第一分区的0~4格的横坐标可以看做近似相似,4~7的纵坐标也可以看做近似相似,其它分区也可作类似处理。
因此,在获得飞机的格子数后应对其所在的分区进行判断,然后进一步判断出其坐标,从而达到贴图的目的。
先根据飞机的状态以及格子数判断出飞机的坐标,然后进行颜色判断,最后就能顺利地画出飞机了。
4.1.3整体重绘和状态打印
该过程主要用到两个函数PrintAll(CDC*pDC)和PrintState(CDC*pDC),PrintAll的作用是重绘所以16架飞机,PrintState的作用是打印当前的游戏状态。
在PrintState(CDC*pDC)中,有这样一段代码:
图4-3整体重绘
它的作用是画当前掷骰子的数目。
4.1.4LBUTTONDOWN的串接
前面的函数最后都是通过左键单击的消息响应将它们联系起来以发挥作用的。
通过对用户点击时光标所在区域的不同做出不同的响应。
在定义LBUTTONDOWN的函数中需要一个在视图类中定义的成员control,用于控制骰子以及飞机的点击。
因为每当丢了一次骰子后,如果需要去点飞机进行行走,是不能再去点骰子的,所以通过对control的改变和判断来确定此时是应该点骰子还是点飞机。
此外,还有2个函数需要用到,PlaneUpdate与SelectPlane。
前者的作用在于对lastplane[16]进行更新,代码如下:
图4-4串接
后者的作用是判断当前选择的飞机具体是哪架。
因为除去点击机场、开始按钮、结束按钮和骰子,只有点击飞机的情况才是有效的。
通过对此时处于状态1~4的飞机进行遍历,将它们的坐标同此时的光标进行比较,以判断点中的是哪架飞机。
这相比与直接通过光标的坐标去判断点的是哪架飞机,难度要小很多。
4.2核心算法的实现
4.2.1棋盘的数据结构分析
首先,申请一个前面提到过的辅助类Chess用来记录某个棋子的信息。
其构造函数如下:
图4-5辅助类Chess
其拷贝函数如下:
图4-6拷贝函数
然后申请一个Managers类,其部分数据组成如下。
由于一共就16个棋子,不会多也不会少,所以不需要对整个棋盘进行记录,用一个数组来记录棋子信息就可以了。
ChessPlanes[16];
//0-3,4-7,8-11,12-15分别给4个玩家的4个飞机记录需要记录当前游戏状态Game_State,
intGame_State;
//游戏状态
//-1游戏刚刚运行
//0-3该0-3号某玩家走棋
//8号为全部结束
设定变量游戏暂停:
boolPAUSE;
//游戏是否暂停
4.2.2棋盘的算法
首先进行游戏开始的消息响应,这里要用到函数GameStart(),棋主要功能变身对游戏进行初始化,并且由于有4个玩家、4种不同的飞机可供选择,所以必须对4种飞机分别进行初始化。
其次便是棋盘消息响应,这一部分是整个游戏中最核心的部分。
先是用到DoMsg(intsteps,intstate,int,action,introll)函数来响应用户传入的落子信息,在steps的落子点、状态为state的位置进行了动作action。
其部分代码如下首先是游戏判断,声明了一个指针Chess*pl,这是为了更好地控制Planes[]里数据的改变。
图4-7棋盘消息响应
其中action==1表示走棋,但DoMsg得到的是一个棋盘格子编号和一个状态,先把对应的飞机找出来,这就用到了Search(steps,state)函数。
通过该函数把对应的飞机找到并给pl,这样对pl进行修改与比较就等效于直接修改Planes[]中的数据。
图4-8查找对应飞机
如果飞机没起飞则起飞,如果在飞行过程中则StepUp(向前移动)。
最后更新游戏状态UpData。
下面是action==4的情况,其中,前一个用PlAuto来记录,如果此指针指到了飞机那么表示现在该自动走,否则让玩家自行控制。
部分代码如图14:
图4-9飞机移动
然后是StepUp函数,它的功能是走棋。
这个函数只返回一个值True,首先用ro来记录roll,然后根据状态的不同进行不同的动作。
部分代码如下:
图4-10飞机的不同动作
然后需要函数OverStep(intcolor)来得到不同颜色飞机的降落步数。
函数DefStep与之类似。
图4-11飞机降落
接下来是UpData函数的设计,由