添加方法使用回溯法实现五子棋人机对战 public void AI JFrame jf = new JFrame;创建窗口 jfsetSize200 200;设置窗口大小 jfsetLocationRelativeTonull;居中显示 设置流动布局 jfsetLayoutnew FlowLayout; J
public int[] max(int[][] chessArr) { int maxScore = 0; // 最高得分 int[] bestPos = new int[2]; // 最优位置 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (chessArr[i][j] == 0) { // 如果该位置没有棋子 int score = getScore(chessArr, i, j); // 计算该位置的得分 if (score > maxScore) { // 如果该位置得分大于最高得分 maxScore = score; // 更新最高得分 bestPos[0] = j; // 更新最优位置的列号 bestPos[1] = i; // 更新最优位置的行号 } } } } return bestPos; }
// 计算指定位置的得分 public int getScore(int[][] chessArr, int row, int col) { int score = 0; for (int k = 0; k < COUNT; k++) { // 遍历每个方向 int[] count = new int[2]; // 统计连续的棋子个数 boolean blocked1 = false; // 判断当前方向是否被挡住 boolean blocked2 = false; for (int i = -k; i <= k; i++) { // 遍历连续的k个位置 // 统计该位置的得分 int r = row + i * dx[k]; // 根据方向计算行号和列号 int c = col + i * dy[k]; if (r < 0 || r >= ROWS || c < 0 || c >= COLS) { // 如果超出棋盘范围 continue; // 继续遍历下一个位置 } if (!blocked1 && chessArr[r][c] == -1) { // 如果当前方向没有被挡住且该位置有电脑下的棋子 count[0]++; // 统计连续的棋子个数 } else if (!blocked1 && chessArr[r][c] == 1) { // 如果当前方向没有被挡住且该位置有玩家下的棋子 blocked1 = true; // 当前方向被挡住 } else if (blocked1 && chessArr[r][c] == -1) { // 如果当前方向被挡住且该位置有电脑下的棋子 blocked2 = true; // 另一个方向也被挡住 break; // 结束遍历 } else if (blocked1 && chessArr[r][c] == 0) { // 如果当前方向被挡住且该位置为空 break; // 结束遍历 } } if (count[0] == COUNT - 1 && !blocked1 && !blocked2) { // 如果连续的棋子个数为COUNT-1且两个方向都没有被挡住 score += FIVE; // 得分为FIVE } else if (count[0] == COUNT - 2 && !blocked1 && !blocked2) { // 如果连续的棋子个数为COUNT-2且两个方向都没有被挡住 score += FOUR; // 得分为FOUR } else if (count[0] == COUNT - 3 && !blocked1 && !blocked2) { // 如果连续的棋子个数为COUNT-3且两个方向都没有被挡住 score += THREE; // 得分为THREE } else if (count[0] == COUNT - 4 && !blocked1 && !blocked2) { // 如果连续的棋子个数为COUNT-4且两个方向都没有被挡住 score += TWO; // 得分为TWO } } return score;
原文地址: https://www.cveoy.top/t/topic/hoTE 著作权归作者所有。请勿转载和采集!