【问题标题】:Tic Tac Toe AI issue in CC 中的井字游戏 AI 问题
【发布时间】:2013-08-14 07:53:31
【问题描述】:

我尝试制作一个简单的井字游戏项目,并尝试让 AI 移动到随机位置,以便 AI 移动到任何可用的位置。但是,它总是移动 2 步。我想知道为什么它总是走 2 步而不是 1 步。

我的意思是,假设用户在插槽 1,1 中输入“O”。

     0    1    2
  +----+----+----+
0 |    |    |    |
  |    |    |    |
  +----+----+----+
  |    |    |    |
1 |    |  O |    |
  +----+----+----+
  |    |    |    |
2 |    |    |    |
  +---------------

然后计算机移动 2 步:进入插槽 1,2 AND 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;
     }               
}  

【问题讨论】:

  • 首先,不要为随机数生成器播种多次。我建议你尽早在main函数中做,不要再做。
  • 显示调用compMove的代码,看起来这个函数没有错误。可能的原因是您调用了两次compMove
  • board[] 如何被初始化(在传递给compMove() 之前)?
  • 另外,您如何、何时何地调用您的compMove 函数?它可能会被调用两次?
  • 只是对一个好的风格的特定实例的快速评论:代替 if(didMove == TRUE),您可以直接使用 if(didMove)我>。这通常被认为是好的风格。

标签: c random multidimensional-array tic-tac-toe


【解决方案1】:

您不需要循环来设置板上的移动。

board[randomNum][randomNum1] = 'X';

足以设置。

而且你可能会调用这个函数两次,因为函数只下一个动作。

【讨论】:

  • 请查看编辑,看看我调用函数的地方是否有问题
  • 它似乎应该可以正常工作。我能想到的只是 checkWin() 函数调用 compMove() 或在计算机播放后(当 i 等于 1 时),userMove() 函数在没有接收到输入的情况下跳过(当 i 等于 2 时)并且计算机再次播放(i 等于到 3)。您可以尝试调试一下,看看是不是这样。
  • 我认为这些都不是问题,不过感谢您的帮助。您还能想到其他可能的问题吗?
【解决方案2】:

我怀疑你的 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';
}

【讨论】:

  • 谢谢,我让它变得更简单了,但是 checkWin 不是罪魁祸首
  • 那么dispBoard 是唯一的可能,否则您运行的代码不是此处发布的代码。
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多