【发布时间】:2020-06-02 21:24:54
【问题描述】:
前几天,我为我的儿子用 c++ 编写了一个井字游戏控制台游戏。他想让我添加一台计算机,我第一次使用极小极大算法结束了我们。我做了一些快速测试,但实际上我的笔记本电脑一打印东西就给了我儿子,他玩了几分钟。我检查了他的支架一两次,发现它的播放效果不佳,我一直在尝试调试它,但我看不出哪里出了问题。我尝试摆脱 alpha beta 修剪,但这并没有改变任何东西。
就上下文而言,棋盘上计算机为-1,空白为0,玩家为1。
这是极小极大函数:
int minimax(int board[9], int depth, int alpha, int beta, bool isMaxizimaizingPlayer)
{
bool found = false;
for (int i = 0; i < 9; i++)
{
if (board[i] == 0)
{
found = true;
}
}
if (!found)
{
return eval(board);
}
if (depth == 0 || eval(board) != 0)
{
return eval(board);
}
if (isMaxizimaizingPlayer)
{
int maxEval = -2;
for (int spot = 0; spot < 9; spot++)
{
if (board[spot] == 0)
{
board[spot] = 1;
int e = minimax(board, depth - 1, alpha, beta, false);
if (e > maxEval)
{
maxEval = e;
}
//if (beta < alpha)
//{
// break;
//}
board[spot] = 0;
}
}
return maxEval;
}
else {
int minEval = 2;
for (int spot = 0; spot < 9; spot++)
{
if (board[spot] == 0)
{
board[spot] = -1;
int e = minimax(board, depth - 1, alpha, beta, true);
if (e < minEval)
{
minEval = e;
}
//if (beta < alpha)
//{
// break;
//}
board[spot] = 0;
}
}
return minEval;
}
}
为了完整起见,这是我的 eval 函数:
int eval(int board[9])
{
/*horizontial*/
for (int i = 0; i < 3; i++)
{
if (board[i * 3] == board[i * 3 + 1] && board[i * 3 + 2] == board[i * 3] && board[i * 3] != 0)
{
return board[i * 3];
}
}
/*vertical*/
for (int i = 0; i < 3; i++)
{
if (board[i] == board[i + 3] && board[i] == board[i + 6] && board[i] != 0)
{
return board[i];
}
}
/*Both diags*/
if (board[4] != 0) {
if (board[0] == board[4] && board[0] == board[8])
{
return board[4];
}
if (board[2] == board[4] && board[4] == board[6])
{
return board[4];
}
}
return 0;
}
这是初始调用:
int spot = 0;
int minEval = 2;
for (int i = 0; i < 9; i++)
{
if (board[i] == 0)
{
board[i] = -1;
int score = minimax(board, 3, -2, 2, false);
if (score < minEval) {
minEval = score;
spot = i;
}
board[i] = 0;
}
}
std::cout << "The computer went in spot " << spot + 1 << std::endl;
board[spot] = -1;
printBoard(board);
【问题讨论】:
-
我对人工智能一无所知,但最好的 TikTakToe 游戏往往不好玩。
-
您的电路板布局是否使索引 0 1 2 是垂直的或水平的?我会认为是水平的,但你的代码另有说明。
-
(如果你只是想赢,移动树可以很容易地为这样一个简单的游戏硬编码;))
-
如果板子是
[3][3]会更容易。 -
我发布的答案是错误的(对此感到抱歉)。看起来你只调用深度为 3 的 minimax,如果你想要最佳播放,你需要将深度设置为 > 9。
标签: c++ artificial-intelligence tic-tac-toe minimax