0

我正在编写一个带有 minimax 的 Connect 4 游戏,但我的下一步检查功能有时会给我带来意想不到的结果。你能告诉我我的算法是否正确吗?

例如,如果我的电路板看起来像这样

0000000 
0000000
0000000
0000000
1000000
2002120

对于玩家 2,它将返回第 0 列为真。

bool Board::check2(int player, int& bestMove)
{
    for (int i=0; i<WIDTH; i++)
    {
        if(addToColumn(i, player))
        {



            if (checkNext(2, i, player))
            {
                bestMove=i;
                removeFromColumn(i, player);
                return true;
            }
            removeFromColumn(i, player);
        }

    }
    return false;
}


    bool Board::checkNextVertical(int size, int column, int player1)
    {
        int counter=0;
        int player2;

        if (player1==1)
        {
            player2=2;
        }
        else
            player2=1;

        for (int i=0 ; i<DEPTH; i++)
        {
            if (arrBoard[column][i]==player1)
            {
                counter++;
            }

            if (arrBoard[column][i]==player2)
            {
                return false;
            }
            if (counter==size)
            {
                return true;
            }



        }
        return false;
    }

    bool Board::checkNextHorizontal(int size, int column, int player1)
    {
        int counter=0;
        int player2;

        if (player1==1)
        {
            player2=2;
        }
        else
            player2=1;

        for (int i=0 ; i<DEPTH; i++)
        {
            if (arrBoard[i][column]==player1)
            {

                for (int j = 0; j<WIDTH; j++)
                {
                    if (arrBoard[i][j]==player1)
                    {
                        counter++;
                    }

                    if (arrBoard[i][j]!=player1)
                    {
                        counter=0;
                    }
                    if (counter==size)
                    {
                        return true;
                    }


                }
            }
    }
        return false;

    }

    bool Board::checkNext(int size, int column, int player)
    {
        if (checkNextVertical(size, column, player))
        {
            //  printBoard();
            return true;
        }


        if (checkNextHorizontal(size, column, player))
        {
          //  printBoard();
            return true;
        }



        return false;
    }
4

1 回答 1

0

欢迎来到论坛。

您发布的代码存在一些问题:

您的checkNextVertical函数似乎试图进行水平检查,而您的checkNextHorizontal函数似乎试图同时进行水平和垂直检查。

如果您注意到您同时使用arrBoard[column][i]arrBoard[i][column]。我相信你会同意其中只有一个是正确的。了解哪个是正确的很重要,否则您的代码最终将尝试访问数组中无效的位置,并且您将得到意外的行为,例如您的函数中的j循环当前正在执行此操作。checkNextHorizontal

它应该用作array[y / depth / row][x / width / column]- 或任何你会记得的东西。

就个人而言,这段代码似乎令人困惑:

    int player2;

    if (player1==1)
    {
        player2=2;
    }
    else
        player2=1;

player2=1似乎试图将方形钉子推入圆孔中。您可以使用int player并将其设置为1或者2使其更易于阅读吗?

我完全同意 Joachim 的观点——如果你有这些问题,用一些数据填充数组总是一个好主意,然后使用调试器单步执行你的代码并检查正在访问的数据是否是你期望的数据访问。

或者,由于它是一个 connect4 游戏,我假设您在某些时候知道最后一步是在哪一列进行的,在这种情况下,您可以使用此函数来检查它是否是一个获胜的举动。你只需要告诉它最后一步是哪一列,以及获胜所需的“大小”。如果您确实使用它,我仍然建议您使用调试器单步执行它,以便您了解数组访问。注意:您的代码没有对角检查-所以也没有。如果您想这样做,则需要一些额外的逻辑:

bool winningMove(int column, int size)
{
  bool winnerWinnerChickenDinner = false;

  int player = 0;
  int row    = 0;

  // Who was the last player to go in this column
  // i.e. find the top non-zero entry
  for (int i = 0; i < DEPTH; i++)
  {
    if (arrBoard[i][column] != 0)
    {
      player = arrBoard[i][column];
      row = i;
      break;
    }
  }

  // If we found a player, check if it was a winning move
  if (player != 0)
  {
    int count = 0;

    // Loop twice, first horizontally, then vertically
    for (int i = 0; i < 2 && !winnerWinnerChickenDinner; i++)
    {
      bool horizontal = (i == 0);

      for (int j = 0; j < (horizontal ? WIDTH : DEPTH); j++)
      {
        // Check if we have 'size' consecutive entries by the same player
        // (When we check horizontally, use arrBoard[row][j]    to check the row)
        // (When we check vertically,   use arrBoard[j][column] to check the column)
        if (arrBoard[(horizontal ? row : j)][(horizontal ? j : column)] == player)
        {
          if (++count == size)
          {
            winnerWinnerChickenDinner = true;
            break;
          }
        }
        else
        {
          count = 0;
        }
      }
    }
  }

  return winnerWinnerChickenDinner;
}

老游戏是最好的——Connect4很棒,祝你好运。

于 2012-12-04T08:17:22.600 回答