Kotlin-Nim博弈中的MiniMax算法

Kotlin-Nim博弈中的MiniMax算法,kotlin,recursion,minimax,evaluate,nim-game,Kotlin,Recursion,Minimax,Evaluate,Nim Game,我有一个关于我在kotlin中为名为“nim game”的游戏实现minimax算法的问题。它基于维基百科中描述的minimax算法 我真的不知道为什么它不起作用。我认为问题在于评估方法。如果玩家为+1,则算法应将一个伟大的移动链接到一个高值,如果玩家为-1,则应将一个伟大的移动链接到一个低值 要理解代码,您可能需要了解某些方法和变量的作用: 行->当前板的阵列。如果行=(2,3),电路板第一行有2个匹配项,第二行有3个匹配项 createAllMoves->获取行并创建所有可能的移动。如果行=

我有一个关于我在kotlin中为名为“nim game”的游戏实现minimax算法的问题。它基于维基百科中描述的minimax算法

我真的不知道为什么它不起作用。我认为问题在于评估方法。如果玩家为+1,则算法应将一个伟大的移动链接到一个高值,如果玩家为-1,则应将一个伟大的移动链接到一个低值

要理解代码,您可能需要了解某些方法和变量的作用:

行->当前板的阵列。如果行=(2,3),电路板第一行有2个匹配项,第二行有3个匹配项

createAllMoves->获取行并创建所有可能的移动。如果行=(1,1),则有两个移动: (0,1)从第一行中取出一根火柴,或 (1,0)从第二排中取出一根火柴

播放(移动)->如果移动=(3,1)和行(1,2,3),则输出为:行=(1,2,2),因为移动从第三行中取出1个匹配项

期望深度=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
}
fun评估(玩家:Int):Int{
如果(玩家==1){
返回1
}else if(player==-1){
返回-1
}
返回0
}
最大乐趣(玩家:智力,深度:智力):智力{
var tmpAllMoves:MutableList=createAllMoves(行)
if(depth==0 | | tmpAllMoves.isEmpty()){
返回(玩家)
}
var maxValue:Int=Int.MIN\u值
而(!tmpAllMoves.isEmpty()){
var randomMove:Move=tmpAllMoves.random();
播放(随机移动)
删除(随机移动)
变量值:Int=min(-1*玩家,深度-1)
撤消移动()
如果(值>最大值){
最大值=最大值
如果(深度==所需深度){
var savedMove:Move=randomMove
}
}
}
返回最大值
}
趣味敏(玩家:Int,深度:Int):Int{
var tmpAllMoves:MutableList=createAllMoves(行)
if(depth==0 | | tmpAllMoves.isEmpty()){
返回(玩家)
}
var最小值:Int=Int.MAX\u值
而(!tmpAllMoves.isEmpty()){
var randomMove:Move=tmpAllMoves.random();
播放(随机移动)
删除(随机移动)
变量值:Int=max(-1*玩家,深度-1)
撤消移动()
如果(值<最小值){
最小值=最小值
}
}
返回最小值
}

你说的“匹配”是什么意思?如果相关的话,该算法是为哪个游戏实现的?啊,对不起,忘了提一下它被称为nim Game,我不太明白“如果
行=(1,1)
有两个动作:
(0,1)
从第一行中取出一个匹配项,或者
(1,0)
从第二行中取出一个匹配项”。如果
(0,1)
获取索引为0的行的一个匹配项,那么
(1,0)
是否应该是
(1,1)
而不是从索引为1的第二行中获取匹配项?如果
移动=(3,1)
和行
(1,2,3)
如果有3行,那么
移动=(3,1)
是否应该是
移动=(2,1)
?或者移动描述是1索引而不是0索引的行?移动是0索引的,是的“匹配”是什么意思?如果相关的话,该算法是为哪个游戏实现的?啊,对不起,忘了提一下它被称为nim Game,我不太明白“如果
行=(1,1)
有两个动作:
(0,1)
从第一行中取出一个匹配项,或者
(1,0)
从第二行中取出一个匹配项”。如果
(0,1)
获取索引为0的行的一个匹配项,那么
(1,0)
是否应该是
(1,1)
而不是从索引为1的第二行中获取匹配项?如果
移动=(3,1)
和行
(1,2,3)
如果有3行,那么
移动=(3,1)
是否应该是
移动=(2,1)
?或者移动描述对行是1索引而不是0索引?移动是0索引,是