Алгоритм MiniMax в Kotlin - Nim Game - PullRequest
1 голос
/ 28 мая 2020

У меня есть вопрос относительно моей реализации минимаксного алгоритма для игры под названием «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
}
...