1、 . 毕业设计Android版的中国象棋人机对弈游戏设计与实现毕业设计(论文)原创性声明和使用授权说明原创性声明本人重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作与取得的成果。尽我所知,除文中特别加以标注和致的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得与其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了意。作 者 签 名:日 期:指导教师签名: 日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版
2、本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部容。作者签名: 日 期:摘要象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的例,一个是象棋棋谱编辑和对弈程序的公共平台WinBoard平台,另一个是商业的国际象棋数据库和对弈软件ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。国际象棋软件有着成功的商业运作,已发展成一种产业。然而,电脑在中国象棋上的运用还刚刚起步,尽管国涌现出一大批中国象棋的专业和专业软件,但是由于缺乏必要的基础工作,
3、电脑技术在中国象棋上的应用优势还无法体现出来。在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。例如B. Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。中国象棋游戏的设计工作是非常复杂和重要的,它涉与面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,将牵涉到图形界面的显示与更新,并且在这个游戏的开
4、发中还会应用类的继承机制以与一些设计模式。该游戏主要研究基于android技术的中国象棋游戏的分析与设计,对中国象棋游戏特殊的行棋规则给予了细致的分析与理解,设计出了一种实时可行的行棋规则,从移动围、移动方向等方面重新描述行棋规则,基于android技术通过计算机模拟实现了中国象棋特殊的行棋规则算法,设计出了一种可行的方法,使每个棋子的行棋路线都严格遵循本身的行棋规则,游戏的实战对弈得以实现,通过实验运行,证明这种限定棋子行棋路线的方法是可行的,并得到了预期的目标。关键词:android版、中国象棋、人机对弈、类、规则 目 录第一部分:中国象棋的开发背景*第二部分:中国象棋的需求分析*第三部分
5、:游戏的策划与准备工作第四部分:功能简介与其运行结果第五部分:游戏的架构第六部分:游戏框架的简介第七部分:游戏结论第八部分:游戏展望第九部分:指导第十部分:游戏参考文献第一部分:中国象棋的开发背景1、中国象棋具有悠久的历史,象棋的爱好者更是数不胜数,远在战国时代,象棋便在贵族阶层中广为流传,早期的象棋是象征着当时战斗场面的游戏,后来这种观念慢慢被改变,成了人们休闲娱乐中不可缺少的一部分。2、而当今的人们忙于工作,很少有时间静下心来享受一下象棋对弈的乐趣,因此电脑版象棋、手机版象棋便开始受到人们的关注。第二部分:中国象棋的需求分析该游戏是改编网络版中国象棋,使其更加满足玩家的的要求。主要用于an
6、droid手机的平台。满足广大象棋爱好者的要求。第三部分:游戏的策划与准备工作1)游戏的策划游戏类型 该游戏属于棋牌类游戏的一种,并采用简单的人工智能,可达到玩家与电脑进行对弈的效果。运行的目标平台 游戏的目标平台为Android2.2(3)操作方式 该游戏拟采用屏幕事件进行操作,玩家可以鼠标来单击屏幕完成对游戏进行控制,游戏中部分的功能可以使用键盘操作来完成。2)android平台下游戏的准备工作1、相关的素材。图片名称用途bacnground.png游戏背景图片logo2.png欢迎界面logo2welcomebackage.png欢迎界面背景图片helpbackground.png帮助界
7、面背景图片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红象d4.png红马e5.png红
8、車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)运行该游戏,首先进入的将是欢迎界面,效果如图1所示。
9、图1(2)当欢迎动画播放完毕后,单击“菜单”按钮就可以进入菜单界面,如图2所示。 图2(3)在菜单按钮界面,可以通过“打开声音”/“关闭声音”菜单来控制游戏声音的开关,单击“帮助”菜单可以进入帮助界面,如图3所示。 图3(4)而在菜单界面单击“开始游戏”菜单将进入游戏界面,如图4所示。 图4在游戏界面玩家可以通过单击自己的棋子来走棋,同时可以单击声音按钮来打开或者关闭声音。当游戏一方“将”或者是另一方的“帅”被吃掉是,会出现游戏胜利的界面,如图6所示。 图6在游戏过程中,玩家可以随时通过单击“退出”按钮返回到游戏主菜单。第五部分:游戏的架构共有类 Activity的实现类MyDoChessAc
10、tivity,该类是通过扩展基类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平台的手机的棋艺爱好者的需求。第九部分:指导 老师教给我的知识和方法,各位网友的热心帮助,帮助我解决了很多问题,真的你们第十部分:参考文献C/C+中国象棋程序入门与提高鹏等著电子工业
17、学会用JAVA开发网络游戏ANDROID_21.0游戏开发实战宝典附件加代码:(1)MyDoChessActivity类package.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.WindowManager;public class MyDoChessAc
18、tivity 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 initMenuView();/初始化并切换到菜单界面 else if(
19、msg.what = 2)/MenuView传来的消息,切换到GameView initGameView();/初始化并切换到游戏界面 else if(msg.what = 3)/MenuView传来的消息,切换到HelpView initHelpView();/初始化并切换到帮助界面 ; public void onCreate(Bundle savedInstanceState) /重写的onCreate super.onCreate(savedInstanceState);/全屏requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow
20、().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);/游戏过程的背景声音gamesound.setLooping(true);/设置游戏
21、声音循环播放 this.initWelcomeView();/初始化欢迎界面 public void initWelcomeView()/初始化欢迎界面 this.setContentView(new MyWelcomeView(this,this);/切换到欢迎界面 if(isSound)/需要播放声音时 startSound.start();/播放声音 public void initGameView()/初始化游戏界面 this.setContentView(new MyGameView(this,this); /切换到游戏界面 public void initMenuView()/初始
22、化菜单界面 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);/切换到帮助界面 (2)MyWelcomeView类package.zh.wy.
23、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;public class MyWelcomeView extends Sur
24、faceView implements SurfaceHolder.Callback MyDoChessActivity myDoChessActivity;/的引用private TutorialThread thread;/部刷帧的线程private MyWelcomeViewThread moveThread;/物件移动的线程Bitmap welcomebackage;/大背景Bitmap logo2;Bitmap menu;/菜单按钮 int logo2X = 100;/初始化需要移动的图片的相应坐标int bordbackgroundY = -100;/背景框的y坐标int menu
25、Y = 550;/菜单的y坐标public MyWelcomeView(Context context,MyDoChessActivity myDoChessActivity) /构造器 super(context);this.myDoChessActivity = myDoChessActivity;/得到myDoChessActivity引用 getHolder().addCallback(this); this.thread = new TutorialThread(getHolder(), this);/初始化刷帧线程 this.moveThread = new MyWelcomeVi
26、ewThread(this);/初始化图片移动线程 initBitmap();/初始化所以图片public void initBitmap()/初始化所以图片welcomebackage = BitmapFactory.decodeResource(getResources(), R.drawable.welcomebackage);logo2 = BitmapFactory.decodeResource(getResources(), R.drawable.logo2);menu = BitmapFactory.decodeResource(getResources(), R.drawabl
27、e.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);/绘制menu/从写surfaceChanged方法public vo
28、id 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();/启动线程public void surfaceDestroyed(Surface
29、Holder 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(MotionEvent event) /屏幕监听if(event.get
30、Action() = 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;/睡眠的毫秒数 private SurfaceHolder surfaceHolder
31、;/SurfaceHolder引用private MyWelcomeView welcomeView;/WelcomeView引用private boolean flag = false; public TutorialThread(SurfaceHolder surfaceHolder, MyWelcomeView welcomeView) /构造器 this.surfaceHolder = surfaceHolder;/得到SurfaceHolder引用 this.welcomeView = welcomeView;/得到WelcomeView引用 public void setFlag(
32、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) /同步 welcomeView.onDraw(c);/绘制 finally /使用finally语句保证
33、下面的代码一定会被执行 if (c != null) / 解锁c,并渲染当前图像 this.surfaceHolder.unlockCanvasAndPost(c); try Thread.sleep(span);/睡眠指定毫秒数 catch(Exception e)/捕获异常 e.printStackTrace();/打印堆栈信息 (3)MyWelcomeViewThread类package.zh.wy.sl;public class MyWelcomeViewThread extends Threadprivate boolean flag = true;/循环标志位MyWelcomeVi
34、ew 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);/睡眠三百毫秒,保证界面已经显示 catch(Exception e)/捕获异常 e.printSt
35、ackTrace();/打印异常信息 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.sleep(100);/睡眠指定毫秒数 catch(Exception e)/捕获
36、异常 e.printStackTrace();/打印异常信息 (4)MyGameView类package.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;import android.media.MediaPlayer;import android
37、.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MyGameView extends SurfaceView implements SurfaceHolder.Callbackprivate TutorialThread thread;/刷帧的线程/TimeThread timeThread ;MyDoChessActivity myDoChessActivity;/声明Activity的引用Bitmap qiPan;/棋盘Bitmap qiziba
38、ckground;/棋子的背景图片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 caiPan = true;/是否为玩家走棋boolean focus = false;
39、/当前是否有选中的棋子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 MyGameView(Context context,MyDoChessActivity myDoChessActivity) /构造器super(context);this.myDoChessActivity = myDoChessActivity;/