【发布时间】:2015-01-20 22:45:21
【问题描述】:
我想编写一个递归函数来确定给定井字游戏中的最佳移动
int nextMove(struct Game g, enum Symbol player) {
if (game_over(g) != 0) {
return -1;
}
int i, j;
int score, end;
for(i = 0; i < 3; i += 1) {
for (j = 0; j < 3; j += 1) {
if(g.board.fields[i][j] == 0) {
g.board.fields[i][j] = player;
score = nextMove(g, -player);
}
}
}
end = game_over(g)
}
我的游戏结束功能:
enum Symbol game_over(struct Game g)
{
int x, y = x = 0;
int full = 0;
for (y = 0; y < SIZE_Y_AXIS; y += 1)
{
for (x = 0; x < SIZE_X_AXIS; x += 1)
{
if (g.board.fields[x][y] == NONE)
full++;
else if (x < SIZE_X_AXIS - 2 &&
g.board.fields[x][y] == g.board.fields[x+1][y] &&
g.board.fields[x][y] == g.board.fields[x+2][y])
return g.board.fields[x][y];
else if (y < SIZE_Y_AXIS - 2 &&
g.board.fields[x][y] == g.board.fields[x][y+1] &&
g.board.fields[x][y] == g.board.fields[x][y+2])
return g.board.fields[x][y];
else if (x < SIZE_X_AXIS - 2 && y < SIZE_Y_AXIS - 2 &&
g.board.fields[x][y] == g.board.fields[x+1][y+1] &&
g.board.fields[x][y] == g.board.fields[x+2][y+2])
return g.board.fields[x][y];
else if (x >= 2 && y < SIZE_Y_AXIS - 2 &&
g.board.fields[x][y] == g.board.fields[x-1][y+1] &&
g.board.fields[x][y] == g.board.fields[x-2][y+2])
return g.board.fields[x][y];
}
}
if (full == 0)
return FULL;
return NONE;
}
我认为叶子制作效果很好,但我不知道如何确定哪片叶子(或哪个动作)是最好的?现在有什么建议吗?
谢谢
【问题讨论】:
-
你必须选择孩子的最小值或最大值。您可以使用 2 个相互调用的函数。
-
你能给出一些建议吗?
-
c 不等于 c++
-
@bolov 关于 minmax 是正确的。当玩家属于一个星座时查找最小值,当玩家属于另一个星座时查找最大值并返回该分数。