基于android的中国象棋的设计与实现毕业论文(编辑修改稿)内容摘要:

if(fromY == toY){//横线 if(fromX toX){//想右走 for(i = fromX + 1。 i toX。 i++){ if(qizi[fromY][i] != 0){ return false。 //返回 false } } } else{//向走走 for(i = toX + 1。 i fromX。 i++){ if(qizi[fromY][i]!=0){ return false。 //返回 false } } } } else{//竖线 if(fromY toY){//向下走 for(j = fromY + 1。 j toY。 j++){ if(qizi[j][fromX] != 0){ return false。 //返回 false } } } else{//向上走 for(j = toY + 1。 j fromY。 j++){ 13 if(qizi[j][fromX] != 0){ return false。 //返回 false } } } } } else{//吃子时 int count=0。 if(fromY == toY){//走的是横线 if(fromX toX){//向右走 for(i=fromX+1。 itoX。 i++){ if(qizi[fromY][i]!=0){ count++。 } } if(count != 1){ return false。 //返回 false } } else{//向左走 for(i=toX+1。 ifromX。 i++){ if(qizi[fromY][i] != 0){ count++。 } } if(count!=1){ return false。 //返回 false } } } else{//走的是竖线 if(fromYtoY){//向下走 14 for(j=fromY+1。 jtoY。 j++){ if(qizi[j][fromX]!=0){ count++。 //返回 false } } if(count!=1){ return false。 //返回 false } } else{//向上走 for(j=toY+1。 jfromY。 j++){ if(qizi[j][fromX] != 0){ count++。 //返回 false } } if(count!=1){ return false。 //返回 false } } } } break。 15 象、相:只可以在己方 阵营走动,且仅限于 7 个点,即己方“田”字格上的 7 个点,走的是斜线,走动时,起始点与目标点构成一条斜线,若该斜线的中点位置存在其他棋子,则被绊住无法走动。 图 象的走法 case 6://黑象 if(toY4){//不能过河 return false。 } if((fromXtoX) != 2 || (fromYtoY) != 2){//相走“田”字 return false。 } if(qizi[(fromY+toY)/2][(fromX+toX)/2] != 0){ return false。 //相眼处有棋子 } break。 case 13://红相 if(toY5){//不能过河 return false。 //返回 false } if((fromXtoX) != 2 || (fromYtoY) != 2){//相走“田”字 16 return false。 //返回 false } if(qizi[(fromY+toY)/2][(fromX+toX)/2] != 0){ return false。 //相眼处有棋子 } break。 将、帅:只可以在己方阵营走动,且仅限于 9 个点,即己方底三行中三列形成的 9个交叉点,也就是俗称的“九宫”,一步只可以走动一个方格的直线距离作为本方的主将,镇守大本营,双方的主将是不能够处于同一条直线而主将之间不存在其他的棋子进行隔挡。 图 将帅的走法 case 1://黑帅 if(toY2||toX3||toX5){//出了九宫格 return false。 } if(((fromYtoY)+(toXfromX))1){//只能走一步 return false。 } break。 17 case 8://红将 if(toY7||toX5||toX3){//出了九宫格 return false。 } if(((fromYtoY)+(toXfromX))1){//只能走一步 return false。 } break。 (2) 棋盘的表示 针对棋盘的设计,每一种棋子对应一个固定的值用以识别该棋子的类型,那么设计就根据红黑双方的棋子以及每个类型的棋子,设计规则类( GuiZe 类,调用其中的 canMove方法用以判断某一步走棋的是否可行。 规则类的设计则采用了常规的办法,因为棋子的种类只有 7 种,且红黑双方处于棋盘的两端,某些棋子走动时的方向不一样,设计时就要进行分类讨论设计,供存在 14 中不同的判别方法来对所以的棋子走法进行判别是否可行,每一个判别方法都对应于其独有的判断算法。 棋盘上各种棋子以及棋盘的初始布局的设计采用 10*9 的数组来进行标识,如下图 所示 : 图 棋盘初始布局 各个数字的对应关系如下: 0无棋子; 1黑方的帅; 2黑方的车 ; 3黑方的马; 4黑方的炮; 5黑方的士; 6黑方的象; 7黑方的卒; 8红方的将; 9红方的车; 10红方的马; 11红方的炮; 12红方的士; 13红方的相; 14红方的兵。 坐标 (0,0)到坐标 (8,4)之间的坐标代表楚河汉界的一方,坐标 (0,5)到坐标 (8,9)之间的 18 坐标代表楚河汉界的另一方,即红黑双方各自的领土。 电脑走棋时通过构造一个走法类 ChessMove,创建一个对象调用 NegamaxEngine 类中的 Search()函数 根据当前局势查询一个最好的走法 记录棋子的原有位置坐标、目标位置坐标、 棋子类型并对该对象进行初始化。 然后根据该对象记录的原有位置坐标和目标位置坐标进行数据改变达到行棋目的。 玩家走棋是通过对屏幕进行监听,从而记录棋子类型,原有位置坐标和目标位置坐标,通过调用规则类 GuiZe 中的 CanMove 判断该棋子走法是否可行符合棋子走棋规则,可行就改变原有位置和目标位置数据,达到行棋的目的 轮到走棋的一方,游戏界面当前位置显示走棋一方的“黑帅”或者“红将”,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,这样一方走棋结束当前位置显示改变轮到另一方走棋。 任何棋子 走动,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,即在 10*9 数组中相应位置的数字变为自己棋子所对应的数字,自己棋子原来所在的位置对应数组的数字变为 0,刷帧线程不断的刷新界面改变屏幕显示,这样对方的棋子就被吃掉,在屏幕上消失在对应显示自己的棋子;如果目标位置上没有对方棋子, 10*9 数组对应目标位置数字改变,原有位置数字变为 0,刷帧线程更新界面改变显示。 游戏人机对战的实现 (1) 首先产生所有可能的走法,定义 一个 ArrayList 容器,把可能的走法放入 ArrayList 容器里面。 public ListChessMove allPossibleMoves(int qizi[][]){//产生所有可能的走法 ListChessMove ret = new ArrayListChessMove()。 //用来装所有可能的走法 for (int x = 0。 x 10。 x++){ for (int y = 0。 y 9。 y++){//循环所有的棋牌位置 int chessman = qizi[x][y]。 if (chessman != 0){//当次位 置不为空时,即有棋子时 if(chessman 7){//是红方,即是玩家棋子时跳过 continue。 } .......... } } } 19 return () ? null : ret。 //当 ret 中没有走法时,返回空,有时返回 ret } (2) 利用随机数从容器中取出一种走法,完成移动。 public ChessMove searchAGoodMove(int[][] qizi){//查询一个好的走法 ListChessMove ret = allPossibleMoves(qizi)。 //产生所有走法 try { (1000)。 //睡眠四秒钟,以便调试 } catch (InterruptedException e) {//捕获异常 ()。 //打印堆栈信息 } return ((int)(()*()))。 } 系统 流程图 游戏流程图 如图 所示 图 系统流程图 菜单开始游戏红方走棋黑方是否被将死红方胜利 黑方走棋结束游戏红方是否被将死黑方胜利 20 5 运行测试 测试 用例表 测试编号 测试目标 期望结果 实际结果 001 测试象棋“马”是否“绊马腿” 游戏过程中,“马”在绊马腿情况下不能移动。 能实现“绊马腿” 002 测试一方棋子能否被另一方吃掉,并消失 棋子被吃后消失,吃子的棋子能代替被吃棋子的位置 一方棋子能被另一方吃掉,并消失 003 测试对手的象棋“将”能否被将死,能结束游戏 对手的象棋“将”被将死,并出现提示“你赢了” ,结束游戏 对手的象棋“将”被将 死,能结束游戏 004 测试象棋“炮”是否能隔子吃掉 对手的棋子,即“炮打隔子” “炮”隔子吃掉对手棋子 “炮”能“炮打隔子” 005 测试游戏棋子是否能移动 棋子从一个到另一个位置 游戏棋子能移动 006 不同 分辨率模拟器能否正常运行 能够 正常运行 不能 正常运行 007 能否 对将 可以对将 不能对将 测试结果 (1) 测试 001“马”是否“绊马腿”测试 结果 如 图 所示 图 测试 绊马腿 21 (2) 测试 002 一方棋子能否被另一方吃掉测试 结果 如 图 所示 图 测试 吃子 (3) 测试 003“将”能否被将死测试 结果 如 图 所示 图 测试能否 赢 棋 22 (4) 测试 003“将”能否被将死测试 结果 如 图 所示。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。