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

 

运行结果
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值