本科毕业论文-—android版的中国象棋人机对弈游戏设计与实现.doc

上传人:教**** 文档编号:88952770 上传时间:2023-05-05 格式:DOC 页数:34 大小:1.94MB
返回 下载 相关 举报
本科毕业论文-—android版的中国象棋人机对弈游戏设计与实现.doc_第1页
第1页 / 共34页
本科毕业论文-—android版的中国象棋人机对弈游戏设计与实现.doc_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《本科毕业论文-—android版的中国象棋人机对弈游戏设计与实现.doc》由会员分享,可在线阅读,更多相关《本科毕业论文-—android版的中国象棋人机对弈游戏设计与实现.doc(34页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、毕业设计Android版的中国象棋人机对弈游戏设计与实现毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷

2、本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 摘 要象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台WinBoard平台,另一个是商业的国际象棋数据库和对弈软件ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。国际象棋软件有着成功的商业运作,已发展成一种产业。然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是

3、由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。例如B. Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。中国象棋游戏的设计工作是非常复杂和重要的,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,将牵涉到图形界面的显示与

4、更新,并且在这个游戏的开发中还会应用类的继承机制以及一些设计模式。该游戏主要研究基于android技术的中国象棋游戏的分析与设计,对中国象棋游戏特殊的行棋规则给予了细致的分析与理解,设计出了一种实时可行的行棋规则,从移动范围、移动方向等方面重新描述行棋规则,基于android技术通过计算机模拟实现了中国象棋特殊的行棋规则算法,设计出了一种可行的方法,使每个棋子的行棋路线都严格遵循本身的行棋规则,游戏的实战对弈得以实现,通过实验运行,证明这种限定棋子行棋路线的方法是可行的,并得到了预期的目标。关键词:android版、中国象棋、人机对弈、类、规则 目 录第一部分:中国象棋的开发背景*第二部分:中

5、国象棋的需求分析*第三部分:游戏的策划及准备工作第四部分:功能简介及其运行结果第五部分:游戏的架构第六部分:游戏框架的简介第七部分:游戏结论第八部分:游戏展望第九部分:谢谢指导第十部分:游戏参考文献第一部分:中国象棋的开发背景1、中国象棋具有悠久的历史,象棋的爱好者更是数不胜数,远在战国时代,象棋便在贵族阶层中广为流传,早期的象棋是象征着当时战斗场面的游戏,后来这种观念慢慢被改变,成了人们休闲娱乐中不可缺少的一部分。2、而当今的人们忙于工作,很少有时间静下心来享受一下象棋对弈的乐趣,因此电脑版象棋、手机版象棋便开始受到人们的关注。第二部分:中国象棋的需求分析该游戏是改编网络版中国象棋,使其更加

6、满足玩家的的要求。主要用于android手机的平台。满足广大象棋爱好者的要求。第三部分:游戏的策划及准备工作1)游戏的策划游戏类型 该游戏属于棋牌类游戏的一种,并采用简单的人工智能,可达到玩家与电脑进行对弈的效果。运行的目标平台 游戏的目标平台为Android2.2(3)操作方式 该游戏拟采用屏幕事件进行操作,玩家可以鼠标来单击屏幕完成对游戏进行控制,游戏中部分的功能可以使用键盘操作来完成。2)android平台下游戏的准备工作1、相关的素材。图片名称用途bacnground.png游戏背景图片logo2.png欢迎界面logo2welcomebackage.png欢迎界面背景图片helpba

7、ckground.png帮助界面背景图片vs.pngVS图片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红象

8、d4.png红马e5.png红車f6.png红炮g7.png红卒2、棋盘的标记红方黑方帅8将1 仕12士5相13象6马10马3车9车2炮11炮4兵14卒72,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)运行该游戏,首先进入的将

9、是欢迎界面,效果如图1所示。 图1(2)当欢迎动画播放完毕后,单击“菜单”按钮就可以进入菜单界面,如图2所示。 图2(3)在菜单按钮界面,可以通过“打开声音”/“关闭声音”菜单来控制游戏声音的开关,单击“帮助”菜单可以进入帮助界面,如图3所示。 图3(4)而在菜单界面单击“开始游戏”菜单将进入游戏界面,如图4所示。 图4在游戏界面玩家可以通过单击自己的棋子来走棋,同时可以单击声音按钮来打开或者关闭声音。当游戏一方“将”或者是另一方的“帅”被吃掉是,会出现游戏胜利的界面,如图6所示。 图6在游戏过程中,玩家可以随时通过单击“退出”按钮返回到游戏主菜单。第五部分:游戏的架构共有类 Activity

10、的实现类MyDoChessActivity,该类是通过扩展基类Activity得到的,是整个游戏的控制器,也是整个游戏程序的入口。辅助界面相关类欢迎界面类MyWelcomeView该类为游戏欢迎界面的实现类,主要负责欢迎界面的绘制工作。欢迎界面动画生成类MyWelcomeViewThread 该类是为了欢迎界面服务的,主要是通过更改欢迎界面中图片的坐标来实现动画效果。帮助界面类MyHelpView该类为帮助界面的实现类。菜单界面类MyMenuView该类为菜单界面的实现类,负责绘制菜单界面以及菜单界面的屏幕进行监听。游戏界面相关类1)游戏界面类MyGameView该类为游戏程序中最主要的类,负

11、责绘制游戏过程所有的信息,如棋盘、棋子、各个按钮以及胜利或者失败菜单等。2)象棋规则类MyGuiZe (1) 该类是象棋规则的实现类,其中包含所有棋子的走棋规则及当前棋牌某方的所有可能的走法3)走法类MyChessMove 该类为棋子的走法的封装类,包含棋子的名称、出发点以及目标点。 *帅和士的走法:“帅”,它只能在“九宫”中行走,而且每次只能横着或者纵着行走一棋点。首先,判断棋子是否是在“九宫”里行走,接着判断棋子是否是横向或纵向只走一个棋点。如果棋子将符合以上的走棋规则,则可以走动,否则棋子强制放回原处。“士”,它只能在“九宫”中行走,而且每次只能斜着行走一格。这样只有一种情况来考虑,即纵

12、向走一个棋点,横向走一个棋点。如果棋子士符合以上的走棋规则,则可以走动,否则棋子强制放回原处。如图所示 图 *象和马的走法:“象”,它只能走“田”字格,而且不能过河,象腿不能被其它的棋子压到。首先首先判断棋子是否出届,这样只有一种情况考虑,那就是纵向走两个棋点,横向也走两个棋点。首先判断棋子是否走田字格,而且不能过河,接着再用判断象腿是否被其它棋子压着。如果棋子象走动符合以上的走棋规则,则可以走动,否则棋子强制放回原处。“马”,它只能走“日”字格,而且马腿不能被其它的棋子压到。设计时可两种情况来考虑,一种是横向走两个棋点,纵向走一个棋点;一种是纵向走两个棋点,横向走一个棋点。判断是否横向走两个

13、棋点,纵向走一个棋点,接着来判断马腿是否被其它棋子压着。纵向走“日”同理。如果棋子马符合以上的走棋规则,则可以走动,否则棋子强制放回原处。如图所示 图 *卒和炮的走法:“卒”,它的行走规则分两种情况。一种是棋子没过河界,另一种是棋子过了河界。首先判断棋子是否出届,然后设定棋子没过河界,接着设定棋子在没过河界的情况下只能向前行走一个棋点;然后设定棋子过了河界,紧接着设定棋子在过了河界的情况下只能向前、向左、向右行走一个棋点。如果棋子卒符合以上的走棋规则,则可以走动,否则棋子强制放回原处。“炮”,它只能走直线,且中间有且只能有一个棋子。如图所示 图*車的走法:如图所示“车”,它只能走直线,且中间不

14、能有任何棋子,设计时分为两种情况来考虑,一种是纵向行走;一种是横向行走。判断棋子是否纵向行走,接着再用判断判断中间有没别的棋子。横向行走同理。如果棋子车符合以上的走棋规则,则可以走动,否则棋子强制放回原处。 图第六部分:游戏框架的简介 按照程序运行的顺序介绍各个类的作用以及整体的运行框架,步骤如下:启动游戏,首先被创建的是MyDoChessActivity,而在MyDoChessActivity中首先将用户显示成欢迎界面MyWelcomeView.在显示欢迎界面的同时,启动MyWelcomeViewThread线程生成界面动画当玩家单击“菜单”按钮时进入界面MyMenuView,在菜单界面会根

15、据玩家不同的选择执行不同的操作。当玩家单击“帮助”菜单时,将进入帮助界面MyHelpView.而当玩家单击“开始游戏”菜单按钮时,进入的将是游戏界面MyGameView。当玩家或者电脑走棋是,会根据规则类MyGuiZe进行判断,然后产生一个走法MyChessMove。在游戏过程中,玩家同样可以随时单击“退出”按钮来返回到菜单界面。第七部分:游戏结论通过一个星期左右的时间,终于把跟着部分网络的游戏做了出来,从来没有接触过 android平台,但是通过学习,把平时所有的积累的方法和知识都用了上去,虽然并没有自己平常所使用的熟悉的基于C+语言来写程序,但是我想对于计算机编程来说,都是相通的,毕竟是使

16、用的是方法与理论,我们学习的是方法,而不是单单的一门语言,对于计算机的日益更新速度,我们不可能学精通于每一个方法和函数,我们更需要的逻辑思路和解决方法的能力并能用于实际的实践。第八部分:游戏展望该游戏实现了基本的象棋的走法与判断简单的逻辑,但是并没有真正实现相当智能的走法,我想这个也是基于算法的问题,我想需要更加严密的算法,以后通过不断的学习,通过别人的算法,能够写出一些比较理想的属于自己的想法。把该游戏更加完善,真正能够满足基于android平台的手机的棋艺爱好者的需求。第九部分:谢谢指导 谢谢老师教给我的知识和方法,谢谢各位网友的热心帮助,帮助我解决了很多问题,真的谢谢你们第十部分:参考文

17、献C/C+中国象棋程序入门与提高 蒋鹏等著 电子工业出版社学会用JAVA开发网络游戏ANDROID_21.0游戏开发实战宝典附件加代码:(1)MyDoChessActivity类package cn.zh.wy.sl;import android.app.Activity;import android.os.Bundle;import android.media.MediaPlayer;import android.os.Handler;import android.os.Message;import android.view.Window;import android.view.Window

18、Manager;public class MyDoChessActivity extends Activity boolean isSound = true;/是否播放声音MediaPlayer startSound;/开始和菜单时的音乐MediaPlayer gamesound;/游戏声音Handler myHandler = new Handler()/用来更新UI线程中的控件 public void handleMessage(Message msg) if(msg.what = 1)/WelcomeView或HelpView或GameView传来的消息,切换到MenuView init

19、MenuView();/初始化并切换到菜单界面 else if(msg.what = 2)/MenuView传来的消息,切换到GameView initGameView();/初始化并切换到游戏界面 else if(msg.what = 3)/MenuView传来的消息,切换到HelpView initHelpView();/初始化并切换到帮助界面 ; public void onCreate(Bundle savedInstanceState) /重写的onCreate super.onCreate(savedInstanceState);/全屏requestWindowFeature(Wi

20、ndow.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN);startSound = MediaPlayer.create(this, R.raw.startsound);/加载欢迎声音startSound.setLooping(true);/设置游戏声音循环播放 gamesound = MediaPlayer.create(this, R.raw.gamesound);/游戏过程的背景声音

21、gamesound.setLooping(true);/设置游戏声音循环播放 this.initWelcomeView();/初始化欢迎界面 public void initWelcomeView()/初始化欢迎界面 this.setContentView(new MyWelcomeView(this,this);/切换到欢迎界面 if(isSound)/需要播放声音时 startSound.start();/播放声音 public void initGameView()/初始化游戏界面 this.setContentView(new MyGameView(this,this); /切换到游戏

22、界面 public void initMenuView()/初始化菜单界面 if(startSound != null)/停止 startSound.stop();/停止播放声音 startSound = null; if(this.isSound)/是否播放声音 gamesound.start();/播放声音 this.setContentView(new MyMenuView(this,this);/切换View public void initHelpView()/初始化帮助界面 this.setContentView(new MyHelpView(this,this);/切换到帮助界面

23、 (2)MyWelcomeView类package cn.zh.wy.sl;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;pub

24、lic class MyWelcomeView extends SurfaceView implements SurfaceHolder.Callback MyDoChessActivity myDoChessActivity;/的引用private TutorialThread thread;/内部刷帧的线程private MyWelcomeViewThread moveThread;/物件移动的线程Bitmap welcomebackage;/大背景Bitmap logo2;Bitmap menu;/菜单按钮 int logo2X = 100;/初始化需要移动的图片的相应坐标int bor

25、dbackgroundY = -100;/背景框的y坐标int menuY = 550;/菜单的y坐标public MyWelcomeView(Context context,MyDoChessActivity myDoChessActivity) /构造器 super(context);this.myDoChessActivity = myDoChessActivity;/得到myDoChessActivity引用 getHolder().addCallback(this); this.thread = new TutorialThread(getHolder(), this);/初始化刷帧

26、线程 this.moveThread = new MyWelcomeViewThread(this);/初始化图片移动线程 initBitmap();/初始化所以图片public void initBitmap()/初始化所以图片welcomebackage = BitmapFactory.decodeResource(getResources(), R.drawable.welcomebackage);logo2 = BitmapFactory.decodeResource(getResources(), R.drawable.logo2);menu = BitmapFactory.deco

27、deResource(getResources(), R.drawable.menu);public void onDraw(Canvas canvas)/自己写的绘制方法,并非重写的/画的内容是z轴的,后画的会覆盖前面画的canvas.drawColor(Color.BLACK);/清屏canvas.drawBitmap(welcomebackage, 0, 0, null);/绘制welcomebackagecanvas.drawBitmap(logo2, logo2X, 150, null);/绘制logo2canvas.drawBitmap(menu, 200, menuY, null

28、);/绘制menu/从写surfaceChanged方法public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) public void surfaceCreated(SurfaceHolder holder) /创建时启动相应进程 this.thread.setFlag(true);/设置循环标志位 this.thread.start();/启动线程 this.moveThread.setFlag(true);/设置循环标志位 this.moveThread.start();/启动线

29、程public void surfaceDestroyed(SurfaceHolder holder) /摧毁时释放相应进程 boolean retry = true; thread.setFlag(false);/设置循环标志位 moveThread.setFlag(false); while (retry) /循环 try thread.join();/等待线程结束 moveThread.join(); retry = false;/停止循环 catch (InterruptedException e) /不断地循环,直到刷帧线程结束 public boolean onTouchEvent

30、(MotionEvent event) /屏幕监听if(event.getAction() = MotionEvent.ACTION_DOWN)if(event.getX()200 & event.getX()355 & event.getY()355+menu.getHeight()/点击菜单按钮myDoChessActivity.myHandler.sendEmptyMessage(1);return super.onTouchEvent(event);class TutorialThread extends Thread/刷帧线程private int span = 100;/睡眠的毫秒

31、数 private SurfaceHolder surfaceHolder;/SurfaceHolder引用private MyWelcomeView welcomeView;/WelcomeView引用private boolean flag = false; public TutorialThread(SurfaceHolder surfaceHolder, MyWelcomeView welcomeView) /构造器 this.surfaceHolder = surfaceHolder;/得到SurfaceHolder引用 this.welcomeView = welcomeView;

32、/得到WelcomeView引用 public void setFlag(boolean flag) /设置循环标记位 this.flag = flag; Overridepublic void run() /重写的run方法Canvas c;/创建画布c while (this.flag) / 重复绘图循环,直到线程停止 c = null; try / 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null c = this.surfaceHolder.lockCanvas(null); synchronized (this.surfaceHolder) /同步 welcomeVie

33、w.onDraw(c);/绘制 finally /使用finally语句保证下面的代码一定会被执行 if (c != null) / 解锁c,并渲染当前图像 this.surfaceHolder.unlockCanvasAndPost(c); try Thread.sleep(span);/睡眠指定毫秒数 catch(Exception e)/捕获异常 e.printStackTrace();/打印堆栈信息 (3)MyWelcomeViewThread类package cn.zh.wy.sl;public class MyWelcomeViewThread extends Threadpriv

34、ate boolean flag = true;/循环标志位MyWelcomeView myWelcomeView;/WelcomeView的引用public MyWelcomeViewThread(MyWelcomeView myWelcomeView)/构造器this.myWelcomeView = myWelcomeView;/得到WelcomeView的引用public void setFlag(boolean flag)/设置循环标志位this.flag = flag;public void run()/重写的run方法 try Thread.sleep(300);/睡眠三百毫秒,保

35、证界面已经显示 catch(Exception e)/捕获异常 e.printStackTrace();/打印异常信息 while(flag)myWelcomeView.logo2X -= 30;/更改图片的坐标if(myWelcomeView.logo2X15)myWelcomeView.logo2X = 15; /停止移动if(myWelcomeView.logo2X = 15)/当logo2到位后按钮才移动出现myWelcomeView.menuY -= 30;if(myWelcomeView.menuY355)myWelcomeView.menuY = 355; try Thread.

36、sleep(100);/睡眠指定毫秒数 catch(Exception e)/捕获异常 e.printStackTrace();/打印异常信息 (4)MyGameView类package cn.zh.wy.sl;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;imp

37、ort android.media.MediaPlayer;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MyGameView extends SurfaceView implements SurfaceHolder.Callbackprivate TutorialThread thread;/刷帧的线程/TimeThread timeThread ;MyDoChessActivity myDoChessActivity

38、;/声明Activity的引用Bitmap qiPan;/棋盘Bitmap qizibackground;/棋子的背景图片Bitmap win;/胜利的图片Bitmap lost;/失败的图片Bitmap ok;/确定按钮Bitmap vs;/黑方红方VS的图片Bitmap right;/向右的指针Bitmap left;/向左的指针 Bitmap exit2;/退出按钮图片Bitmap sound2;/声音按钮图片Bitmap sound3;/当前是否播放了声音Bitmap background;/背景图片MediaPlayer go;/下棋声音Paint paint;/画笔boolean

39、caiPan = true;/是否为玩家走棋boolean focus = false;/当前是否有选中的棋子int selectqizi = 0; /当然选中的棋子int startI, startJ;/记录当前棋子的开始位置int endI, endJ;/记录当前棋子的目标位置Bitmap heiZi = new Bitmap7;/黑子的图片数组Bitmap hongZi = new Bitmap7;/红子的图片数组MyGuiZe myGuiZe;/规则类int status = 0;/游戏状态。0游戏中,1胜利, 2失败int qizi = new int/棋盘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,;public MyG

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com