亲宝软件园·资讯

展开

C++双人五子棋游戏

SUN_NZ 人气:0

设计思路

定义一个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                     ";
    }
}  

运行结果

加载全部内容

相关教程
猜你喜欢
用户评论