我正在尝试为一个简单的游戏实施negamax,其中玩家交替添加一个或两个到运行总和。将总数增加到21胜的玩家。
我在这里使用伪代码:https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm
人类玩家首先移动,因此计算机应该通过添加使总数等于0 mod 3的数字轻松获胜。
我没有做任何动态移动生成。只需将在运行总和上加1的negamax得分与在运行总和中加2的负值得分进行比较。
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。
答案 0 :(得分:1)
静态评估功能不正确。
https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm 从节点的当前播放器的角度来看,negamax节点的返回值是启发式分数。
if(total == 21),它对节点的当前播放器来说总是一个损失。所以negamax的回报必须是-100。还有其他代码错误,例如当总数为22时。
答案 1 :(得分:0)
一名无法采取行动的球员显然会输掉比赛,对吧? 如果是,那么
if (total == 21) {
return color * 100;
}
对我来说看起来不对,因为它颠倒了规则。你说无法移动的玩家获胜!尝试重做这3行。