У меня есть вопрос относительно моей реализации минимаксного алгоритма для игры под названием «nim game» в kotlin. Он основан на минимаксном алгоритме, описанном в википедии.
Не знаю, почему не работает. Думаю, проблема в методе оценки. Если у игрока +1, алгоритм должен связать отличный ход с большим значением, а если игрок -1, он должен связать отличный ход с низким значением.
Чтобы понять код, вам может потребоваться знать, что делают некоторые методы и переменные:
строк -> IntArray текущей платы. Если rows = (2,3), доска имеет 2 совпадения в первой строке и 3 во второй
createAllMoves -> берет строки и создает все возможные перемещения. Если rows = (1,1), есть два хода: (0,1) взять одно совпадение из первого ряда или (1,0) взять одно совпадение из второго ряда
play (Move ) -> если Move = (3,1) и rows (1,2,3), вывод будет: rows = (1,2,2), потому что Move взял 1 совпадение из третьей строки
желаемыйDepth = 5
Я был бы рад, если бы вы знали, как улучшить мой код. Заранее спасибо.
fun evaluate(player: Int) : Int {
if (player == 1) {
return 1
} else if (player == -1) {
return -1
}
return 0
}
fun max(player: Int, depth: Int): Int{
var tmpAllMoves: MutableList<Move> = createAllMoves(rows)
if(depth == 0 || tmpAllMoves.isEmpty()){
return evaluate(player)
}
var maxValue: Int = Int.MIN_VALUE
while(!tmpAllMoves.isEmpty()){
var randomMove: Move = tmpAllMoves.random();
play(randomMove)
tmpAllMoves.remove(randomMove)
var value: Int = min(-1*player, depth-1)
undoMove()
if(value > maxValue){
maxValue = value
if(depth == desiredDepth){
var savedMove: Move = randomMove
}
}
}
return maxValue
}
fun min(player: Int, depth: Int): Int{
var tmpAllMoves: MutableList<Move> = createAllMoves(rows)
if(depth == 0 || tmpAllMoves.isEmpty()){
return evaluate(player)
}
var minValue: Int = Int.MAX_VALUE
while(!tmpAllMoves.isEmpty()){
var randomMove: Move = tmpAllMoves.random();
play(randomMove)
tmpAllMoves.remove(randomMove)
var value: Int = max(-1*player, depth-1)
undoMove()
if(value < minValue){
minValue = value
}
}
return minValue
}