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                     ";
    }
}  

运行结果

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

相关文章

  • MFC控件之CListCtrl的应用实例教程

    MFC控件之CListCtrl的应用实例教程

    这篇文章主要介绍了MFC控件中CListCtrl的应用方法,包括了针对表格的一些操作,是MFC中比较重要的一个控件类,需要的朋友可以参考下
    2014-08-08
  • C++获取硬件参数的示例详解

    C++获取硬件参数的示例详解

    这篇文章主要为大家详细介绍了如何使用C++获取硬件参数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • Dashboard Interface 应用实现操作

    Dashboard Interface 应用实现操作

    Dashboard Server Remote Control Interface是一个关键的功能,它为用户提供了通过TCP/IP协议远程控制机器人的能力,执行包括开关机、加载程序、检查机器人状态以及设置机器人操作模式等多种操作,本文介绍Dashboard Interface 应用操作,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • c语言单链表尾添加的深入讲解

    c语言单链表尾添加的深入讲解

    这篇文章主要给大家介绍了关于c语言单项链表尾添加的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解C++之C++11的牛逼特性

    详解C++之C++11的牛逼特性

    这篇文章主要介绍了C++之C++11的牛逼特性,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • c++栈内存和堆内存的基本使用小结

    c++栈内存和堆内存的基本使用小结

    本文主要介绍了c++栈内存和堆内存的基本使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • C语言实现简单推箱子小游戏

    C语言实现简单推箱子小游戏

    这篇文章主要为大家详细介绍了C语言实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • C语言水仙花数的实现

    C语言水仙花数的实现

    这篇文章主要介绍了C语言水仙花数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C语言中字符串的内存地址操作的相关函数简介

    C语言中字符串的内存地址操作的相关函数简介

    这篇文章主要介绍了C语言中字符串的内存地址操作的相关函数,包括bcopy()函数和bzero()函数以及bcmp()函数,需要的朋友可以参考下
    2015-08-08
  • C与C++动态分配二维数组的实现方法

    C与C++动态分配二维数组的实现方法

    下面小编就为大家带来一篇C与C++动态分配二维数组的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论