C语言中的Tic Tac Toe AI问题
我试着做一个简单的tic-tac-toe项目,我试着让人工智能移动到随机的地方,这样人工智能就可以移动到任何可用的地方。然而,它总是做出两个动作。我想知道为什么它总是做两步而不是一步 我的意思是,假设用户在插槽1,1中输入'O'C语言中的Tic Tac Toe AI问题,c,random,multidimensional-array,tic-tac-toe,C,Random,Multidimensional Array,Tic Tac Toe,我试着做一个简单的tic-tac-toe项目,我试着让人工智能移动到随机的地方,这样人工智能就可以移动到任何可用的地方。然而,它总是做出两个动作。我想知道为什么它总是做两步而不是一步 我的意思是,假设用户在插槽1,1中输入'O' 0 1 2 +----+----+----+ 0 | | | | | | | | +----+----+----+ | | | | 1 | | O | | +-
0 1 2
+----+----+----+
0 | | | |
| | | |
+----+----+----+
| | | |
1 | | O | |
+----+----+----+
| | | |
2 | | | |
+---------------
然后计算机移动2步:进入插槽1,2和2,0
0 1 2
+----+----+----+
0 | | | |
| | | |
+----+----+----+
| | | |
1 | | O | X |
+----+----+----+
| | | |
2 | X | | |
+---------------
我想知道为什么会这样
这是我的密码:
void compMove(char board[][columns])
{
int randomNum, randomNum1, i, j;
bool didMove = FALSE;
srand((int)time(NULL)); //Seed the random number generator
randomNum = rand() % 3;
randomNum1 = rand() % 3;
while(board[randomNum][randomNum1] != ' ')
{
randomNum = rand() % 3;
randomNum1 = rand() % 3;
}
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
if(i == randomNum && j == randomNum1)
{
board[i][j] = 'X';
didMove = TRUE;
break;
}
}
if(didMove == TRUE) break;
}
}
void compMove(字符板[][列])
{
int randomNum,randomNum1,i,j;
bool-didMove=FALSE;
srand((int)time(NULL));//为随机数生成器设定种子
randomNum=rand()%3;
randomNum1=rand()%3;
while(board[randomNum][randomNum1]!='')
{
randomNum=rand()%3;
randomNum1=rand()%3;
}
对于(i=0;i<3;i++)
{
对于(j=0;j<3;j++)
{
如果(i==randomNum&&j==randomNum1)
{
板[i][j]='X';
didMove=TRUE;
打破
}
}
如果(didMove==TRUE)中断;
}
}
您不需要回路来设置板上的移动
board[randomNum][randomNum1] = 'X';
这就足够了
您可能会调用该函数两次,因为该函数只执行一步。我怀疑您的
checkWin
函数是罪魁祸首。可能有一个=
在你想有一个=
的地方。但这只是一个猜测,没有看到它
您的compMove
函数过于复杂,但没有错。下面是执行相同操作的代码:
void compMove(char board[][columns]) {
int row, col;
/* DON'T seed RNG here; do it once in main() */
do {
row = rand() % 3;
col = rand() % 3;
} while (board[row][col] != ' ');
board[row][col] = 'X';
}
首先,不要多次为随机数生成器设定种子。我建议您尽早在
main
函数中执行此操作,不要再执行此操作。向我们显示调用compMove
的代码,看起来此函数中没有错误。可能的原因是您调用了两次compMove
。board[]
是如何初始化的(在被传递到compMove()
之前)?另外,您如何、何时何地调用compMove
函数?它可能会被调用两次?只需对一个良好样式的特定实例进行快速注释:您可以直接使用if(didMove),而不是if(didMove==TRUE)。这通常被认为是很好的风格。请查看编辑,看看我调用函数的地方是否有错误。它似乎应该正常工作。我所能想到的就是checkWin()函数调用compMove(),或者在计算机播放(当我等于1时),userMove()函数在没有收到输入的情况下跳过(当我等于2时),计算机再次播放(我等于3)。你可以试着调试,看看是否是这样。我不认为这两个都是问题,不过谢谢你的帮助。你能想到其他可能的问题吗?谢谢,我已经简化了,但是checkWin不是罪魁祸首,那么dispBoard
是唯一的可能,或者你正在运行的代码不是这里发布的代码。