package org.test.wuziqi; public class Brain { private WuziBoard bd; private int INFINITY = 1000000; private int movex, movey; private int level;// 深度 private int node;// 每层结点 public Brain(WuziBoard bd, int level, int node) { this.bd = bd; this.level = level; this.node = node; } // 估值函数 public int[] findOneBestStep() { Chess[] arr = bd.getSortedChess(bd.getPlayer()); Chess c = bd.getData()[arr[0].x][arr[0].y]; int[] result = { c.x, c.y }; return result; } // 估值函数+搜索树 public int[] findTreeBestStep() { alpha_beta(0, bd, -INFINITY, INFINITY); int[] result = { movex, movey }; return result; } // alpha-beta剪枝搜索算法 public int alpha_beta(int depth, WuziBoard board, int alpha, int beta) { if (depth == level || board.isGameOver() != 0) { Chess[] sorted = board.getSorted(); Chess move = board.getData()[sorted[0].x][sorted[0].y]; // 搜索树辅助输出 Log.debug("\t- " + "【" + (char) (64 + move.x) + (16 - move.y) + "】," + move.getSum()); return move.getSum();// 局面估分 } // 对局面下得分最高的几个点进行拓展 WuziBoard temp = new WuziBoard(board); Chess[] sorted = temp.getSorted(); int score; for (int i = 0; i < node; i++) { int x = sorted[i].x; int y = sorted[i].y; // 搜索树辅助输出 if (depth >= 1) { for (int k = 0; k < depth; k++){ Log.debug("\t"); } } // 走这个走法 if (!temp.putChess(x, y)) continue; if (sorted[i].getOffense() >= WuziBoard.Level.ALIVE_4.score) { Log.debug("我们快要赢啦!"); score = INFINITY + 1; } else if (sorted[i].getDefence() >= WuziBoard.Level.ALIVE_4.score) { Log.debug("对方快要赢啦!"); score = INFINITY; } else { score = alpha_beta(depth + 1, temp, alpha, beta); } temp = new WuziBoard(board);// 撤消这个走法 if (depth % 2 == 0) {// MAX if (score > alpha) { alpha = score; if (depth == 0) { movex = x; movey = y; } } if (alpha >= beta) { score = alpha; return score; } } else {// MIN if (score < beta) { beta = score; } if (alpha >= beta) { score = beta; return score; } } } return depth % 2 == 0 ? alpha : beta; } }