毕业论文-- 基于java的手机游戏《中国象棋》的设计与实现.doc_第1页
毕业论文-- 基于java的手机游戏《中国象棋》的设计与实现.doc_第2页
毕业论文-- 基于java的手机游戏《中国象棋》的设计与实现.doc_第3页
毕业论文-- 基于java的手机游戏《中国象棋》的设计与实现.doc_第4页
毕业论文-- 基于java的手机游戏《中国象棋》的设计与实现.doc_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计说明书毕业设计说明书 (2014 届) 基于 java 的手机游戏中国象棋的 设计与实现 摘摘 要要 作为国粹,中国象棋发展至今已有 2000 余年的历史了,它是中华民族智慧 的结晶。在我国,中国象棋的普及程度是其它棋类无法相比的,大至国际、国 内比赛,小至社区街道。如今,仅中国就有 2 亿人会下中国象棋,且中国象棋 的发展趋势日益国际化。 在信息技术飞速发展的今天,随着的手机日益普及,手机游戏也成了人们生 活中不可缺少的一部分。Java 在移动设备上的功能实现也越来越具影响力,为 丰富人们的生活,提供服务等方面提供了诸多方便。本文主要介绍一款基于 Java 语言开发的手机游戏中国象棋,该设计主要是应用 J2ME 技术,结合 JDK 1.6.0,使用 IDE Eclipse 3.4 与 EclipseMe1.7.9 作为开发工具,以 Sun J2ME Wireless Tool Kit 2.5.2 软件作为模拟测试工具的综合性的开发设 计。本设计主要是对手机游戏的开发过程的各个环节做了详细的介绍,其中包 括:手机游戏开发平台的搭建与测试、具体设计及开发步骤、软件测试运行与 打包生成等,实现了经典游戏中国象棋的手机嵌入,以便满足一些手机用 户的娱乐需求。 关键词:关键词:中国象棋;J2ME;WTK;Eclipse;手机游戏 Abstract As the quintessence of a country for China, it has passed 2300 or 2400 years since Chinese Chess developed. Other chess couldnt be compared with its popularization in China, from large- international or national competition to smaller pieces community street .It is the distillate of Chinese peoples wisdom. Now, there are 200 million people can play Chinese Chess only in China. And Chinese Chess is developing in the way of internationalization. In the day of rapid development of information technology, with the growing po pularity of mobile phone, mobile games also become the indispensable part in daily lif e. Java in the function realization of the mobile device is also more and more influenti al for rich peoples life and providing services offered many convenient. This paper m ainly introduces a mobile game- snake of Java language development. This design is a comprehensive development de sign,which mainly applied 1.6.0 JDK J2ME technology, combined with the Eclipse, EclipseMe1.7.9 as 3.4 development Tool, Tool Kit to 2.5.2 from J2ME Wireless soft ware as simulation test tools. This design is mainly to the mobile games every parts of the development process are described in detail, including: the cellular phone game d evelopment platform and testing, specific design and development steps, software test, operation and packaged generation. Realize the classic game ChineseChess phone embedded, in order to meet some cell phone users entertainment demand. Keywords: Chinese Chess; J2ME;WTK;Eclipse ; Mobile Game 目录目录 第一章 绪 论1 1.1 中国象棋.1 1.2 中国象棋发展的现状2 1.3 手机游戏中国象棋理论3 第二章 JAVA 简介.7 2.1 JAVA 的基本特点7 2.1.1 简单性7 2.1.2 面向对象7 2.1.3 多线程7 2.1.4 分布式7 2.1.5 体系结构中立7 2.1.6 安全性8 2.2 JAVA 的主要技术8 第三章 游戏详细设计与实现9 4.1 功能描述.18 4.2 理论基础.20 4.2.1 中国象棋简介.21 4.2.2 中国象棋走子规则.22 4.2.3 中国象棋吃子规则.23 4.3 总体设计31 4.4 详细设计32 4.4.1 XIActivity.java32 4.4.2 WelcomeView.java32 4.4.3 WelcomeThread.java.32 4.4.4 CAIMenuView.java32 4.4.5 Help.java.32 4.4.6 Game.java.32 4.4.7 Move.java.32 4.4.8 TimeThread.java.32 4.4.9 Guize.java.36 第四章 软件测试38 4.1 走子规则测试40 4.2 吃子规则测试45 第五章 总结与展望49 致 谢50 参考文献51 第一章 绪 论 面对未来的趋势,象棋发展现状令人担忧,职业化道路依然任重而道远。 如今科学技术十分发达,移动设备盛行,手机发张迅速,前景十分广阔,许多 用户不太像从前依赖电脑,有些游戏可以手机上直接进行,而我认为将中国象 棋也移植到移动 app 上可以为广大棋友提供方便,平时出门随时可以下。 本人作为一名学生,在系统的学习了 Java 语言之后,经常用它编一些小 程序。这次毕业设计,我就想将学过的 Java 语言中的各种技术综合起来,编写 一个小游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复 习巩固。 1.1中国象棋 中国象棋是我国国粹,历史悠久,普及流行。下棋双方根据对棋局形势的 理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的 战场上,进行着象征性的军事战斗。 棋盘和棋子: 象棋的棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组, 兵种是一样的,分为七种: 红方:帅、仕、相、车、马、炮、兵 黑方:将、士、象、车、马、炮、卒 其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分 红棋和黑棋。 棋子活动的场所,叫做“棋盘” ,在长方形的平面上,绘有九条平行的竖线 和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中 间第五、第六两横线之间未画竖线的空白地带,称为“河界” ,整个棋盘就以 “河界”分为相等的两部分;两方将帅坐镇、画“米”字方格的地方,叫做 “九宫” 。 将或帅 移动范围:它只能在王宫内移动。 移动规则:它每一步只可以水平或垂直移动一点。 士 移动范围:它只能在王宫内移动。 移动规则:它每一步只可以沿对角线方向移动一点。 象 移动范围:河界的一侧。 移动规则:它每一步只可以沿对角线方向移动两点,另外,在移动的过程 中不能够穿越障碍。 马 移动范围:任何位置。 移动规则:每一步只可以水平或垂直移动一点,再按对角线方面向左或者 右移动。另移动的过程中不能够穿越障碍。 车 移动范围:任何位置。 移动规则:可以水平或垂直方向移动任意个无阻碍的点。 炮 移动范围:任何位置。 移动规则:移动起来和车很相似,但它必须跳过一个棋子来吃掉对方的一 个棋子。 兵 移动范围:任何位置。 移动规则:每步只能向前移动一点。过河以后,它便增加了向左右移动的 能力,兵不允许向后移动。 1.2 中国象棋发展的现状 在中国,若说历史悠久、群众基础雄厚的运动,中国象棋毫无疑问占有一 席之地。而对胡荣华、赵国荣、吕钦、许银川等特级大师来说,他们的梦想是 把这项运动推向世界。1956 年,围棋、国际象棋、中国象棋被列为我国正式体 育项目。50 年来,我国棋类项目的发展有目共睹。全国政协副主席霍英东先生 从 1985 年第五届五羊杯开始慷慨解囊、1988 年承诺永远赞助五羊杯赛。至今, 英东先生已连续赞助了 22 届赛事。如今,五羊杯赛所创下的办赛纪录和赛事水 平,国内外的象棋赛事无出其右;而英东先生二十余载风雨无阻扶掖中国象棋 的赤子之心,更令世人折服。具调查参与网络棋类游戏的人中,象棋每天的在 线人次,经常是围棋和国际象棋在线总人次的两倍!在中国作为中华文化珍贵 传统国粹的象棋有着广泛的群众基础。中国选手在世界范围内一直鲜逢对手。 去年是“人工智能诞生 50 周年” “超级计算机天梭与中国象棋世界冠军的人机 大战有助于把 IT 高科技的元素导入中国象棋,树立中国象棋主流、时尚、风雅 的品牌形象。 ” 国际化普及方面, 1984 年英东先生曾悬奖 50 万美元,鼓励全球非华人棋 手击败一直由中国人占据的中国象棋世界冠军中国象棋和中国文化有很深 的渊源,国外选手实力不够,一方面是推广不够,另一方面则是文化的差异。 真正要学得精,必须要学中文,对中国文化有所了解,这样才能真正理解象棋 的精华,这对外国人而言的确比较难。随着中国被世界越来越了解,中国的文 化,包括象棋会被全世界更多的人了解。相信会有相当一部分人对象棋有兴趣。 这样就会派学生、派棋手到中国来学习,可以把象棋当职业。到那天,想必欧 美国家也会有很多人下象棋。 中国象棋发展至今已有二千三、四百年的历史了,早在战国时期就有正式 记载,堪称中国的国粹。据统计,中国有 2 亿人会下中国象棋,这相当于平均 6 至 7 个人中就有 1 人会下,可见它有着广泛的群众基础。然而,如今中国象 棋的发展前景却令人堪忧。导致这种现象的主要因素有:第一,就东亚地区, 围棋的影响力胜于中国象棋。第二,中国象棋虽然在国内很受欢迎,但在世界 舞台上名声却不如国际象棋那么响亮。之所以会存在这两个因素,都是因为在 国际赛事上中国象棋的参赛选手大都是华人,而非华裔的选手又大都是业余选 手,这无疑使比赛失去了竞争力,而围棋有韩国和日本的参与,国际象棋有全 世界国家的加入。第三,进入了 21 世纪后,供人们娱乐活动的选择越来越多, 中国象棋在年轻人的心中已开始渐渐失去魅力。 1.3 手机游戏中国象棋理论 中国象棋是一个由 java 语言编写的手机游戏,能进行人机对战,是一 款出门必备的休闲类小游戏。 (1)初始态游戏界面: 图 1.3-1 (2)欢迎游戏界面: 图 1.3-2 (3)游戏帮助界面: 图 1.3-3 (4)开始游戏界面: 图 1.3-4 第二章第二章 JAVA 简介简介 JAVA 是 Sun Microsystem 公司开发的编程语言,是一个简单,面向对象, 分布式,解释性,强壮,安全,与系统无关,可移植,高性能,多线程和动态 的语言3。 2.1JAVA 的基本特点的基本特点 2.1.1 简单性简单性 Java 与 C+语言非常相近,但 Java 比 C+简单,它抛弃了 C+中的一些不 是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重 继承以及自动强迫同型。 Java 实现了自动的垃圾收集,简化了内存管理的工 作3。 2.1.2 面向对象面向对象 Java 提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量 和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通 过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而 既实现了代码的复用,又提供了一种动态的解决方案3。 2.1.3 多线程多线程 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程 机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待 影响其他部分,这样容易实现网络上的实时交互操作3。 2.1.4 分布式分布式 Java 是面向网络的语言。通过它提供的类库可以处理 TCP/IP 协议,用户 可以通过 URL 地址在网络上很方便的访问其他对象3。 2.1.5 体系结构中立体系结构中立 Java 是一种网络语言,为使 Java 程序能在网络的任何地方运行,Java 解 释器生成与体系结构无关的字节码结构的文件格式。为了使 Java 的应用程序能 不依赖于具体的系统,Java 语言环境还提供了用于访问底层操作系统功能的类 组成的包,当程序使用这些包时,可以确保它能运行在各种支持 Java 的平台上 3。 2.1.6 安全性安全性 用于网络、分布环境下的 Java 必须要防止病毒的入侵,Java 不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使 用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误3。 2.2JAVA 的主要技术的主要技术 过滤流 DataInputStream 和 DataOutputStream 除了分别作为 FilterInputStream 和 FilterOutputStream 的子类外,还分别实现了接口 DataInput 和 DataOutput。接口 DataInput 中定义的方法主要包括从流中读取 基本类型的数据、读取一行数据、或者读取指定长度的字节数,如 readBoolean()、 readInt()、readLine()、readFully()等。接口 DataOutput 中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组, 如 writeChar()、writeDouble()。 DataInputStream 可以从所连接的输入流中 读取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式; DataOutputStream 可以向所连接的输出流写入基本类型的数据4。 第三章第三章 游戏详细设计与实现游戏详细设计与实现 3.1 功能描述功能描述 本程序中,利用 JAVA 实现了一个中国象棋对弈的软件,它主要包括如下功能: 游戏初始界面,点击菜单能进入欢迎游戏界面。 点击开始游戏按钮进行象棋对弈。首先红方走棋,然后黑方走棋,直到一方获胜。 点击退出按钮,然后重新打开游戏开始新的游戏。 点击声音按钮,进行声音的开和关。 点击帮助按钮。提示帮助信息状态。 3.2 理论基础理论基础 3.2.1 中国象棋简介中国象棋简介 中国象棋的棋盘是方型的,棋盘的中间有一条“界河” ,把对垒的双方隔在 两边。两边画有交叉线的地方共有 90 个交叉点,棋子就摆在这些交叉点上。中 国象棋共有 32 枚棋子,分为黑红两组,下棋的双方各用一组,每组各有一帅 (将) 、两士(仕) 、两相(象) 、两马、两车、两炮、五兵(卒) 。两人对局时, 按照规定的位置将各自的棋子摆好,按照“红先黑后”的原则,红方先走,然 后轮流下棋子。各种棋子走法不同,最后把对方将死为胜,不分胜负则为和棋。 3.2.2 中国象棋走子规则中国象棋走子规则 帅(将)每一次只允许走一步,前进、后退、横走都可以,但不能走 出“九宫” 。 士每一次只许沿“九宫”斜线走一步,可进可退。 相(象)不能越过“河界” ,每一次斜走两格,可进可退,即俗称“相 (象)走田字” 。当田字中民有别的棋子时,俗称“塞相(象)眼” ,则不可以 走过去。 马每次走一直(或一横)一斜,可进可退,俗称“马走日字” ,如果在 要去的方向上有别的棋子挡住。俗称“蹩马腿” ,则不许走过去。 车每一次可直进、直退、横走、不限步数。 炮在不吃子的时候,走法同车一样。 兵(率)在没有过“河界”前,每次只许向前直走一步,过“河界” 后每次可向前直走或横走一步,但不能后退。 3.2.3 国象棋吃子规则国象棋吃子规则 在走棋时,如果棋子能够走到的位置有棋子存在,且该棋子为对方棋子时, 就可以把对方棋子吃掉而占领那个位置。只有炮在吃子时必须隔一个棋子(隔 的棋子无论是哪一方的都可以)跳吃,即俗称“炮打隔子” 。 除帅(将)外其它棋子都可以听任对方吃,或主动送吃。吃子的一方,必 须立即把被吃的棋子从棋盘上拿走。如果帅(将)被吃掉则本局游戏结束。 3.3 总体设计总体设计 手机游戏中国象棋的程序由文件 XIActivity.java、WelcomeView.java、WelcomeThread.java、CAIMenuView.ja va、Help.java、Game.java、Move.java、TimeThread.java 和 GuiZe.java 实 现。XIActivity.java 在此文件中定义了类 XIActivity,这是本实例游戏控制 器类,功能是在合适的时候初始化相应的用户界面,根据其他界面的要求切换 到需要的界面。WelcomeView.java 在此文件中定义了类 WelcomeView,此类是 一个辅助界面类,是刚进入游戏系统后显示的欢迎界面框架。 WelcomeThread.java 在此文件中定义了类 WelcomeThread,此类也是一个辅助 界面类,用于生成欢迎界面的动画效果。CAIMenuView.java 在此文件中定义了 类 CAIMenuView,功能是在欢迎界面单击【菜单】按钮时进入菜单界面。 Help.java 在此定义了类 Help,这也是一个辅助界面类,功能是显示游戏系统 的使用方法。Game.java 此文件和前面介绍的界面辅助类不一样,在此文件中 定义的 Game 类是一个核心类,功能是实现游戏界面框架。Move.java 在此文件 中定义了象棋的走法类 Move,在走法中包含了什么棋子、起始点的位置、目标 点的位置以及估值时所用到的 score。GuiZe.java 在里面定义了象棋 GuiZe。 我们知道象棋是有规则的,例如马走日,象走田。 文件 Game.java 实现流程如下:定义继承于 SurfaceView 的类 Game,然后 定义了类中需要的成员变量、分别定义系统中的构造器和对应构造方法、定义 绘制方法 onDraw,该方法是自己定义的并非重写的,只会根据数据绘制屏幕、 定义重写的屏幕监听方法 onTouchEvent,该方法是游戏主要逻辑接口,用于接 收玩家输入。它会根据点击的位置和当前的游戏状态做出相应的处理,当需要 切换 View 界面时,通过给 Activity 发送 Handler 消息来处理、定义方法 getPo,用于将将坐标换算成数组的维数。其中棋子的移动规则被定义为内部类, 名为 GuiZe.java。GuiZe.java 类中的方法用于定义各个棋子的移动规则和吃子 规则。 .详细设计详细设计 . XIActivity.javaXIActivity.java public class XIActivity 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(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().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);/设置游戏声音循环播放 this.initWelcomeView();/初始化欢迎界面 public void initWelcomeView()/初始化欢迎界面 this.setContentView(new WelcomeView(this,this);/切换到欢 迎界面 if(isSound)/需要播放声音时 startSound.start();/播放声音 public void initGameView()/初始化游戏界面 this.setContentView(new Game(this,this); /切换到游戏界面 public void initMenuView()/初始化菜单界面 if(startSound != null)/停止 startSound.stop();/停止播放声音 startSound = null; if(this.isSound)/是否播放声音 gamesound.start();/播放声音 this.setContentView(new CAIMenuView(this,this);/切换 View public void initHelpView()/初始化帮助界面 this.setContentView(new Help(this,this);/切换到帮助界面 3.4.23.4.2 WelcomeView.javaWelcomeView.java public TutorialThread(SurfaceHolder surfaceHolder, WelcomeView welcomeView) /构造器 this.surfaceHolder = surfaceHolder;/得到 SurfaceHolder 引 用 this.welcomeView = welcomeView;/得到 WelcomeView 引用 public void setFlag(boolean flag) /设置循环标记位 this.flag = flag; Override public void run() /重写的 run 方法 Canvas c;/画布 while (this.flag) /循环 c = null; try / 锁定整个画布,在内存要求比较高的情况下,建议参数 不要为 null c = this.surfaceHolder.lockCanvas(null); synchronized (this.surfaceHolder) /同步 welcomeView.onDraw(c);/绘制 finally /使用 finally 语句保证下面的代码一定会被执 行 if (c != null) /更新屏幕显示内容 this.surfaceHolder.unlockCanvasAndPost(c); try Thread.sleep(span);/睡眠指定毫秒数 catch(Exception e)/捕获异常 e.printStackTrace();/打印堆栈信息 3.4.33.4.3 WelcomeThread.javaWelcomeThread.java public class WelcomeThread extends Thread private boolean flag = true;/循环标志位 WelcomeView welcomeView;/WelcomeView 的引用 public WelcomeThread(WelcomeView welcomeView)/构造器 this.welcomeView = welcomeView;/得到 WelcomeView 的引用 public void setFlag(boolean flag)/设置循环标志位 this.flag = flag; public void run()/重写的 run 方法 try Thread.sleep(300);/睡眠三百毫秒,保证界面已经显示 catch(Exception e)/捕获异常 e.printStackTrace();/打印异常信息 while(flag) welcomeView.logoX += 10;/移动欢迎界面的 logo if(welcomeView.logoX0)/到位后停止移动 welcomeView.logoX = 0; welcomeView.boyX += 20;/移动小男孩图片 if(welcomeView.boyX70)/到位置后停止移动 welcomeView.boyX = 70; welcomeView.oldboyX += 15;/移动小老头 if(welcomeView.oldboyX0)/到位后停止移动 welcomeView.oldboyX = 0; welcomeView.bordbackgroundY += 50;/移动文字背景 if(welcomeView.bordbackgroundY240) welcomeView.bordbackgroundY = 240; welcomeView.logo2X -= 30;/更改图片的坐标 if(welcomeView.logo2X200 /将该棋子 设为选中的棋子 focus = true;/标记当前有选中的棋 子 startI = i; startJ = j; else/之前选中过棋子 if(qiziij != 0)/点击的位置有棋子 if(qiziij 7)/如果是自己的棋子. selectqizi = qiziij;/将该棋子 设为选中的棋子 startI = i; startJ = j; else/如果是对方的棋子 endI = i; endJ = j;/保存该点 boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ); if(canMove)/如果可以移动过去 caiPan = false;/不让玩家走了 if(qiziendIendJ = 1 | qiziendIendJ = 8)/如果是“帅”或“将” this.success();/胜利了 else if(activity.isSound) go.start();/播放下棋声 音 qiziendIendJ = qizistartIstartJ;/移动棋子 qizistartIstartJ = 0;/ 将原来处设空 startI = -1; startJ = -1; endI = -1; endJ = -1;/还原保存点 focus = false;/标记当前没 有选中棋子 Move cm = guiZe.searchAGoodMove(qizi);/根据当前局势查询一个最好的走法 if(activity.isSound) go.start();/播放下棋声 音 qizicm.toXcm.toY = qizicm.fromXcm.fromY;/移动棋子 qizicm.fromXcm.fromY = 0; caiPan = true;/恢复玩家响 应 /end 点击的位置有棋子 else/如果点击的位置没有棋子 endI = i; endJ = j; boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);/查看是否可走 if(canMove)/如果可以移动 caiPan = false;/不让玩家走了 if(activity.isSound) go.start();/播放下棋声音 qiziendIendJ = qizistartIstartJ;/移动棋子 qizistartIstartJ = 0;/将原来 处置空 startI = -1; startJ = -1; endI = -1; endJ = -1;/还原保存点 focus = false;/标志位设 false Move cm = guiZe.searchAGoodMove(qizi);/得到一步走法 if(qizicm.toXcm.toY = 8)/电 脑吃了您的将 status = 2;/切换游戏状态为失 败 if(activity.isSound)/需要播放声 音时 go.start();/播放下棋声音 qizicm.toXcm.toY = qizicm.fromXcm.fromY;/移动棋子 qizicm.fromXcm.fromY = 0; caiPan = true;/恢复玩家响应 /end 之前选中过棋子 /end 点击的位置在棋盘内时 /end 游戏中时 return super.onTouchEvent(event); public int getPos(MotionEvent e)/将坐标换算成数组的维数 int pos = new int2; double x = e.getX();/得到点击位置的 x 坐标 double y = e.getY();/得到点击位置的 y 坐标 if(x10 if(toY9)/当下边出界时 return false; if(fromX=toX moveChessID = qizifromYfromX;/得到起始棋子 targetID = qizitoYtoX;/得带终点棋子 if(isSameSide(moveChessID,targetID)/如果是同一阵营的 return false; switch(moveChessID) case 1:/黑帅 if(toY2|toX5)/出了九宫格 return false; if(Math.abs(fromY-toY)+Math.abs(toX-fromX)1)/只能 走一步 return false; break; case 5:/黑士 if(toY2|toX5)/出了九宫格 return false; if(Math.abs(fromY-toY) != 1 | Math.abs(toX-fromX) != 1)/走斜线 return false; break; case 6:/黑象 if(toY4)/不能过河 return false; if(Math.abs(fromX-toX) != 2 | Math.abs(fromY-toY) != 2)/相走“田”字 return false; if(qizi(fromY+toY)/2(fromX+toX)/2 != 0) return false;/相眼处有棋子 break; case 7:/黑兵 if(toY 1)/只能走一步, 并且是直线 return false; break; case 8:/红将 if(toY5|toX1)/只能 走一步 return false; break; case 2:/黑车 case 9:/红车 if(fromY != toY if(fromY = toY)/走横线 if(fromX 5|toX fromY)/不能回头 return false; if(fromY 4 /不让走 if(fromY - toY + Math.abs(toX - fromX) 1)/只能走一 步,并且是直线 return false;/返回 false 不让走 break; default: return false; return true; /* * * 电脑是通过该方法得到当前棋局最好的走法 */ public Move searchAGoodMove(int qizi)/查询一个好的走法 List ret = allPossibleMoves(qizi);/产生所有走法 try Thread.sleep(4000);/睡眠四秒钟,以便调试 catch (InterruptedException e) /捕获异常 e.printStackTrace();/打印堆栈信息 return ret.get(int)(Math.random()*ret.size(); public List allPossibleMoves(int qizi)/产生所有可能的 走法 List ret = new ArrayList();/用来装所有可能的走法 for (int x = 0; x 7)/是红方,即是玩家棋子时跳过 continue; switch (chessman) case 1:/黑帅 if(canMove(qizi, x, y, x, y+1)/向下走一格 ret.add(new Move(chessman, x, y, x, y+1, 0); if(canMove(qizi, x, y, x, y-1)/向上走一格 ret.add(new Move(chessman, x, y, x, y-1, 0); if(canMove(qizi, x, y, x+1, y)/向左走一格 ret.add(new Move(chessman, x, y, x+1, y, 0); if(canMove(qizi, x, y, x-1, y)/向右走一格 ret.add(new Move(chessman, x, y, x-1, y, 0); break; case 5:/黑士 case 12:/红仕 if(canMove(qizi, x, y, x-1, y+1)/左下走 ret.add(new Move(chessman, x, y, x-1, y+1, 1); if(canMove(qizi, x, y, x-1, y-1)/左上走 ret.add(new Move(chessman, x, y, x-1, y-1, 1); if(canMove(qizi, x, y, x+1, y+1)/右下走 ret.add(new Move(chessman, x, y, x+1, y+1, 1); if(canMove(qizi, x, y, x+1, y-1)/右上走 ret.add(new Move(chessman, x, y, x+1, y-1, 1); break; case 6:/黑象 case 13:/红相 if(canMove(qizi, x, y, x-2, y+2)/左上走 ret.add(new Move(chessman, x, y, x-2, y+2, 1); if(canMove(qizi, x, y, x-2, y-2)/左下走 ret.add(new Move(chessman, x, y, x-2, y-2, 1); if(canMove(qizi, x, y, x+2, y+2)/右下走 ret.add(new Move(chessman, x, y, x+2, y+2, 1); if(canMove(qizi, x, y, x+2, y-2)/右上走 ret.add(new Move(chessman, x, y, x+2, y-2, 1); break; case 7:/黑兵 if(canMove(qizi, x, y, x, y+1)/直走 ret.add(new Move(chessman, x, y, x, y+1, 2); if(y = 5)/过河了 if (canMove(qizi, x, y, x - 1, y) /过河后向左走 ret.add(new Move(chessman, x, y, x - 1, y, 2); if (canMove(qizi, x, y, x + 1, y) /过河走向右走 ret.add(new Move(chessman, x, y, x + 1, y, 2); break; case 14:/红兵 if(canMove(qizi, x, y, x, y-1)/向前走 ret.add(new Move(chessman, x, y, x, y-1, 2); if(y -1; i+)/向上走 if(canMove(qizi, x, y, x, i)/可以走时 ret.add(new Move(chessman, x, y, x, i, 0); else/不可以走时 break; for(int j=x-1; j-1; j+)/向走走 if(canMove(qizi, x, y, j, y)/可以走时 ret.add(new Move(chessman, x, y, j, y, 0); else/不可以走时 break; for(int j=x+1; j-1; i-)/向上走时 if(canMove(qizi, x, y, x, i)/当可以走 时 ret.add(new Move(chessman, x, y, x, i, 0); for(int j=x-1; j-1; j-)/向左走时 if(canMove(qizi, x, y, j, y)/当可以走 时 ret.add(new Move(chessman, x, y, j, y, 0); for(int j=x+1; j7 else if(moveChessID=7 else/其他情况 return false; 第四章第四章 软件测试软件测试 软件测试是为了发现程序中的错误而执行程序的过程;好的测试方案能够 发现尚未发现的错误;成功的测试是发现了尚未发现的错误的测试。软件测试 的目的是,通过人工或计算机执行程序有意识地发现程序中的设计错误和编码。 因此,为了保证本软件的质量,对系统主要模块进行了如下软件测试。 4.1走子规则测试走子规则测试 图 4.1 走子规则测试表 模块名中国象棋规则的类(ChessRule) 版本号开发人员测试类型 测试日 期 1.0我功能测试 2014 年 5 月 10 日 Man 代码棋子名称测试目的测试方式预期结果实际结果 测试数 据 0黑车 测试黑车是否可以 水平或垂直方向移 动任意无阻碍的点 黑车沿直线行走 3 步可以走动相符合 1黑车 测试黑车是否可以 不按规则走到任意 一点 黑车沿斜线行走 3 步不可以走动相符合 4黑马 测试黑马是否可以 按规则走“日”字 向右上方走“日”字可以走动相符合 5黑马 测试黑马在“蹩马 腿”的情况下是否 可以走动 在“蹩马腿”的情况 下向右下方走“日” 字 不可以走动相符合 8黑象 测试黑象是否可以 按规则走“田”字 向左下方走“田”字可以走动相符合 9黑象 测试黑象在“塞象 眼”的情况下是否 可以走动 在“塞象眼”的情况 下向左上方走“日” 字 不可以走动相符合 12黑士测试黑士是否每一向左上方走一步可以走动相符合

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论