C++代码实现五子棋小游戏

 更新时间:2022年05月05日 14:46:05   作者:A_N_Huang  
这篇文章主要为大家详细介绍了C++代码实现五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

简单C++代码实现五子棋任务,供大家参考,具体内容如下

首先先展示一下运行的图片

话也不多说,直接分不同代码板块来介绍程序不同功能以及是如何实现的

首先,对于一个五子棋程序,我们要思考的,在过程式的编程思想里面,如何将其功能分解为不同的函数

1.打印棋盘

由于使用的棋子每一个棋子占两个字符,所以打印时要使用两个空格

int b=0,w=0,player=1,x,y; //b和w分别作为参数标记黑棋白棋的胜利,player用来指明每次是下黑棋还是白棋,x,y分别用来作为棋盘的横纵坐标
int chess[11][11];//初始化
void board()//每一次打印棋盘的函数
{   
    cout << "    1 2 3 4 5 6 7 8 9 10" <<endl;
    cout << "  +--------------------+" <<endl;
    for(int i=1;i<=9;i++)
    {
        cout<<" "<<i<<"|";
        input(i-1);//input函数在后文介绍
        cout<<"|"<<endl;
    }
    cout << "10|";input(9); cout <<"|" <<endl;
    cout << "  +--------------------+" <<endl;
}

考虑到字符数组本身无法同时对连续两个字符位赋值,这里采用二位数组表示下棋位置并采用一个input函数将二维数组转化为棋子

void init()
{
    for(int i=0;i<11;i++)
    {
        for(int j=0;j<11;j++)
        chess[i][j]=0;//初始化棋盘全为0
        }
}
void input(const int n)
{
    for(int i=n,j=0;j<10;j++)
    {
        switch(chess[i][j])//利用这个switch语句来将空白的棋盘中需要打印的棋子打印上去
        {
            case(0): cout << "  ";break;
            case(1): cout << "��";break;
            case(-1): cout << "��";break;
            }
    }
}

2.下棋部分

这一部分也是最为麻烦的部分,由于每次调用检验函数检验黑棋或白棋是否胜利会带来不必要的麻烦,所以在每一次下棋之后直接在下棋的位置往各个方向检索以判断是否胜利

void play(int x,int y)
{
    if(player==1)
    {chess[x-1][y-1]=1;//表示下黑棋
     if(chess[x-1][y]==1&&chess[x-1][y+1]==1&&chess[x-1][y+2]==1&&chess[x-1][y+3]==1)//重复的判断代码,每一次复制粘贴即可
     b=5;
     else if(chess[x-1][y]==1&&chess[x-1][y-1]==1&&chess[x-1][y-2]==1&&chess[x-1][y-3]==1)
     b=5;
     else if(chess[x][y-1]==1&&chess[x+1][y-1]==1&&chess[x+2][y-1]==1&&chess[x+3][y-1]==1)
     b=5;
     else if(chess[x][y-1]==1&&chess[x-1][y-1]==1&&chess[x-2][y-1]==1&&chess[x-3][y-1]==1)
     b=5;
     else if(chess[x][y]==1&&chess[x+1][y+1]==1&&chess[x+2][y+2]==1&&chess[x+3][y+3]==1)
     b=5;
     else if(chess[x-2][y-2]==1&&chess[x-3][y-3]==1&&chess[x-4][y-4]==1&&chess[x-5][y-5]==1)
     b=5;
     else if(chess[x-2][y]==1&&chess[x-3][y+1]==1&&chess[x-4][y+2]==1&&chess[x-5][y+3]==1)
     b=5;
     else if(chess[x][y-2]==1&&chess[x+1][y-3]==1&&chess[x+2][y-4]==1&&chess[x+3][y-5]==1)
     b=5;
     player=2;}
    else if(player==2)
    {chess[x-1][y-1]=-1;//表示下白棋
     if(chess[x-1][y]==1&&chess[x-1][y+1]==1&&chess[x-1][y+2]==1&&chess[x-1][y+3]==1)
     w=5;
     else if(chess[x-1][y]==1&&chess[x-1][y-1]==1&&chess[x-1][y-2]==1&&chess[x-1][y-3]==1)
     w=5;
     else if(chess[x][y-1]==1&&chess[x+1][y-1]==1&&chess[x+2][y-1]==1&&chess[x+3][y-1]==1)
     w=5;
     else if(chess[x][y-1]==1&&chess[x-1][y-1]==1&&chess[x-2][y-1]==1&&chess[x-3][y-1]==1)
     w=5;
     else if(chess[x][y]==1&&chess[x+1][y+1]==1&&chess[x+2][y+2]==1&&chess[x+3][y+3]==1)
     w=5;
     else if(chess[x-2][y-2]==1&&chess[x-3][y-3]==1&&chess[x-4][y-4]==1&&chess[x-5][y-5]==1)
     w=5;
     else if(chess[x-2][y]==1&&chess[x-3][y+1]==1&&chess[x-4][y+2]==1&&chess[x-5][y+3]==1)
     w=5;
     else if(chess[x][y-2]==1&&chess[x+1][y-3]==1&&chess[x+2][y-4]==1&&chess[x+3][y-5]==1)
     w=5;
     player=1;}
}

同时,我们还需要一点小小的附加代码,因为你不能保证每一次棋手下棋都是在合法位置

void judge()
{
    while(1)//c++类似的使用很多,用永真的表达式,然后判断跳出条件break,这里主要用来重复判断落子是否合法
    {
        if(x<=0||x>10||y<=0||y>10)
        {
            cout <<"invalid position,input again:"<<endl;
            cin >>x>>y;
            }
        else if(chess[x-1][y-1]!=0)
        {
            cout <<"wrong place,input again:"<<endl;
            cin >>x>>y;
            }
        else if(x>0&&x<=10&&y>0&&y<=10&&chess[x-1][y-1]==0)
            break;
        }
}

3.主函数

加下来就是main函数部分了,显而易见了

int main()
{   
    init();
    board();
    while(1)
   {
        cout << "Black: ";
        cin>>x>>y;
        judge();
        play(x,y);
        system("cls");//清屏功能
        board();
        if(b==5)
        {
            system("cls");cout << "Black win";break;
            }
        else if(w==5)
        {
            system("cls");cout << "White win";break;
            }
        cout << "White: " ;
        cin >>x>>y;
        judge();
        play(x,y);
        system("cls");
        board();
        if(b==5)
        {
            system("cls");cout << "Black win";break;
            }
        else if(w==5)
        {
            system("cls");cout << "White win";break;
            }
        }
    return 0;
}

至此,就可以实现整个五子棋代码的功能了

附上完整的代码:

#include <iostream>
using namespace std;
int b=0,w=0,player=1,x,y; //b和w分别作为参数标记黑棋白棋的胜利,player用来指明每次是下黑棋还是白棋,x,y分别用来作为棋盘的横纵坐标
int chess[11][11];//初始化
void init()
{
    for(int i=0;i<11;i++)
    {
        for(int j=0;j<11;j++)
        chess[i][j]=0;//初始化棋盘全为0
        }
}
void input(const int n)
{
    for(int i=n,j=0;j<10;j++)
    {
        switch(chess[i][j])//利用这个switch语句来将空白的棋盘中需要打印的棋子打印上去
        {
            case(0): cout << "  ";break;
            case(1): cout << "��";break;
            case(-1): cout << "��";break;
            }
    }
}
void board()//每一次打印棋盘的函数
{   
    cout << "    1 2 3 4 5 6 7 8 9 10" <<endl;
    cout << "  +--------------------+" <<endl;
    for(int i=1;i<=9;i++)
    {
        cout<<" "<<i<<"|";
        input(i-1);//input函数在后文介绍
        cout<<"|"<<endl;
    }
    cout << "10|";input(9); cout <<"|" <<endl;
    cout << "  +--------------------+" <<endl;
}
void play(int x,int y)
{
    if(player==1)
    {chess[x-1][y-1]=1;//表示下黑棋
     if(chess[x-1][y]==1&&chess[x-1][y+1]==1&&chess[x-1][y+2]==1&&chess[x-1][y+3]==1)//重复的判断代码,每一次复制粘贴即可
     b=5;
     else if(chess[x-1][y]==1&&chess[x-1][y-1]==1&&chess[x-1][y-2]==1&&chess[x-1][y-3]==1)
     b=5;
     else if(chess[x][y-1]==1&&chess[x+1][y-1]==1&&chess[x+2][y-1]==1&&chess[x+3][y-1]==1)
     b=5;
     else if(chess[x][y-1]==1&&chess[x-1][y-1]==1&&chess[x-2][y-1]==1&&chess[x-3][y-1]==1)
     b=5;
     else if(chess[x][y]==1&&chess[x+1][y+1]==1&&chess[x+2][y+2]==1&&chess[x+3][y+3]==1)
     b=5;
     else if(chess[x-2][y-2]==1&&chess[x-3][y-3]==1&&chess[x-4][y-4]==1&&chess[x-5][y-5]==1)
     b=5;
     else if(chess[x-2][y]==1&&chess[x-3][y+1]==1&&chess[x-4][y+2]==1&&chess[x-5][y+3]==1)
     b=5;
     else if(chess[x][y-2]==1&&chess[x+1][y-3]==1&&chess[x+2][y-4]==1&&chess[x+3][y-5]==1)
     b=5;
     player=2;}
    else if(player==2)
    {chess[x-1][y-1]=-1;//表示下白棋
     if(chess[x-1][y]==1&&chess[x-1][y+1]==1&&chess[x-1][y+2]==1&&chess[x-1][y+3]==1)
     w=5;
     else if(chess[x-1][y]==1&&chess[x-1][y-1]==1&&chess[x-1][y-2]==1&&chess[x-1][y-3]==1)
     w=5;
     else if(chess[x][y-1]==1&&chess[x+1][y-1]==1&&chess[x+2][y-1]==1&&chess[x+3][y-1]==1)
     w=5;
     else if(chess[x][y-1]==1&&chess[x-1][y-1]==1&&chess[x-2][y-1]==1&&chess[x-3][y-1]==1)
     w=5;
     else if(chess[x][y]==1&&chess[x+1][y+1]==1&&chess[x+2][y+2]==1&&chess[x+3][y+3]==1)
     w=5;
     else if(chess[x-2][y-2]==1&&chess[x-3][y-3]==1&&chess[x-4][y-4]==1&&chess[x-5][y-5]==1)
     w=5;
     else if(chess[x-2][y]==1&&chess[x-3][y+1]==1&&chess[x-4][y+2]==1&&chess[x-5][y+3]==1)
     w=5;
     else if(chess[x][y-2]==1&&chess[x+1][y-3]==1&&chess[x+2][y-4]==1&&chess[x+3][y-5]==1)
     w=5;
     player=1;}
}
void judge()
{
    while(1)//c++类似的使用很多,用永真的表达式,然后判断跳出条件break,这里主要用来重复判断落子是否合法
    {
        if(x<=0||x>10||y<=0||y>10)
        {
            cout <<"invalid position,input again:"<<endl;
            cin >>x>>y;
            }
        else if(chess[x-1][y-1]!=0)
        {
            cout <<"wrong place,input again:"<<endl;
            cin >>x>>y;
            }
        else if(x>0&&x<=10&&y>0&&y<=10&&chess[x-1][y-1]==0)
            break;
        }
}
int main()
{   
    init();
    board();
    while(1)
   {
        cout << "Black: ";
        cin>>x>>y;
        judge();
        play(x,y);
        system("cls");//清屏功能
        board();
        if(b==5)
        {
            system("cls");cout << "Black win";break;
            }
        else if(w==5)
        {
            system("cls");cout << "White win";break;
            }
        cout << "White: " ;
        cin >>x>>y;
        judge();
        play(x,y);
        system("cls");
        board();
        if(b==5)
        {
            system("cls");cout << "Black win";break;
            }
        else if(w==5)
        {
            system("cls");cout << "White win";break;
            }
        }
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言数组任意位置插入一个元素方法

    C语言数组任意位置插入一个元素方法

    这篇文章主要给大家分享C语言数组任意位置插入一个元素方法,
    2021-11-11
  • rapidjson解析json代码实例以及常见的json core dump问题

    rapidjson解析json代码实例以及常见的json core dump问题

    今天小编就为大家分享一篇关于rapidjson解析json代码实例以及常见的json core dump问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C语言实现简易贪吃蛇游戏的示例代码

    C语言实现简易贪吃蛇游戏的示例代码

    这篇文章主要介绍了如何利用C语言实现一个经典的小游戏——贪吃蛇,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-10-10
  • 如何给随机数加密

    如何给随机数加密

    随机数加密的简单算法,需要的朋友可以参考一下
    2013-03-03
  • C++类中变量也可以是引用的代码实例

    C++类中变量也可以是引用的代码实例

    今天小编就为大家分享一篇关于C++类中变量也可以是引用的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 详解C++编程中的vector类容器用法

    详解C++编程中的vector类容器用法

    vector是一个标准库中的容器,使用时需要包含#include <vector>头文件,也可以说vector是一个类模板而不是一种数据类型,对它的定义,需要指定类型,需要的朋友可以参考下
    2016-05-05
  • C语言驱动开发之通过ReadFile与内核层通信

    C语言驱动开发之通过ReadFile与内核层通信

    驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层。为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,本文先来介绍通过ReadFile系列函数实现的通信模式
    2022-09-09
  • C/C++中的内存管理小结

    C/C++中的内存管理小结

    这篇文章主要介绍了C/C++中的内存管理小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C语言三子棋小游戏的实现

    C语言三子棋小游戏的实现

    这篇文章主要为大家详细介绍了C语言三子棋小游戏的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • boost字符串处理函数format的用法

    boost字符串处理函数format的用法

    这篇文章介绍了boost字符串处理函数format的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论