C++实现图形界面双人五子棋游戏

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

本文实例为大家分享了C++实现图形界面双人五子棋游戏的具体代码,供大家参考,具体内容如下

设计思路

定义一个Chess类,用16*16的二维数组的来表示一方棋手在棋局上的落子状态。
通过控制键盘←↑→↓来选择落点,getch()函数可获得用户的键盘输入,用coord控制台屏幕上的坐标。
胜利条件:Chess类的成员函数win(),每落一个棋子进行win()的判断,当横向、竖向或斜向存在同一颜色的连续五个棋子时,win()返回值1。

代码如下

#include <windows.h>  
#include <iostream>  
#include<conio.h>
#include<cstring>
using namespace std;  
COORD c;
class Chess
{/*一方棋局*/
private:
    int p[15][15];    /*落子情况*/
public:
    void newchess()
    {/*空棋盘*/
        for(int i=0;i<16;i++)
            for(int j=0;j<16;j++)
                p[i][j]=0;
    }
    int win()
    {/*判断胜利*/
        int i,j,f;
        for(i=0;i<16;i++)
        {/*横向*/
            j=f=0;
            while(f<5&&j<16)
            {
                if(p[i][j]) f++;
                else f=0;
                j++;
            }
            if(f==5) return 1;
        }
        for(j=0;j<16;j++)
        {/*竖向*/
            i=f=0;
            while(f<5&&i<16)
            {
                if(p[i][j]) f++;
                else f=0;
                i++;
            }
            if(f==5) return 1;
        }
        for(i=0;i<12;i++)
        {/*下斜*/
            j=f=0;
            while(f<5&&j<12)
            {
                if(p[i+f][j+f]) f++;
                else {f=0;j++;}
            }
            if(f==5) return 1;
        }
        for(i=4;i<16;i++)
        {/*上斜*/
            j=f=0;
            while(f<5&&j<12)
            {
                if(p[i-f][j+f]) f++;
                else {f=0;j++;}
            }
            if(f==5) return 1;
        }
        return 0;
    }
    void go(int x,int y)
    {/*落子*/
        p[y][x]=1;
    }
    friend int gochess(int);
}A,B;/**/
void gotoxy(int x, int y) 
{/*指定移动光标*/
    COORD coord; 
    coord.X=x; 
    coord.Y=y; 
    SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coord); 
}
void chessboard()
{/*画棋盘格*/
    gotoxy(0,0);
    cout<<"┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓\n";
    for(int i=0;i<13;i++)
    {
        cout<<"┃   │   │   │   │   │   │   │   │   │   │   │   │   │   ┃\n";
        cout<<"┠───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┨\n";
    }
    cout<<"┃   │   │   │   │   │   │   │   │   │   │   │   │   │   ┃\n";
    cout<<"┗━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┛\n";
}

void put(int n)
{
    if(n==1)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
        cout<<"●\b";
    }
    else 
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
        cout<<"◆\b";
    }
}
int gochess(int n)
{/*下棋(移动+确认)*/
    int i,k,w;
    while(k=_getch())
    {
        switch(k)
        {
        case 13:/*按回车键下子*/
            if(n==1) 
            {
                put(n);
                A.p[c.X/4][c.Y/2]=1;
                return 1;
            }
            else 
            {
                put(n);
                B.p[c.X/4][c.Y/2]=1;
                return 1;
            }
        case 224:
            w=_getch();
            switch(w)
            {/*上下左右移动*/
            case 72: 
                for(i=1;c.Y-2*i>=0;i++)
                    if(!A.p[c.X/4][(c.Y-2*i)/2]&&!B.p[c.X/4][(c.Y-2*i)/2])
                        {c.Y-=2*i;break;}
                break;
            case 80:
                for(i=1;c.Y+2*i<=28;i++)
                    if(!A.p[c.X/4][(c.Y+2*i)/2]&&!B.p[c.X/4][(c.Y+2*i)/2])
                        {c.Y+=2*i;break;}
                break;
            case 75:
                for(i=1;c.X-4*i>=0;i++)
                    if(!A.p[(c.X-4*i)/4][c.Y/2]&&!B.p[(c.X-4*i)/4][c.Y/2])
                        {c.X-=4*i;break;}
                break;
            case 77:
                for(i=1;c.X+4*i<=56;i++)
                    if(!A.p[(c.X+4*i)/4][c.Y/2]&&!B.p[(c.X+4*i)/4][c.Y/2])
                        {c.X+=4*i;break;}
                break;
            }
            gotoxy(c.X,c.Y);
        }
    }
}
int game()
{/*游戏开始*/
    chessboard();                 //画棋盘

    A.newchess();B.newchess();    //定义Chess对象A、B
    c.X=28;c.Y=14;
    gotoxy(c.X,c.Y);              //光标居中
    while(1)
    {
        gochess(1);
        if(A.win()) 
            return 1;
        gochess(2);
        if(B.win()) 
            return 2;
    }
}
int main()  
{  
    gotoxy(70,5);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
    cout<<"五子棋游戏";
    gotoxy(60,9);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
    cout<<"操作说明:";
    gotoxy(60,11);
    cout<<"选择落点:←↑→↓";
    gotoxy(60,12);
    cout<<"落子:回车键(←┘)";
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
    int f;
    while(f=game())
    {
        gotoxy(60,16);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
        if(f==1)
        {
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
            cout<<"红方胜!!";
        }
        else 
        {
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
            cout<<"蓝方胜!!";
        }

        gotoxy(60,18);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
        cout<<"按任意键开始新游戏";
        f=_getch();
        cout<<"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b                     ";
        gotoxy(60,16);
        cout<<"\b\b\b\b\b\b\b\b\b                     ";
    }
}  

运行结果

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

相关文章

  • C语言的常量,字符串,转义字符,注释你都了解吗

    C语言的常量,字符串,转义字符,注释你都了解吗

    这篇文章主要为大家详细介绍了C语言的常量,字符串,转义字符,注释,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言 详细分析结构体的内存对齐

    C语言 详细分析结构体的内存对齐

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-03-03
  • C++ opencv实现的把蓝底照片转化为白底照片功能完整示例

    C++ opencv实现的把蓝底照片转化为白底照片功能完整示例

    这篇文章主要介绍了C++ opencv实现的把蓝底照片转化为白底照片功能,结合完整实例形式详细分析了C++使用opencv模块进行图片转换操作的相关实现技巧,需要的朋友可以参考下
    2019-12-12
  • C++ 二维数组传参的四种方式

    C++ 二维数组传参的四种方式

    C++的二维数组里面,通过用数组名传参,传过去后数组名会退化成一个一维数组指针,所以C++的函数参数不能像C语言一样去写,本文主要介绍了C++ 二维数组传参的四种方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • 用C# 实现鼠标框选效果的实现代码

    用C# 实现鼠标框选效果的实现代码

    本篇文章是对用C#实现鼠标框选效果的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 用C语言实现三子棋

    用C语言实现三子棋

    这篇文章主要为大家详细介绍了用C语言实现三子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 深入探讨C语言中局部变量与全局变量在内存中的存放位置

    深入探讨C语言中局部变量与全局变量在内存中的存放位置

    本篇文章是对在C语言中局部变量与全局变量在内存中的存放位置进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 聊聊C语言中sizeof运算符的一个陷阱

    聊聊C语言中sizeof运算符的一个陷阱

    在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符,下面这篇文章主要给大家介绍了关于C语言中sizeof运算符的一个陷阱的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • C语言实现翻译功能

    C语言实现翻译功能

    这篇文章主要为大家详细介绍了C语言实现简单的翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 基于一个简单定长内存池的实现方法详解

    基于一个简单定长内存池的实现方法详解

    本篇文章对一个简单定长内存池的实现方法进行了详细的分析介绍。需要的朋友参考下
    2013-05-05

最新评论