Я создал простую игру Checkers в Java с minmax AI, но я не работаю. Я использую рекурсивную версию minmax, но с ней что-то не так, потому что она возвращает ходы, которые не лучше, но, возможно, сначала сгенерированы.MinMax AI for Checkers
public int minmax(int [][] board, int depth, int curPlayer){
ArrayList<Move> moves = findMoves(curPlayer, board);
if (depth == 0 || moves.size() == 0){
return heurValue(curPlayer, board);
}
int bestVal = 0;
if (curPlayer == GameCore.BLACK){
bestVal = Integer.MIN_VALUE;
curPlayer = GameCore.RED;
}else{
bestVal = Integer.MAX_VALUE;
curPlayer = GameCore.BLACK;
}
for(int i = 0; i<moves.size(); i++){
Move m = moves.get(i);
int [][] boardNew = makeMove(m, board);
int value = minmax(boardNew, depth-1, curPlayer);
board = undoMove(m, boardNew);
// computer plays as black
if (curPlayer == GameCore.BLACK){
if (value < bestVal){
bestMove = m;
bestVal = value;
}
}else{
if (value >= bestVal){
bestMove = m;
bestVal = value;
}
}
}
return bestVal;
}
Если я позвоню MinMax с глубиной = 1 она должна «вернуть 7 значений (есть 7 возможных ходов), но возвращает только 1, если я перееду от 2,4 до 3,3 ... но когда Я пытался отладить ее, ArrayList движется имеет правильный размер Так что я не знаю, что случилось с ним :(
EDIT:.. к «вернуться» Я по ошибке означает, что первое условие (когда глубина 0 или ходы пустые) происходит только один раз, но если это было правильно, это должно произойти 7 раз. Извините за мой плохой английский.
Знаете ли вы, сайт, где правильный рекурсивный псевдокод для minmax (лучше с альфа/бета, потому что мне нужно будет его расширять), или вы могли бы помочь мне исправить это? Это должно быть только мелочь. Спасибо!
Нет, если я правильно прочитал ваш вопрос, но «public int minmax (int [] [] board, int depth, int curPlayer)' возвращает только одно значение типа 'int'. Если вы хотите вернуть много значений, вы можете вернуть 'Collection', как' LinkedList' или что-то подобное –
Где вы объявили boardNew? – Joan
RED (человек) начинает игру, после его хода (компьютерные игры) вызывается minmax (для теста с глубиной 1). Для компьютера существует 7 возможных движений. MinMax должен возвращать 7 значений для 7 возможных плат, но это не будет. Обратите внимание, что bestMove является глобальной переменной. Извините за мой плохой английский. – user2275785