Так что я бьюсь головой об этой проблеме некоторое время.Я пытаюсь реализовать минимаксный алгоритм, чтобы играть в игру под названием манкала.Насколько я могу судить, мой код должен работать, но по какой-то причине, когда функция вызывает себя рекурсивно, она продолжает вычислять до 0, хотя я знаю, что она достигла конечного состояния игры и возвращает некоторое значение.Я также знаю, что он равен 0, потому что начальное число maxval равно 0. Если кто-нибудь может помочь мне разобраться с этим, я буду очень благодарен.
Ниже реализован алгоритм минимакса.Пожалуйста, не обращайте внимания на параметр глубины и исходное вызванное состояние: доска содержит число от 3 до 12 и исключает 6, maxTurn
true (максимум идет первым), move -1
, alpha -1
и beta 37
(максимально возможный счет36)
private int[] miniMax(int[] board, boolean maxTurn, int move, int alpha, int beta, int depth){
int[] newState = new int[board.length];
if(endGame(board) == true){
int[] endReturn = new int[2];
for(int i = 0; i < 6; i++){ board[6] += board[i];}
endReturn[0] = board[6]; System.out.println("end state value: " + board[6]);
endReturn[1] = move;
return endReturn;
}
if(maxTurn == true){
int[] maxEval = new int[2];
maxEval[0] = -1;
for(int i = 0; i < 6; i++){
newState = Arrays.copyOf(board, board.length);
boolean goAgain = false;
if(board[i] == 0) continue;
int j = newState[i];
newState[i] = 0;
int k = i + 1;
while(j > 0){
if(k == 13)k = 0;
newState[k]++;
j--;
k++;
}
if(k == 6) goAgain = true;
if(k < 6 && newState[12 - k] > 0 && newState[k] == 1){
newState[6] = newState[6] + newState[12 - k] + 1;
newState[12 - k] = 0;
newState[k] = 0;
}
int[] eval = new int[2];
eval = miniMax(newState, goAgain, i, alpha, beta, depth--);
System.out.println("eval value: " + eval[0]);
if(eval[0] > alpha){
alpha = eval[0];
}
System.out.println("alpha value: " + alpha);
if(beta <= alpha) break;
if(eval[0] > maxEval[0]){
maxEval[0] = eval[0]; System.out.println("move given: " + i);
maxEval[1] = i;
}
} //System.out.println("maxEval given moveValue: " + maxEval[1]);
return maxEval;
}
else{
int[] minEval = new int[2];
for(int i = 7; i < 13; i++){
newState = Arrays.copyOf(board, board.length);
boolean max = true;
if(board[i] == 0) continue;
int j = newState[i];// System.out.println("this is j: " + j);
newState[i] = 0;
int k = i;
while(j > 0){
k++;
if(k == 6)k = 7;
if(k == 14)k = 0;
j--;
newState[k]++;
}
if(k == 13) max = false;
if(k > 6 && k<13 && newState[12 - k] > 0 && newState[k] == 1){
newState[13] = newState[13] + newState[12 - k] + 1;
newState[12 - k] = 0;
newState[k]--;
}
int[] eval = new int[2];
eval = miniMax(newState, max, i, alpha, beta, depth--);
if(minEval[0] > eval[0]){
minEval[0] = eval[0];
minEval[1] = i;
}
if(eval[0] < beta){
beta = eval[0]; System.out.println("beta: " + beta);
}
if(beta <= alpha) break;
}//System.out.println("maxEval given moveValue: " + maxEval[1]);
return minEval;
}
}