迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 井字棋游戏

作者:迹忆客 最近更新:2023/09/03 浏览次数:

本文将讨论使用 C++ 中的条件语句和循环创建 tic tac toe 游戏。


C++ 井字棋游戏

Tic tac Toe 是一种两人游戏,每位玩家在 3×3 网格内标记一个位置,成功在水平、垂直或对角线上放置三个标记的玩家将成为游戏的获胜者 。 游戏的示例图像如下所示。

C++ 井字棋游戏

我们可以看到玩家 X 是井字游戏的获胜者,因为玩家 X 的三个标记在一条直线对角线上。 要在 C++ 中创建相同的游戏,我们必须使用相同的算法使用笔和纸来玩游戏。

我们用笔在纸上画出 3×3 的网格,然后每个玩家轮流在网格内未占用的空间中放置一个标记。 当一名玩家成功地将三个标记放置在一条直线上时,该玩家将赢得游戏,游戏就会结束。

如果没有玩家将三个标记放在一条直线上或网格内的所有位置都被占据,则游戏将以平局结束。 我们可以使用相同的算法在 C++ 中创建 tic tac toe 游戏。

第一步,我们必须创建一个绘制 3×3 网格的函数。 在第二步中,我们必须以行号和列号的形式接受用户的输入,并检查输入是否有效。

第三步,我们要检查用户输入的位置是否被占用,如果没有被占用,我们将玩家的标记放置在用户输入的位置的网格内,如果 位置被占用,我们会要求玩家进入另一个位置。 如果所有位置都被占据,我们将结束比赛并宣布平局。

在第四步中,我们将检查任何玩家的三个标记是否在一条直线上。 如果玩家的标记在一条直线上,我们将结束游戏并宣布获胜的玩家姓名,如果标记不在一条直线上,我们将返回第二步并重复。


步骤 1:创建一个绘制 3×3 网格的函数

现在让我们从第一步开始创建游戏,我们必须绘制一个 3×3 的棋盘。 我们可以使用管道字符的组合来绘制棋盘 | 和破折号字符 - 来自键盘。

我们可以使用破折号字符 - 来绘制水平线和管道字符 | 绘制网格中存在的垂直线,我们可以使用数字来标记网格的行号和列号。 例如,让我们使用 C++ cout() 函数来绘制 3×3 网格。

请参阅下面的代码。

#include<iostream>
#include<iomanip>

using namespace std;
void drawGameBoard(char Gameboard[][3]);

int main()
{
    char Gameboard[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
    drawGameBoard(Gameboard);
    return 0;
}

void drawGameBoard(char Gameboard[][3])
{
    cout << "     1   2   3" << endl;
    cout << "   -------------" << endl;

    cout << " 1" << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | " << Gameboard[0][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 2" << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | " << Gameboard[1][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 3" << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | " << Gameboard[2][2] << " | " << endl;
    cout << "   -------------" << endl;
}

输出:

     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------

上面的代码使用endl语句将光标移动到新行。 在上面的输出中,垂直播放的数字表示行号,水平播放的数字表示列号。


第 2 步:要求用户输入行号和列号

在第二步中,我们可以要求用户输入用户想要放置标记的行号和列号。 我们将使用条件语句来检查用户输入,如果行号或列号不在1到3的范围内,我们将显示错误并要求用户重新输入。

我们将使用一个循环来获取用户的输入,循环将继续,直到用户输入有效的行号和列号。 例如,让我们使用 while 循环和 if-else 语句来获取用户的输入。

请参阅下面的代码。

#include<iostream>
#include<iomanip>

using namespace std;
void drawGameBoard(char Gameboard[][3]);

int main()
{
    int Boardrow;
    int Boardcolumn;
    bool is_Boardrow;
    bool is_Boardcolumn;
    char Gameboard[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
    drawGameBoard(Gameboard);

            is_Boardrow = false;
            while(!is_Boardrow)
            {
                cout << "BoardRow: ";
                cin >> Boardrow;
                if(Boardrow == 1 || Boardrow == 2 || Boardrow == 3)
                {
                    is_Boardrow = true;
                }
                else
                {
                    cout << endl << "Invalid Boardrow!" << endl;
                }
            }
            is_Boardcolumn = false;
            while(!is_Boardcolumn)
            {
                cout << "BoardColumn: ";
                cin >> Boardcolumn;
                if(Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3)
                {
                    is_Boardcolumn = true;
                }
                else
                {
                    cout << endl << "Invalid Boardcolumn!" << endl;
                }
            }
    return 0;
}

void drawGameBoard(char Gameboard[][3])
{
    cout << "     1   2   3" << endl;
    cout << "   -------------" << endl;

    cout << " 1" << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | " << Gameboard[0][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 2" << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | " << Gameboard[1][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 3" << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | " << Gameboard[2][2] << " | " << endl;
    cout << "   -------------" << endl;
}

输出:

     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
BoardRow: 5

Invalid Boardrow!
BoardRow: 1
BoardColumn: 6

Invalid Boardcolumn!
BoardColumn: 2

在上面的代码中,我们使用了两个整数 Boardrow 和 Boardcolumn 来存储用户输入。 我们使用两个布尔变量 is_boardRow 和 is_boardColumn 来存储输入的状态。

我们将两个布尔变量设置为 false,循环将重复并要求用户输入行号和列号,当输入的数字有效时,布尔变量将设置为 true,循环将中断。 我们使用了两个循环,一个用于行号,另一个用于列号。

上面的输出显示,当我们输入无效的行号或列号时,代码会显示无效的行号或列号,并会要求用户再次输入。


第 3 步:检查用户输入的位置是否被占用

第三步,我们必须将玩家的标记放置在用户输入的位置上,但在此之前,我们必须检查输入的位置是否被占用。

如果该位置已被占用,我们将要求用户输入另一个位置,如果该位置未被占用,我们会将玩家的标记放置在棋盘内输入的位置处。

当一名玩家成功在游戏板或网格上放置标记后,我们将不得不更换玩家。 例如,让我们使用循环和条件语句将标记放置在板上。

请参阅下面的代码。

#include<iostream>
#include<iomanip>

using namespace std;

void drawGameBoard(char Gameboard[][3]);
char checkGameWinner3by3(char Gameboard[][3]);

int main()
{
    char Gameboard[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
    char Gameplayer = 'X';
    char Gamewinner = ' ';
    int Boardrow;
    int Boardcolumn;
    bool is_Validmove;
    bool is_Boardrow;
    bool is_Boardcolumn;

    cout<<"************ TIC TAC TOE Game ************\n";
    while(Gamewinner == ' ')
    {
        is_Validmove = false;
        is_Boardrow = false;
        is_Boardcolumn = false;
        drawGameBoard(Gameboard);
        cout << "GamePlayer ";

        if(Gameplayer == 'X')
        {
            cout << 'X';
        }
        else
        {
            cout << 'O';
        }
        cout << "'s turn:" << endl;
        is_Validmove = false;

        while(!is_Validmove)
        {
            is_Boardrow = false;
            while(!is_Boardrow)
            {
                cout << "BoardRow: ";
                cin >> Boardrow;
                if(Boardrow == 1 || Boardrow == 2 || Boardrow == 3)
                {
                    is_Boardrow = true;
                }
                else
                {
                    cout << endl << "Invalid Boardrow!" << endl;
                }
            }
            is_Boardcolumn = false;
            while(!is_Boardcolumn)
            {
                cout << "BoardColumn: ";
                cin >> Boardcolumn;
                if(Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3)
                {
                    is_Boardcolumn = true;
                }
                else
                {
                    cout << endl << "Invalid Boardcolumn!" << endl;
                }
            }

            if(Gameboard[Boardrow-1][Boardcolumn-1] == ' ')
            {
                Gameboard[Boardrow-1][Boardcolumn-1] = Gameplayer;
                is_Validmove = true;
                if(Gameplayer == 'X')
                {
                    Gameplayer = 'O';
                }
                else
                {
                    Gameplayer = 'X';
                }
            }
            else
            {
                cout<<"The selected space is occupied!" << endl;
                cout << "Select a different space:" << endl << endl;
                drawGameBoard(Gameboard);
            }
        }
        cout << endl;

    }
    system("pause");
    return 0;
}

void drawGameBoard(char Gameboard[][3])
{
    cout << "     1   2   3" << endl;
    cout << "   -------------" << endl;

    cout << " 1" << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | " << Gameboard[0][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 2" << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | " << Gameboard[1][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 3" << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | " << Gameboard[2][2] << " | " << endl;
    cout << "   -------------" << endl;

}

输出:

************ TIC TAC TOE Game ************
     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 1
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 2
BoardColumn: 2

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   | O |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow:

在上面的代码中,我们使用了另一个布尔变量is_validMove来保存输入位置的状态。 布尔值将被设置为 false,并且 while 循环将重复自身; 布尔值设置为 true,如果用户输入尚未占用的位置,我们会将其设置为 true。

我们使用了另一个变量 Gamewinner,它被设置为空字符串,这将在下一步中用于声明获胜者并停止游戏。

在接受用户输入的 while 循环下面,我们使用 if-else 语句来检查 Gameboard 数组中输入的位置,如果该位置空闲,我们将添加玩家的标记并将 is_validmove 布尔值设置为 true, 我们会改变玩家,如果空间没有空闲,我们会显示该空间已被占用,并会要求用户进入另一个空间或位置,然后我们会绘制游戏板。

我们可以在上面的输出中看到玩家标记被放置在游戏板内。


第 4 步:创建一个函数来检查游戏获胜者

在最后一步中,我们将创建一个函数来检查游戏获胜者。 要检查游戏获胜者,我们必须检查网格或游戏板的每一行、每一列和对角线条目。

如果棋盘上的任何行、列或对角线条目具有三个相同的标记,我们将返回该标记,如果它们都没有三个标记,我们将返回一个空字符串。

我们将游戏获胜者函数的输出保存在 Gamewinner 变量中,如果有游戏获胜者,主循环将停止; 否则,它将继续。

如果有获胜者,我们将宣布并结束游戏; 否则,比赛将打平。 例如,让我们使用 for 循环和条件语句创建游戏获胜者函数。

请参阅下面的代码。

#include<iostream>
#include<iomanip>

using namespace std;

void drawGameBoard(char Gameboard[][3]);
char checkGameWinner3by3(char Gameboard[][3]);

int main()
{
    char Gameboard[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
    char Gameplayer = 'X';
    char Gamewinner = ' ';
    int Boardrow;
    int Boardcolumn;
    bool is_Validmove;
    bool is_Boardrow;
    bool is_Boardcolumn;

    cout<<"************ TIC TAC TOE Game ************\n";
    while(Gamewinner == ' ')
    {
        is_Validmove = false;
        is_Boardrow = false;
        is_Boardcolumn = false;
        drawGameBoard(Gameboard);
        cout << "GamePlayer ";
        if(Gameplayer == 'X')
        {
            cout << 'X';
        }
        else
        {
            cout << 'O';
        }
        cout << "'s turn:" << endl;
        is_Validmove = false;
        while(!is_Validmove)
        {
            is_Boardrow = false;
            while(!is_Boardrow)
            {
                cout << "BoardRow: ";
                cin >> Boardrow;
                if(Boardrow == 1 || Boardrow == 2 || Boardrow == 3)
                {
                    is_Boardrow = true;
                }
                else
                {
                    cout << endl << "Invalid Boardrow!" << endl;
                }
            }
            is_Boardcolumn = false;
            while(!is_Boardcolumn)
            {
                cout << "BoardColumn: ";
                cin >> Boardcolumn;
                if(Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3)
                {
                    is_Boardcolumn = true;
                }
                else
                {
                    cout << endl << "Invalid Boardcolumn!" << endl;
                }
            }
            if(Gameboard[Boardrow-1][Boardcolumn-1] == ' ')
            {
                Gameboard[Boardrow-1][Boardcolumn-1] = Gameplayer;
                is_Validmove = true;
                if(Gameplayer == 'X')
                {
                    Gameplayer = 'O';
                }
                else
                {
                    Gameplayer = 'X';
                }
            }
            else
            {
                cout<<"The selected space is occupied!" << endl;
                cout << "Select a different space:" << endl << endl;
                drawGameBoard(Gameboard);
            }
        }
        cout << endl;
        Gamewinner = checkGameWinner3by3(Gameboard);
        if(Gamewinner == 'X' || Gamewinner == 'O')
        {
            drawGameBoard(Gameboard);
            cout<<"Congratulations! GamePlayer ";
            if(Gamewinner == 'X')
            {
                cout << 'X';
            }
            else
            {
                cout << 'O';
            }
            cout<<" is the Gamewinner!"<<endl;
        }
        else if(Gamewinner == 'T')
        {
            drawGameBoard(Gameboard);
            cout << "It's a tie!" << endl;
        }

    }

    system("pause");
    return 0;
}

void drawGameBoard(char Gameboard[][3])
{
    cout << "     1   2   3" << endl;
    cout << "   -------------" << endl;

    cout << " 1" << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | " << Gameboard[0][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 2" << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | " << Gameboard[1][2] << " | " << endl;
    cout << "   -------------" << endl;

    cout << " 3" << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | " << Gameboard[2][2] << " | " << endl;
    cout << "   -------------" << endl;

}
char checkGameWinner3by3(char Gameboard[][3])
{


    for(int i=0; i<3; i++)
    {
        if(Gameboard[i][0]==Gameboard[i][1] && Gameboard[i][0]==Gameboard[i][2])
        {
            return Gameboard[i][0];
        }
    }

    for(int i=0; i<3; i++)
    {
        if(Gameboard[0][i]==Gameboard[1][i] && Gameboard[0][i]==Gameboard[2][i])
        {
            return Gameboard[0][i];
        }
    }

    if(Gameboard[0][0]==Gameboard[1][1] && Gameboard[1][1]==Gameboard[2][2])
    {
        return Gameboard[0][0];
    }

    if(Gameboard[0][2]==Gameboard[1][1] && Gameboard[1][1]==Gameboard[2][0])
    {
       return Gameboard[0][2];
    }

    return ' ';
}

输出:

************ TIC TAC TOE Game ************
     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 1
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 2
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 2
BoardColumn: 2

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 3
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 | O |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 3
BoardColumn: 3

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 | O |   | X |
   -------------
Congratulations! GamePlayer X is the Gamewinner!

在代码中,我们可以看到 checkGameWinner3by3() 函数,该函数接受棋盘作为输入,并包含两个 for 循环和两个 if 语句。 for 循环用于检查行和列,if 语句用于检查对角线条目。

上一篇:C++ 中的默认构造函数和 default 关键字

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 中的默认构造函数和 default 关键字

发布时间:2023/09/02 浏览次数:127 分类:C++

本文讨论 C++ 中的默认构造函数以及新引入的关键字 default。首先,让我们了解一下C++中的默认构造函数。 默认构造函数是一种特殊的构造函数,它没有参数,用于为类的数据成员设置默认值。

C++ 中的空构造函数

发布时间:2023/09/02 浏览次数:165 分类:C++

C++ 中的空构造函数是一种不执行任何操作的特殊类型构造函数。 编译器知道没有代码可以执行,因此不会为构造函数生成任何可执行代码。

C++ 中的结构体构造函数

发布时间:2023/09/02 浏览次数:74 分类:C++

这篇文章将讨论 struct 的使用以及使用 C++ 添加构造函数。C++结构体简介 struct 代表结构,是组合了一些基本类型变量的用户定义数据类型。 这些变量混合起来形成一个新的单元。

单链表的 C++ 复制构造函数

发布时间:2023/08/31 浏览次数:59 分类:C++

本文将首先讨论链表数据结构的概念以及使用它的合适场景。 然后,我们将讨论使用 C++ 的单链表和单链表的复制构造函数的紧凑实现。

C++ 二叉搜索树析构函数

发布时间:2023/08/31 浏览次数:161 分类:C++

本文将讨论使用 C++ 中的 delete 关键字为二叉搜索树创建析构函数。C++ 二叉搜索树析构函数

C++ 中负数的模数

发布时间:2023/08/31 浏览次数:121 分类:C++

在本文中,我们将发现余数和模数之间的差异。 我们将了解 % 运算符的基础知识。稍后,我们将了解 % 运算符在 Python 和 C++ 中的行为方式。 最后,我们将通过讨论在 C++ 中实现模数功能的几种

C++ 中最快的排序算法

发布时间:2023/08/31 浏览次数:150 分类:C++

本文将解释哪种排序算法在什么条件下表现最好。 条件包括数据结构的类型、排序数据的大小、数据排列和数据元素的范围。

将 DLL 反编译为 C++ 源代码

发布时间:2023/08/31 浏览次数:198 分类:C++

本文讨论我们可以用来将 DLL 反编译为 C++ 源代码的工具。反编译器简介 反编译器是一种逆向工程工具。

处理 C++ 中的访问冲突

发布时间:2023/08/31 浏览次数:86 分类:C++

访问冲突,也称为分段错误,意味着您的 C++ 程序试图访问未在作用域中保留的内存。 本文将教您如何解决 C++ 中的访问冲突错误。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便