Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx

上传人:b****5 文档编号:7922922 上传时间:2023-01-27 格式:DOCX 页数:53 大小:1.47MB
下载 相关 举报
Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx_第1页
第1页 / 共53页
Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx_第2页
第2页 / 共53页
Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx_第3页
第3页 / 共53页
Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx_第4页
第4页 / 共53页
Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx

《Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx》由会员分享,可在线阅读,更多相关《Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx(53页珍藏版)》请在冰豆网上搜索。

Android版的中国象棋人机对弈游戏设计与实现毕业论文设计.docx

Android版的中国象棋人机对弈游戏设计与实现毕业论文设计

(此文档为word格式,下载后您可任意编辑修改!

 

毕业设计

Android版的中国象棋人机对弈游戏设计与实现

 

毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:

所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:

     日 期:

     

指导教师签名:

     日  期:

     

使用授权说明

本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:

按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:

     日 期:

     

摘要

象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。

国际象棋软件有着成功的商业运作,已发展成一种产业。

然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。

在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。

例如B.Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。

然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。

中国象棋游戏的设计工作是非常复杂和重要的,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。

在这个游戏的设计中,将牵涉到图形界面的显示与更新,并且在这个游戏的开发中还会应用类的继承机制以及一些设计模式。

该游戏主要研究基于android技术的中国象棋游戏的分析与设计,对中国象棋游戏特殊的行棋规则给予了细致的分析与理解,设计出了一种实时可行的行棋规则,从移动范围、移动方向等方面重新描述行棋规则,基于android技术通过计算机模拟实现了中国象棋特殊的行棋规则算法,设计出了一种可行的方法,使每个棋子的行棋路线都严格遵循本身的行棋规则,游戏的实战对弈得以实现,通过实验运行,证明这种限定棋子行棋路线的方法是可行的,并得到了预期的目标。

关键词:

android版、中国象棋、人机对弈、类、规则

第一部分:

中国象棋的开发背景************************************************************

第二部分:

中国象棋的需求分析*****************************************************************

第三部分:

游戏的策划及准备工作

第四部分:

功能简介及其运行结果

第五部分:

游戏的架构

第六部分:

游戏框架的简介

第七部分:

游戏结论

第八部分:

游戏展望

第九部分:

谢谢指导

第十部分:

游戏参考文献

第一部分:

中国象棋的开发背景

1、中国象棋具有悠久的历史,象棋的爱好者更是数不胜数,远在战国时代,象棋便在贵族阶层中广为流传,早期的象棋是象征着当时战斗场面的游戏,后来这种观念慢慢被改变,成了人们休闲娱乐中不可缺少的一部分。

2、而当今的人们忙于工作,很少有时间静下心来享受一下象棋对弈的乐趣,因此电脑版象棋、手机版象棋便开始受到人们的关注。

第二部分:

中国象棋的需求分析

该游戏是改编网络版中国象棋,使其更加满足玩家的的要求。

主要用于android手机的平台。

满足广大象棋爱好者的要求。

第三部分:

游戏的策划及准备工作

1)游戏的策划

游戏类型

该游戏属于棋牌类游戏的一种,并采用简单的人工智能,可达到玩家与电脑进行对弈的效果。

运行的目标平台

游戏的目标平台为Android2.2

(3)操作方式

该游戏拟采用屏幕事件进行操作,玩家可以鼠标来单击屏幕完成对游戏进行控制,游戏中部分的功能可以使用键盘操作来完成。

2)android平台下游戏的准备工作

1、相关的素材。

图片名称

用途

bacnground.png

游戏背景图片

logo2.png

欢迎界面logo2

welcomebackage.png

欢迎界面背景图片

helpbackground.png

帮助界面背景图片

vs.png

VS图片

qipan.png

游戏棋盘

menu.png

菜单按钮

ok.png

确定按钮

back.png

返回按钮

closesound.png

关闭声音按钮

opensound.png

打开声音按钮

startgame.png

开始游戏按钮

exit.png

退出游戏按钮

sound3.png

显示声音状态图片

sound2.png

声音按钮

lost.png

你输了图片

win.png

你赢了图片

left.png

指针

right.png

指针

a.png

黑将

b.png

黑士

c.png

黑象

d.png

黑马

e.png

黑車

f.png

黑炮

g.png

黑卒

a1.png

红将

b2.png

红士

c3.png

红象

d4.png

红马

e5.png

红車

f6.png

红炮

g7.png

红卒

2、棋盘的标记

红方

黑方

8

1

12

5

13

6

10

3

9

2

11

4

14

7

{2,3,6,5,1,5,6,3,2},

{0,0,0,0,0,0,0,0,0},

{0,4,0,0,0,0,0,4,0},

{7,0,7,0,7,0,7,0,7},

{0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0},

{14,0,14,0,14,0,14,0,14},

{0,11,0,0,0,0,0,11,0},

{0,0,0,0,0,0,0,0,0},

{9,10,13,12,8,12,13,10,9},

第四部分:

功能简介及其运行结果

(1)运行该游戏,首先进入的将是欢迎界面,效果如图1所示。

图1

(2)当欢迎动画播放完毕后,单击“菜单”按钮就可以进入菜单界面,如图2所示。

图2

(3)在菜单按钮界面,可以通过“打开声音”“关闭声音”菜单来控制游戏声音的开关,单击“帮助”菜单可以进入帮助界面,如图3所示。

图3

(4)而在菜单界面单击“开始游戏”菜单将进入游戏界面,如图4所示。

图4

在游戏界面玩家可以通过单击自己的棋子来走棋,同时可以单击声音按钮来打开或者关闭声音。

当游戏一方“将”或者是另一方的“帅”被吃掉是,会出现游戏胜利的界面,如图6所示。

图6

在游戏过程中,玩家可以随时通过单击“退出”按钮返回到游戏主菜单。

第五部分:

游戏的架构

共有类

Activity的实现类MyDoChessActivity,该类是通过扩展基类Activity得到的,是整个游戏的控制器,也是整个游戏程序的入口。

辅助界面相关类

欢迎界面类MyWelcomeView

该类为游戏欢迎界面的实现类,主要负责欢迎界面的绘制工作。

欢迎界面动画生成类MyWelcomeViewThread

该类是为了欢迎界面服务的,主要是通过更改欢迎界面中图片的坐标来实现动画效果。

帮助界面类MyHelpView

该类为帮助界面的实现类。

菜单界面类MyMenuView

该类为菜单界面的实现类,负责绘制菜单界面以及菜单界面的屏幕进行监听。

游戏界面相关类

1)游戏界面类MyGameView

该类为游戏程序中最主要的类,负责绘制游戏过程所有的信息,如棋盘、棋子、各个按钮以及胜利或者失败菜单等。

2)象棋规则类MyGuiZe

(1)该类是象棋规则的实现类,其中包含所有棋子的走棋规则及当前棋牌某方的所有可能的走法

3)走法类MyChessMove

该类为棋子的走法的封装类,包含棋子的名称、出发点以及目标点。

*帅和士的走法:

“帅”,它只能在“九宫”中行走,而且每次只能横着或者纵着行走一棋点。

首先,判断棋子是否是在“九宫”里行走,接着判断棋子是否是横向或纵向只走一个棋点。

如果棋子将符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

“士”,它只能在“九宫”中行走,而且每次只能斜着行走一格。

这样只有一种情况来考虑,即纵向走一个棋点,横向走一个棋点。

如果棋子士符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

如图所示

*象和马的走法:

“象”,它只能走“田”字格,而且不能过河,象腿不能被其它的棋子压到。

首先首先判断棋子是否出届,这样只有一种情况考虑,那就是纵向走两个棋点,横向也走两个棋点。

首先判断棋子是否走"田"字格,而且不能过河,接着再用判断象腿是否被其它棋子压着。

如果棋子象走动符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

“马”,它只能走“日”字格,而且马腿不能被其它的棋子压到。

设计时可两种情况来考虑,一种是横向走两个棋点,纵向走一个棋点;一种是纵向走两个棋点,横向走一个棋点。

判断是否横向走两个棋点,纵向走一个棋点,接着来判断马腿是否被其它棋子压着。

纵向走“日”同理。

如果棋子马符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

如图所示

*卒和炮的走法:

“卒”,它的行走规则分两种情况。

一种是棋子没过河界,另一种是棋子过了河界。

首先判断棋子是否出届,然后设定棋子没过河界,接着设定棋子在没过河界的情况下只能向前行走一个棋点;然后设定棋子过了河界,紧接着设定棋子在过了河界的情况下只能向前、向左、向右行走一个棋点。

如果棋子卒符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

“炮”,它只能走直线,且中间有且只能有一个棋子。

如图所示

*車的走法:

如图所示

“车”,它只能走直线,且中间不能有任何棋子,设计时分为两种情况来考虑,一种是纵向行走;一种是横向行走。

判断棋子是否纵向行走,接着再用判断判断中间有没别的棋子。

横向行走同理。

如果棋子车符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

第六部分:

游戏框架的简介

按照程序运行的顺序介绍各个类的作用以及整体的运行框架,步骤如下:

启动游戏,首先被创建的是MyDoChessActivity,而在MyDoChessActivity中首先将用户显示成欢迎界面MyWelcomeView.

在显示欢迎界面的同时,启动MyWelcomeViewThread线程生成界面动画

当玩家单击“菜单”按钮时进入界面MyMenuView,在菜单界面会根据玩家不同的选择执行不同的操作。

当玩家单击“帮助”菜单时,将进入帮助界面MyHelpView.

而当玩家单击“开始游戏”菜单按钮时,进入的将是游戏界面MyGameView。

当玩家或者电脑走棋是,会根据规则类MyGuiZe进行判断,然后产生一个走法MyChessMove。

在游戏过程中,玩家同样可以随时单击“退出”按钮来返回到菜单界面。

第七部分:

游戏结论

通过一个星期左右的时间,终于把跟着部分网络的游戏做了出来,从来没有接触过android平台,但是通过学习,把平时所有的积累的方法和知识都用了上去,虽然并没有自己平常所使用的熟悉的基于C++语言来写程序,但是我想对于计算机编程来说,都是相通的,毕竟是使用的是方法与理论,我们学习的是方法,而不是单单的一门语言,对于计算机的日益更新速度,我们不可能学精通于每一个方法和函数,我们更需要的逻辑思路和解决方法的能力并能用于实际的实践。

第八部分:

游戏展望

该游戏实现了基本的象棋的走法与判断简单的逻辑,但是并没有真正实现相当智能的走法,我想这个也是基于算法的问题,我想需要更加严密的算法,以后通过不断的学习,通过别人的算法,能够写出一些比较理想的属于自己的想法。

把该游戏更加完善,真正能够满足基于android平台的手机的棋艺爱好者的需求。

第九部分:

谢谢指导

谢谢老师教给我的知识和方法,谢谢各位网友的热心帮助,帮助我解决了很多问题,真的谢谢你们

第十部分:

参考文献

CC++中国象棋程序入门与提高蒋鹏 等著电子工业出版社

学会用JAVA开发网络游戏

ANDROID_2[1].0游戏开发实战宝典

 

附件加代码:

(1)MyDoChessActivity类

packagecn.zh.wy.sl;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.media.MediaPlayer;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.view.Window;

importandroid.view.WindowManager;

publicclassMyDoChessActivityextendsActivity{

booleanisSound=true;是否播放声音

MediaPlayerstartSound;开始和菜单时的音乐

MediaPlayergamesound;游戏声音

HandlermyHandler=newHandler(){用来更新UI线程中的控件

publicvoid.zh.wy.sl;

importandroid.content.Context;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Canvas;

importandroid.graphics.Color;

importandroid.view.MotionEvent;

importandroid.view.SurfaceHolder;

importandroid.view.SurfaceView;

publicclassMyWelcomeViewextendsSurfaceViewimplementsSurfaceHolder.Callback{

MyDoChessActivitymyDoChessActivity;的引用

privateTutorialThreadthread;内部刷帧的线程

privateMyWelcomeViewThreadmoveThread;物件移动的线程

Bitmapwelcomebackage;大背景

Bitmaplogo2;

Bitmapmenu;菜单按钮

intlogo2X=100;初始化需要移动的图片的相应坐标

intbordbackgroundY=-100;背景框的y坐标

intmenuY=550;菜单的y坐标

publicMyWelcomeView(Contextcontext,MyDoChessActivitymyDoChessActivity){构造器

super(context);

this.myDoChessActivity=myDoChessActivity;得到myDoChessActivity引用

getHolder().addCallback(this);

this.thread=newTutorialThread(getHolder(),this);初始化刷帧线程

this.moveThread=newMyWelcomeViewThread(this);初始化图片移动线程

initBitmap();初始化所以图片

}

publicvoidinitBitmap(){初始化所以图片

welcomebackage=BitmapFactory.decodeResource(getResources(),R.drawable.welcomebackage);

logo2=BitmapFactory.decodeResource(getResources(),R.drawable.logo2);

menu=BitmapFactory.decodeResource(getResources(),R.drawable.menu);

}

publicvoidonDraw(Canvascanvas){自己写的绘制方法,并非重写的

画的内容是z轴的,后画的会覆盖前面画的

canvas.drawColor(Color.BLACK);清屏

canvas.drawBitmap(welcomebackage,0,0,null);绘制welcomebackage

canvas.drawBitmap(logo2,logo2X,150,null);绘制logo2

canvas.drawBitmap(menu,200,menuY,null);绘制menu

}

从写surfaceChanged方法

publicvoidsurfaceChanged(SurfaceHolderretry=true;

thread.setFlag(false);设置循环标志位

moveThread.setFlag(false);

while(retry){循环

try{

thread.join();等待线程结束

moveThread.join();

retry=false;停止循环

}

catch(InterruptedExceptione){不断地循环,直到刷帧线程结束

}

}

}

publicbooleanonTouchEvent(MotionEventevent){屏幕监听

if(event.getAction()==MotionEvent.ACTION_DOWN){

if(event.getX()>200&&event.getX()<200+menu.getWidth()

&&event.getY()>355&&event.getY()<355+menu.getHeight()){点击菜单按钮

myDoChessActivity.myHandler.sendEmptyMessage

(1);

}

}

returnsuper.onTouchEvent(event);

}

classTutorialThreadextendsThread{刷帧线程

privateintspan=100;睡眠的毫秒数

privateSurfaceHoldersurfaceHolder;SurfaceHolder引用

privateMyWelcomeViewwelcomeView;WelcomeView引用

privatebooleanflag=false;

publicTutorialThread(SurfaceHoldersurfaceHolder,MyWelcomeViewwelcomeView){构造器

this.surfaceHolder=surfaceHolder;得到SurfaceHolder引用

this.welcomeView=welcomeView;得到WelcomeView引用

}

publicvoidsetFlag(booleanflag){设置循环标记位

this.flag=flag;

}

@Override

publicvoidrun(){重写的run方法

Canvasc;创建画布c

while(this.flag){重复绘图循环,直到线程停止

c=null;

try{

锁定整个画布,在内存要求比较高的情况下,建议参数不要为null

c=this.surfaceHolder.lockCanvas(null);

synchronized(this.surfaceHolder){同步

welcomeView.onDraw(c);绘制

}

}finally{使用finally语句保证下面的代码一定会被执行

if(c!

=null){

解锁c,并渲染当前图像

this.surfaceHolder.unlockCanvasAndPost(c);

}

}

try{

Thread.sleep(span);睡眠指定毫秒数

}

catch(Exceptione){捕获异常

e.printStackTrace();打印堆栈信息

}

}

}

}

}

(3)MyWelcomeViewThread类

packagecn.zh.wy.sl;

publicclassMyWelcomeViewThreadextendsThread{

privatebooleanflag=true;循环标志位

MyWelcomeViewmyWelcomeView;WelcomeView的引用

publicMyWelcomeViewThread(MyWelcomeViewmyWelcomeView){构造器

this.myWelcomeView=myWelcomeView;得到WelcomeView的引用

}

publicvoidsetFlag(booleanflag){设置循环标志位

this.flag=flag;

}

publicvoidrun(){重写的run方法

try{

Thread.sleep(300);睡眠三百毫秒,保证界面已经显示

}

catch(Exceptione){捕获异常

e.printStackTrace();打印异常信息

}

while(flag){

myWelcomeView.logo2X-=30;更改图片的坐标

if(myWelcomeView.logo2X<15){

myWelcomeView.logo2X=15;停止移动

}

if(myWelcomeView.logo2X==15)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1