【问题标题】:Tic-Tac-Toe AI picks wrong position井字游戏 AI 选择错误的位置
【发布时间】:2013-08-24 08:18:25
【问题描述】:

我正在制作井字游戏的 C 程序。我现在正试图让 AI 无敌,但我遇到了一个问题。问题是 AI 只是在下一个可用问题中打印符号。为什么?我该如何解决?

这是我的调用函数:

void determinMove(char positions[])
{
      int num, i, currentBestScore, score;

      currentBestScore = -100;

      for(i = 0; i < 9; i++)                       
      {
                 if(positions[i] == ' ')           
                 {                          
                         score = getFutureScoreOfMove(positions, 'C');
                         if(score > currentBestScore)       
                         {
                                num = i;
                                currentBestScore = score;
                          }
                          positions[i] = ' ';     
                 }      
      }
       positions[num] = comp;
}

还有另一个递归函数:

int getFutureScoreOfMove(char positions[], char turn)    
{
       int i, currentBestScore, score;

       if(turn == 'C')                       currentBestScore = -100;       
       else                                     currentBestScore = 100;        

       for(i=0; i<9; i++)
       {
                if(positions[i] == ' ')
                {
                       if(turn == 'C')      
                       {
                           positions[i] = 'X';
                           score = getFutureScoreOfMove(positions, 'U'); 
                           positions[i] = ' ';
                       }
                       else
                       {
                            positions[i] = 'O';
                            score = getFutureScoreOfMove(positions, 'C');
                            positions[i] = ' ';
                       }
                       if(turn == 'C' && score > currentBestScore)                                    
                      currentBestScore = score;
                       if(turn == 'U' && score < currentBestScore)   
                      currentBestScore = score;
                 }       
         }   
         return(currentBestScore);                    
}

正如我所说,我想知道为什么会出现这种奇怪的行为以及如何解决它。

任何帮助将不胜感激:)

【问题讨论】:

  • 当你学习编程时,你会遇到很多很多次这种情况,即你有一个错误,你需要调试它。现在是学习如何调试的好时机,既可以使用简单的方法(例如插入策略性 printfs),也可以学习如何使用 gdb 之类的调试器或 IDE 提供的任何调试器。让其他人为你调试代码只是推迟不可避免的事情——你迟早要掌握调试技能,所以最好现在就开始。
  • 假设发现了一个空格并且分数永远不会超过currrentBestScore,你认为num的值是什么时候你做最后的分配positions[num] = comp
  • 这似乎是关于您正在编写的同一程序的第三个问题。 SO 不是用于代码审查的网站,而是用于解决具体技术问题的网站。
  • @PaulR 我已经调试了代码,它确实打印了符号,但只在下一个可用空间中。
  • @MichaelFerashireSilva 你了解 minimax 还是只是如何将它应用于你不了解的井字游戏?

标签: c recursion tic-tac-toe minimax


【解决方案1】:

你在哪里计算一个球员已经得到了 3 个直线?在您的代码中没有任何地方被计算。您已经通过递归遍历了可能的棋盘位置,但没有考虑获胜条件。也许先写代码。

【讨论】:

  • 谢谢,我试试这个然后回复你
  • 我在getFutureScoreOfMove开头添加了一个检查功能,但还是抢到了第一个可用空间
  • 至于回答为什么它会占据第一个可用位置 - 这是getFutureScoreOfMove 内第 3,4 行的条件语句。他们返回 100 或 -100 取决于轮到谁来进行当前的移动。这意味着无论棋盘位置如何,它都会这样做,因此您所有可能的动作在得分方面都是相等的。因此,它只占用第一个方格(if(score &gt; currentBestScore),如果您将其更改为 >=,您将占用最后一个方格。您自己试试吧。)
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多