【问题标题】:Tic Tac Toe - Computer AI井字游戏 - 电脑人工智能
【发布时间】:2014-03-12 08:51:41
【问题描述】:

我正在玩家和计算机之间构建一个 5x5 井字游戏,我遇到了计算机将查看玩家移动的部分,如果玩家已经有 4 行,我决定阻止他的获胜回合.所以我知道它应该是一个 for 循环,但我在实现它时遇到了问题。查找数组的最佳方法是什么,里面有 4 个元素来检查 5 个元素中的 4 个是否相同?通常我会做if else 声明,但在这种情况下if else 应该是乏味且冗长的。

下面是我的伪代码

for (int i = 0; i < rowSize; i++)
{
     if(any 4 out of 5 elements are equal)
     {
          block it;
     }
}

PS:我有一个 5x5 的获胜组合数组,它的行大小为 12

【问题讨论】:

    标签: c#


    【解决方案1】:

    使用 LINQ:

    if(elements.GroupBy(e=>e).Max(g=>g.Count())>=4)
      ...
    

    GroupBy 将相等的值组合在一起(作为 IGrouping 的集合),Max(g=&gt;g,Count()) 返回最大组中的项目数。

    【讨论】:

      【解决方案2】:

      C#风格的伪代码,是

      wins 获胜组合数组(按位置)例如[[0,1,2,3], [1,2,3,4], ...]

      board 带有 25 个正方形 (5x5) 的单个字符数组(例如)。例如每个方块可以是''、'X'或'O'

      例如,player 是“X”或“O”。

      这是检查玩家是否获胜的算法。

      bool checkWin(char player)
      {
        foreach (win in wins)
        {
           int count = 0;
           foreach(sq in win)
           {
             if (board[sq] == player)
               count++;
           }
           if (count == 4) return true;
        }
        return false;
      }
      

      【讨论】:

      • 但这包括对角线的胜利吗?
      • 当然,假设您在wins 中拥有所有对角线组合数组。我不得不说board 只是一个包含 25 个元素的数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多