1,
makeMove(states, move, ifBlack);
int rv = -search_NegaScout_Memo_HH_DiffVal(states, searchDepth - 1, !ifBlack, move,-bt , -best,typecount);
if(rv>best && i>0){//重新搜索 best=-search_NegaScout_Memo_HH_DiffVal(states, searchDepth -
!ifBlack, move,-Integer.MAX_VALUE , -rv,typecount); bestMove=move; } unMakeMove(states, move); if (rv > best) { best = rv; bestMove = move; } bt=best+1; if(progress!=null)progress.setValue(progress.getValue()+1); }
//historyTable[bestMove.x][bestMove.y]+=(1< 策略型人工智能可以说是所有电脑AI中比较复杂的一种,最常见的运用策 略型AI的游戏就是棋盘类游戏,本设计中所讨论的五子棋游戏就是运用策略型AI的典范。对于这类游戏,对弈时电脑必须根据当前棋局分析判断所有可以走的棋步和可能的获胜情况,并计算玩家的可走棋步和致胜几率,最后选择最佳的走棋步法。即玩家落子后,电脑根据当前的局势,计算出最合适的落子方位(以坐标形式显示),并显示出搜寻的节点数,时间和静态值。效果如下图4-3: 图4-3 运行显示图 电脑落子的考虑不单单要在进攻方面做考虑,还要从防守方面做考虑。这样才能做到攻守兼备。这一细节的实现其实就是让电脑根据玩家棋盘布局来分析战况,然后找出对玩家最有利的落子位置进行进攻和防守。 当棋盘上出现连续的3种棋子时就要进行防守了,下面介绍下一般出现的几种布局: plane = PlaneState.makeEmptyPlane(15); plane[8][6] = plane[9][7] = plane[8][8] = plane[7][9] = CellState.BLACK; plane[7][7] = plane[8][7] = plane[7][8] = plane[9][6] = CellState.WHITE; System.out.println(aiMove_ProgressBar(plane, true,null,null));//双方活3,自己抢 如图4-4:黑白子都有连续的3子,即当前玩家首先抢到4子。 图4-4 双方活3 plane=PlaneState.makeEmptyPlane(15); plane[5][7]=plane[6][7]=plane[7][7]=plane[8][7]=CellState.BLACK; plane[6][6]=plane[7][6]=plane[6][8]=plane[9][7]=CellState.WHITE; System.out.println(aiMove_ProgressBar(plane, false, null, null));//堵冲四 4,7 如图4-5:当前布局要求白子落子坐标(4,7),以堵住黑子连成五子而获胜。 图4-5 堵冲四 4.2.3游戏胜负模块 本设计的五子棋游戏的胜负,在于判断棋盘上是否有一个点,从这个点开始 的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,出现即游戏胜利。如图4-6: 图4-6 判断胜负方向 本游戏设计的思想,需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值来指示是否胜利。 横向是否成五子的判定: public static boolean gameOver(CellState[][] states, Point lastStep) { if (lastStep == null) return false; int M, N;// 变量局部化 M = N = states.length; int x = lastStep.x, y = lastStep.y; CellState who = states[x][y]; int i, j; i = j = x; do { i--; } while (i >= 0 && states[i][y] == who);//who代表的是白子或黑子 do { j++; } while (j < M && states[j][y] == who); if (j - i - 1 >= 5) { return true; } 纵向是否成五子的判定: i = j = y; do { i--; } while (i >= 0 && states[x][i] == who); do { j++; } while (j < N && states[x][j] == who); if (j - i - 1 >= 5) { return true; } 反斜斜线方向是否成五子的判定: i = j = 0; do { i--; } while (x + i >= 0 && y + i >= 0 && states[x + i][y + i] == who); do { j++; } while (x + j < M && y + j < N && states[x + j][y + j] == who); if (j - i - 1 >= 5) { return true; } 斜线方向是否成五子的判定: i = j = 0; do { i--; } while (x + i >= 0 && y - i < N && states[x + i][y - i] == who); do { j++; } while (x + j < M && y - j >= 0 && states[x + j][y - j] == who); if (j - i - 1 >= 5) { return true; } 5 运行与测试 程序编写完后,需要反复地进行测试,才能保证游戏的成功。打开eclipse软件,调试已编好的程序,在点击运行选项中的“运行配置”,运行AiRenju_ME,如图5-1所示: 图5-1 运行配置图 点击运行,此时会弹出个模拟手机使用环境,只需点击手机右边的按钮选择“启 动”就可以运行该软件,效果如图5-2,启动游戏马山进入游戏界面如图5-3。