Negamax为简单的补充游戏

我试图实现一个简单的游戏negamax,其中玩家交替添加一个或两个运行总和。 将总数增加到21的玩家获胜。

我在这里使用伪代码:https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm

人类玩家首先移动,这样计算机应该通过添加使总体全等于0 mod 3的数字而轻松获胜。

我没有做任何动态的一代。 只需比较将运行总和加1的negamax得分与将运行总和加2的negamax得分。

int total = 0;

Console.WriteLine("the current total is " + total);

while (total < 21) {
    Console.WriteLine("add 1 or 2?");
    total += Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("you increased the total to " + total);
    if (total == 21) {
        Console.WriteLine("you win");
        break;
    }

    if (negamax(total + 1, 1) > negamax(total + 2, 1)) total++;
    else total += 2;

    Console.WriteLine("computer increased the total to " + total);
    if (total == 21) {
        Console.WriteLine("computer wins");
        break;
    }
}

negamax函数:

static int negamax(int total, int color) {
    if (total == 21) {
        return color * 100;
    }

    int bestValue = -100;

    for (int i = 1; i <= 2; i++) {
        if (total + i <= 21) {
            int v = -1 * negamax(total + i, -1 * color);
            bestValue = max(bestValue, v);
        }
    }
    return bestValue;
}

最大方法:

static int max(int a, int b) {
    if (a > b) return a;
    return b;
}

不知道为什么AI每次只加2。


静态评估函数不正确。

https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm negamax节点的返回值是从节点当前玩家的角度来看的启发式分数。

如果(总数= 21),对于节点的当前播放器来说总是损失。 所以negamax返回值必须是-100。 还有其他代码错误,例如总数为22时。


一个不能做出移动的球员显然会输掉比赛,对吧? 如果是这样,那么

if (total == 21) {
    return color * 100;
}

我看起来不对,因为它颠倒了规则。 你说那个不能动的玩家赢了! 尝试重做这3条线。

链接地址: http://www.djcxy.com/p/56357.html

上一篇: Negamax for simple addition game

下一篇: Adding Alpha Beta pruning to Negamax in Java