Negamax 用于简单的加法游戏
Negamax for simple addition game
我正在尝试为一个简单的游戏实现 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。
不能下手的玩家显然输了比赛,对吧?
如果是,那么
if (total == 21) {
return color * 100;
}
我觉得不对,因为它颠倒了规则。你是说不能移动的玩家获胜!尝试修改这 3 行。
静态求值函数不正确。
https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm
negamax 节点的 return 值是从节点当前玩家.
的角度来看的启发式分数
if (total == 21), 节点当前玩家总是输。所以 negamax return 必须是 -100。还有其他的代码错误,比如total是22的时候。
我正在尝试为一个简单的游戏实现 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。
不能下手的玩家显然输了比赛,对吧? 如果是,那么
if (total == 21) {
return color * 100;
}
我觉得不对,因为它颠倒了规则。你是说不能移动的玩家获胜!尝试修改这 3 行。
静态求值函数不正确。
https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm negamax 节点的 return 值是从节点当前玩家.
的角度来看的启发式分数if (total == 21), 节点当前玩家总是输。所以 negamax return 必须是 -100。还有其他的代码错误,比如total是22的时候。