Я пытаюсь реализовать шахматную игру с обрезкой альфа-бета. Следующее почти работает, но возвращает неправильные ходы.
Например, может произойти следующее.
Белые (пользователь) для хода, позиция белого короля - a1 / Черные (компьютер), позиция черного короля - h1
Белые ходят королем с a1 - a2, затем черные возвращают ход g2 - g1???
Похоже, что компьютер возвращает ход для неверного узла (представления на доске), как будто наилучшая оценка данной позиции на доске не распространяется на весь обратный путь вверх по дереву. Таким образом, в одной из исследованных смоделированных позиций компьютер «воображает», что его король движется на g2, а затем возвращает ход, который нужно сделать из этой позиции, не понимая, что эта позиция является смоделированной позицией, а не представлением реальной доски (т. корневой узел?).
Как мне исправить код, чтобы компьютер возвращал ход для фактического представления доски, а не для одной из симуляций по ошибке?
Спасибо.
Первоначальный звонок alphaBeta(3, ChessEngine.invertBoard(ChessEngine.board), -10000, 10000, true);
private static int alphaBetaEvaluate = 0;
private static int alphaBetaSelectedSquare = 0;
private static int alphaBetaMoveToSquare = 0;
public static int alphaBeta(int depth, char[] board, int alpha, int beta, boolean maxPlayer) {
//create a copy of the board
char[] boardCopy = board.clone();
//if terminal state has not been met, keep searching
if (maxPlayer == true && depth > 0) {
//for all of the moves that max can make
for (int i = 0; i < board.length; i++) {
for (int move : ChessEngine.getValidMoves(i, boardCopy)) {
//make the move
boardCopy[move] = boardCopy[i];
boardCopy[i] = '.';
alphaBetaEvaluate = rating(board, boardCopy, i, move);
//store the best move to make
int temp = alphaBeta(--depth, ChessEngine.invertBoard(boardCopy), -10000, 10000, false);
if (temp > alpha) {
alphaBetaSelectedSquare = i;
alphaBetaMoveToSquare = move;
alpha = temp;
}
//reset the board for the next simulated move
boardCopy = board.clone();
if (beta <= alpha) {
break;
}
}
}
return alpha;
} else if (maxPlayer == false && depth > 0) {
//for all of the moves that min can make
for (int i = 0; i < board.length; i++) {
for (int move : ChessEngine.getValidMoves(i, boardCopy)) {
//make the move
boardCopy[move] = boardCopy[i];
boardCopy[i] = '.';
beta = Math.min(beta, alphaBeta(--depth, ChessEngine.invertBoard(boardCopy), -10000, 10000, true));
//reset the board for the next simulated move
boardCopy = board.clone();
if (beta <= alpha) {
break;
}
}
}
return beta;
}
return alphaBetaEvaluate;
}