C语言中的Tic Tac Toe AI问题

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 | | +-

我试着做一个简单的tic-tac-toe项目,我试着让人工智能移动到随机的地方,这样人工智能就可以移动到任何可用的地方。然而,它总是做出两个动作。我想知道为什么它总是做两步而不是一步

我的意思是,假设用户在插槽1,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
是唯一的可能,或者你正在运行的代码不是这里发布的代码。