【发布时间】:2015-12-18 00:50:03
【问题描述】:
我尝试使用极小极大算法在 C++ 中编写一个简单版本的井字游戏,但在尝试确定得分最高的位置时遇到了问题。 minEval(返回最小值)、maxEval(返回最大值)和playMove(确定要播放的位置然后播放移动)函数如下所示。
int maxEval(int board[9]) {
if (checkDraw(board)) {
return 0;
}
else if (checkWin(board)) {
return -1000;
}
int finalScore = -1000;
for (int i = 0; i < 9; i++) {
if (board[i] == 0) {
board[i] = 1;
int score = minEval(board);
if (score > finalScore) {
finalScore = score;
}
board[i] = 0;
}
}
return finalScore;
}
int minEval(int board[9]) {
if (checkDraw(board)) {
return 0;
}
else if (checkWin(board)) {
return 1000;
}
int finalScore = 1000;
for (int i = 0; i < 9; i++) {
if (board[i] == 0) {
board[i] = -1;
int score = maxEval(board);
if (score < finalScore) {
finalScore = score;
}
board[i] = 0;
}
}
return finalScore;
}
void playMove(int board[9], int player) {
int finalScore = player * -1000;
int position;
for (int i = 0; i < 9; i++) {
if (board[i] == 0) {
board[i] = player;
int score;
if (player == 1) {
score = maxEval(board);
}
else {
score = minEval(board);
}
if (player == 1 && score >= finalScore) {
finalScore = score;
position = i;
}
else if (player == -1 && score <= finalScore) {
finalScore = score;
position = i;
}
board[i] = 0;
}
}
board[position] = player;
}
当我测试不同的位置以查看 minEval 和 maxEval 是否正确评估位置时,函数返回正确的分数(最大获胜为 1000,最小获胜为 -1000,平局为 0)。但是,当我使用 playMove 功能让 AI 玩游戏时,它会玩非常可疑的动作,并且几乎总是做出“不正确”的动作。 这是我让程序玩的游戏示例(与它自己一起玩):
我怀疑我将位置设置为 i 的方式有问题,但我尝试进行更改无济于事。关于评估功能有什么问题的任何建议?谢谢。
这里是整个代码的链接:http://ideone.com/6791d4
【问题讨论】:
-
您的代码目前存在编译错误,请更正
-
我的电脑上有一个头文件,所以我忘了在顶部添加定义,对此感到抱歉。我现在修好了,谢谢你的意见。
-
我有几点建议:
-
@RichardSt-Cyr 我很想听听他们的意见!
-
很抱歉。按 Enter 太快了。我有一些建议: 在 minEval 和 maxEval 中,您应该在检查平局之前评估您是否有赢家。如果第 9 步是获胜的一步,您将在检查是否获胜之前宣布平局。在评估中,如果游戏获胜,您没有任何条件停止。如果你可以评论你的代码来解释它应该做什么,我也许可以给你更多。
标签: c++ tic-tac-toe minimax