c++ - 无法弄清楚为什么我的程序在条件不为真时执行 if 语句(数组)

标签 c++ arrays tic-tac-toe

我正在尝试解决我正在阅读的这本书中的练习题,以自学 C++。

该问题要求创建一个两个人都可以玩的井字棋游戏,使用enum 来表示棋盘上的值(本章讨论了枚举器)。

这是我到目前为止编写的代码,一切似乎都运行良好,除了每当我进入第 1 行第 3 列时,当轮到玩家 X 时,这会导致它结束游戏并询问是否再次玩或者即使游戏还没有结束。

我似乎不明白为什么,因为它只有这个坐标,而且只有在 X 玩家的回合中。

要使用该程序,您首先输入行号,然后输入列号。

我也知道你可以覆盖板上的一个地方,我只是假设你现在不会。

如果有人能帮我指出这个错误,那就太好了,我的代码可能读起来很困惑,对此感到抱歉,但我仍在练习并且对编程还很陌生。

我非常乐意解释一行代码应该做什么!。

代码如下:

#include<iostream>
#include<array>

enum TicTacToeSquare
{
    blankSquare=0,
    X=1,
    O=2
};

int turn=0;

using namespace std;

int winCondition(int a[3][3]);
void printBoard(int a[3][3]);
void resetBoard(int a[3][3]);
int testBoard(int a[3][3]);

int main()
{
    int choice;

    int board[3][3]=
    {
        {0,0,0},
        {0,0,0},
        {0,0,0}
    };

    int i,j;

    while (true)
    {
        for (turn=0;turn<9;++turn)
        {
            if (turn%2==0)
            {
                std::cout<<"Player X: \n"<<"Enter board position:  \n";
                std::cin>>i>>j;
                std::cout<<std::endl;
                board[i-1][j-1]=X;
                printBoard(board);

                if (winCondition(board)==1)
                {
                    int choice;
                    cout<<"\nDo you want to play again?"<<endl;
                    cout<<"1. Yes\n"<<"2. No"<<endl;
                    cin>>choice;

                    if (choice==1)
                    {
                        resetBoard(board);
                        std::cout<<std::endl;
                        printBoard(board);
                        turn=0;
                    }
                    else if (choice==2)
                    {
                        cout<<"\nThanks for playing!"<<endl;
                        return 0;
                    }
                    else
                    {
                        cout<<"\nInvalid option, game will terminate."<<endl;
                        return 0;
                    }
                }
            }

            if (turn%2!=0)
            {
                std::cout<<"Player O: \n"<<"Enter board position:   \n";
                std::cin>>i>>j;
                std::cout<<std::endl;
                board[i-1][j-1]=O;
                printBoard(board);

                if (winCondition(board)==2)
                {
                    int choice;
                    cout<<"\nDo you want to play again?"<<endl;
                    cout<<"1. Yes\n"<<"2. No"<<endl;
                    cin>>choice;

                    if (choice==1)
                    {
                        resetBoard(board);
                        std::cout<<std::endl;
                        printBoard(board);
                        turn=0;
                    }
                    else if (choice==2)
                    {
                        cout<<"\nThanks for playing!"<<endl;
                        return 0;
                    }
                    else
                    {
                        cout<<"\nInvalid option, game will now terminate."<<endl;
                        return 0;
                    }
                }
            }
        }
        std::cout<<"Game is a draw!"<<std::endl;
        std::cout<<"Do you want to play again?"<<std::endl;
        std::cin>>choice;

        if (choice==1)
        {
            resetBoard(board);
            std::cout<<std::endl;
            printBoard(board);
        }
        else if (choice==2)
        {
            cout<<"\nThanks for playing!"<<std::endl;
            return 0;
        }
        else
        {
            cout<<"Invalid option, game will now terminate."<<endl;
            return 0;
        }
    }
}

void printBoard(int board[3][3])
{ 
    for (int i=1;i<4;++i)
    {
        for (int j=1;j<4;++j)
        {
            cout<<board[i-1][j-1]<<" ";

            if (j%3==0)
            {
                cout<<"\n";
            }
        }
    }
}

int winCondition(int board[3][3])
{


    if (board[0][0]==X&&board[0][1]==X&&board[0][2]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][0]==O&&board[0][1]==O&&board[0][2]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if (board[0][0]==X&&board[1][0]==X&&board[2][0]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][0]==O&&board[1][0]==O&&board[2][0]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if  (board[0][1]==X&&board[1][1]==X&&board[2][1]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][1]==O&&board[1][1]==O&&board[2][1]==O)
    {
        cout<<"\Player O wins!"<<std::endl;
        return 2;
    }

    else if (board[0][2]==X&&board[1][2]==X&&board[2][2]==X)
    {
        cout<<"Player X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][2]==O&&board[1][2]==O&&board[2][2]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if (board[1][0]==X&&board[1][1]==X&&board[1][2]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[1][0]==O&&board[1][1]==O&&board[1][2]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if (board[2][0]==X&&board[2][1]==X&&board[2][2]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[2][0]==O&&board[2][1]==O&&board[2][2]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if (board[0][0]==X&&board[1][1]==X&&board[2][2]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][0]==O&&board[1][2]==O&&board[2][2]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }

    else if (board[0][2]==X&&board[1][1]==X&&board[2][0]==X)
    {
        cout<<"\nPlayer X wins!"<<std::endl;
        return 1;
    }

    else if (board[0][2]==O&&board[1][1]==O&&board[2][0]==O)
    {
        cout<<"\nPlayer O wins!"<<std::endl;
        return 2;
    }



}

void resetBoard(int board[3][3])
{
    for (int i=0;i<3;++i)
    {
        for (int j=0;j<3;++j)
        {
            board[i][j]=blankSquare;
        }
    }
}

最佳答案

winCondition 中,如果没有人获胜,则您没有明确的返回。这会导致未定义的行为,这意味着可以返回任何值。您需要在函数末尾添加一个return 0;

如果您在启用所有警告的情况下进行编译,编译器会告诉您类似的问题。

关于c++ - 无法弄清楚为什么我的程序在条件不为真时执行 if 语句(数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221713/

相关文章:

javascript - es6 合并两个对象数组并覆盖现有对象

Java 8 - 如何处理非基本类型的数组?

java - 井字游戏的开始菜单

c++ - SEAL:平方运算后解密不正确,即使密文的噪声预算大于零

c++ - 如何通过网络将命令从 Windows GUI 发送到 Linux 机器?

c++ - 命名空间和静态类成员链接

c - 当我不知道它会在 C 中分配多少个值时,如何使用 scanf?

c++ - 使指针的中间为 NUL;它有效吗?

java - 确定神经网络中的隐藏神经元

mysql - 井字游戏字段列表 MySQL 中的未知列 'i'