В настоящее время меня не устраивает программируемый ИИ. Предполагается, что ИИ набирает лучший результат за каждый ход на доске 3x3 (TicTacToe).
Возможные оценки: -1 (Проигрыш), 0 (T ie) и 1 (Победа).
Сначала вызывается метод makeTurn()
, который затем вызывает метод, содержащий алгоритм miniMax.
public void makeTurn(Button[][] currentBoard) { // Calculating best move using miniMax algorithm
AIcheck = new Check(currentBoard);
int bestScore = Integer.MIN_VALUE;
int[] bestMove = new int[2];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (currentBoard[i][j].getText().equals("")) {
currentBoard[i][j].setText("O");
int score = calcScore(currentBoard, 0, false);
System.out.println(score);
currentBoard[i][j].setText("");
if (score > bestScore) {
bestScore = score;
bestMove = new int[]{i, j};
}
}
}
}
Board.getInstance().getField(bestMove[0], bestMove[1]).performClick();
}
private int calcScore(Button[][] currentBoard, int depth, boolean isMax) { // MiniMax Algorithm, calculating score for each branch via recursive execution
int score;
if (AIcheck.checkWin()) {
return (Util.getInstance().getTurnCounter() % 2) == 0 ? 1 : -1;
} else if (AIcheck.checkTie()) {
return 0;
}
int bestScore = isMax ? Integer.MIN_VALUE : Integer.MAX_VALUE;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (currentBoard[i][j].getText().equals("")) {
if (isMax) {
currentBoard[i][j].setText("O");
} else {
currentBoard[i][j].setText("X");
}
score = calcScore(currentBoard, depth + 1, !isMax);
currentBoard[i][j].setText("");
bestScore = isMax ? Math.max(bestScore, score) : Math.min(bestScore, score);
}
}
}
return bestScore;
}
Я использую isMax
, чтобы определить, пришла ли очередь максимайзера или нет, также используя turnCounter % 2
, чтобы определить, какой сейчас ход игрока, так как они ходят.
И все же ИИ не мешает моей победе, больше похоже, что он просто переходит от одного поля к другому , вместо выбора оптимального поля. Как мне правильно реализовать алгоритм miniMax? Большое спасибо!
Пример:
[] | [] | []
[] | [] | []
[X] | [] | []
[O] | [] | []
[] | [] | []
[X] | [] | []
[O] | [] | []
[] | [] | []
[X] | [] | [X]
[O] | [O] | []
[] | [] | []
[X] | [] | [X]
[O] | [O] | [X]
[] | [] | []
[X] | [] | [X]
[O] | [O] | [X]
[O] | [] | []
[X] | [] | [X]
[O] | [O] | [X]
[O] | [X] | [] Я выигрываю, также это показывает, что ИИ, похоже, просто занимает следующее место (слева направо справа)
[X] | [] | [X]