【问题标题】:How to check 2 Dimensional array for a winner in a game of tic tac toe如何在井字游戏中检查 2 维数组的获胜者
【发布时间】:2023-03-16 19:10:02
【问题描述】:

我正在创建一个井字游戏作为一个具有二维数组的项目,我在检查点以查看是否有赢家时遇到了一些麻烦。有人可以帮我调试吗?这里是checkwinner函数和main函数。

char CheckWinner( char board[3][3])
{
    int i = 0;
    int j = 0;

                    if ( board[i][j] =='X' && board[i][j+1] == 'X' && board[i][j+2]== 'X' )
                    { W = X;}
                    else if (board[i+1][j] && board[i+1][i+1] && board[i+1][j+2]== 'X' )
                    { W = X;}
                    else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'X')
                    { W = X;}
                    else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'X')
                    { W = X;}
                    else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'X')
                    { W = X;}
                    else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'X')
                    { W =X;}
                    else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]=='X')
                    { W = X;}
                    else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'X')
                    { W = X;}

                    else if (board[i][j] && board[i][j+1] && board[i][j+2]== 'O' )
                    { W = O;}
                    else if (board[i+1][j] && board[i+1][j+1] && board[i+1][j+2]== 'O')
                    { W = O;}
                    else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'O')
                    { W = O;}
                    else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'O')
                    { W = O;}
                    else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'O')
                    { W = O;}
                    else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'O')
                    { W = O;}
                    else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]== 'O')
                    { W = O;}
                    else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'O')
                    { W = O;}



    return W;
}
int main () 
{ 
    char board[3][3];
    char Win = CheckWinner(board);
    int r = 0;


    InitializeBoard(board);

     for (int r = 0; r < 4 ; r++)
     { 
        PlayX(board);
        PlayO(board); 
        PrintBoard(board);
    }
     CheckWinner(board);
     cout << Win ;

    if (Win == X)
    {
        cout << "The winner is Player 1.";
    }
    else if (Win == O)
    {
        cout << "The winner is Player 2.";
    }
    else if (Win == TIE)
    {
        cout << " IT'S A TIE";
    }
    else; 


    system("PAUSE");
return 0; 

【问题讨论】:

  • 调试什么,究竟是什么?您遇到了什么错误/错误?
  • 请提供准确的错误信息。
  • 好的,我停止了错误消息。这是上面另一个函数中的一个微不足道的错字。对不起。
  • 我认为“停止错误消息”意味着它已修复。投票结束。

标签: c++ multidimensional-array


【解决方案1】:

您可以使用以下方法优化您的条件代码:

typedef char piece;

piece iswin() const
{
    piece ret = 'T';

    // Checks for horizontal win
    for (int i = 0; i < 3; ++i)
        if (*arr[i] == arr[i][1] && arr[i][1] == arr[i][2])
            if ((ret = *arr[i]) != 'T')
                return ret;

    // Checks for vertical win
    for (int i = 0; i < 3; ++i)
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
            if ((ret = arr[0][i]) != 'T')
                return ret;

    // Check for diagonal win (upper left to bottom right)
    if (**arr == arr[1][1] && arr[1][1] == arr[2][2])
        if ((ret = **arr) != 'T')
            return ret;

    // Check for diagonal win (upper right to bottom left)
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
        if ((ret = arr[0][2]) != 'T')
            return ret;

    return ret;
}

// checking the result:
switch (winner) {
    case 'T': /* tie */ break;
    case 'X': /* X won */ break;
    case 'O': /* O won */ break;
}

这有点干净。它执行 6 个循环而不是 9 个。

【讨论】:

  • @Armin,是的,谢谢。固定的。我写这篇文章的时候一定是喝醉了。
【解决方案2】:

您立即将CheckWinner 结果分配给Win,然后玩完游戏,然后再次调用CheckWinner,而不将其结果分配给Win。因此,当您在以下行中检查 Win 时,您会得到板子尚未初始化时的原始结果。

【讨论】:

  • 这是为了检查您可以赢得 x 和 o 的 8 种不同方式。
  • 以问题结尾的答案?这应该是评论吗?
  • 无视这一点。你的第一个建议让我觉得很愚蠢,我应该早点意识到这一点。这使我的游戏正常运行,所以一切都是正确的,我只是没有在正确的位置将 Win 分配给 CheckWinner。谢谢。
【解决方案3】:

可能与将文字 O 或 X 分配给应该是 char 的返回值有关。因此,应该是“O”或“X”而不是 O 或 X。除非 O 或 X 在发布的代码之外定义为 char 变量。

【讨论】:

  • const char X = 'X' 和 const char O = 'O' 我都试过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多