C++小游戏2048

游戏界面

#include
#include
#include
#include
#include
#include
using namespace std;
int getlim(int a)
{
	int sum=0;
	for(int i=1;;i++)
	{
		if(a!=0)
			sum+=1;
		else
			break;
		a=a/10;
	}
	return sum;
}
int getlim(int a[])
{
	for(int i=0;;i++)
		if(a[i]==-1)
			return i-1;
}

先写出重载的函数,用于计算数的位数和一维数组中有效的数字个数。
再写出函数给出游戏界面,给入参数是4×4数组,然后显示出游戏的界面。

void showx(int b[4][4])
{
	for(int i=0;i<4;i++)
		{for(int j=0;j<4;j++)
			cout<<b[i][j];
	cout<<endl;
	}
}
void show_2()
{
		cout<<"■";
	    for(int i=1;i<=4;i++)
		    cout<<setw(8)<<"■";
	    cout<<endl;
}
void show_1()
{
	for(int i=1;i<=17;i++)
		cout<<"■";
	cout<<endl;
}
void show_4(int a)
{
	int n;
	n=getlim(a);
	switch(n)
	{
	case 1:cout<<"■"<<setw(3)<<a<<setw(3)<<' ';break;
	case 2:cout<<"■"<<setw(4)<<a<<setw(2)<<' ';break;
	case 3:cout<<"■"<<setw(4)<<a<<setw(2)<<' ';break;
	case 4:cout<<"■"<<setw(5)<<a<<' ';break;
	case 0:cout<<"■"<<setw(6)<<' ';
	}
}
void show_3(int a[])
{
	show_4(a[0]);show_4(a[1]);show_4(a[2]);show_4(a[3]);
	cout<<"■"<<endl;
}
void show(int a[4][4])
{
	for(int i=0;i<4;i++)
	{
		int b[4];
		for(int j=0;j<4;j++) b[j]=a[i][j];
		show_1();show_2();show_3(b);show_2();
	}
	show_1();
}

C++小游戏2048_第1张图片
输出界面如图。

查找需要合并的数

写出查找哪些数要合并,将位置存储到4×4数组中。由于有上下左右四种方式,所以我们要写出一个左的情况,再通过矩阵的转置等变换,将上下右三种操作全部转化为左的操作。

void left_right(int a[4][4])
{
	int b[4][4];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			b[i][j]=a[i][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			a[i][3-j]=b[i][j];
}
void left_up(int a[4][4])
{
	int b[4][4];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			b[i][j]=a[i][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			a[i][j]=b[j][i];
}
int check_1(int a[4],int b[4])
{
	int flag=0;
	for(int i=0;i<4;i++) b[i]=0;
	if(a[0]!=0)
	{
		if(a[0]==a[1]&&a[2]==a[3]&&a[2]!=0)
	    {b[0]=1;b[2]=1;flag=1;}
		else if(a[0]==a[1])
		{b[0]=1;flag=1;}
	    else if(a[1]==0&&a[0]==a[2])
		{b[0]=1;flag=1;}
		else if(a[1]==0&&a[2]==0&&a[0]==a[3])
		{b[0]=1;flag=1;}
		else if(a[1]==a[2]&&a[1]!=0)
		{b[1]=1;flag=1;}
		else if(a[1]==a[3]&&a[1]!=0&&a[2]==0)
		{b[1]=1;flag=1;}
		else if(a[2]==a[3]&&a[2]!=0)
		{b[2]=1;flag=1;}
	}
	else
	{
		if(a[1]!=0)
		{
			if(a[1]==a[2])
			{b[1]=1;flag=1;}
			else if(a[1]==a[3]&&a[2]==0)
			{b[1]=1;flag=1;}
			else if(a[2]==a[3]&&a[2]!=0)
			{b[2]=1;flag=1;}
		}
		else
		{
			if(a[2]==a[3]&&a[2]!=0)
			{b[2]=1;flag=1;}
		}
	}
	if(flag==0)
	{
		if(a[0]==0&&(a[1]!=0||a[2]!=0||a[3]!=0))
			flag=1;
		else if(a[1]==0&&(a[2]!=0||a[3]!=0))
			flag=1;
		else if(a[2]==0&&a[3]!=0)
			flag=1;
	}
	return flag;
}
int check_left(int a[4][4],int b[4][4])
{
	int flag[4],flagx=0;
	for(int i=0;i<4;i++)
		flag[i]=check_1(a[i],b[i]);
	for(int i=0;i<4;i++)
		if(flag[i]==1){flagx=1;}
	return flagx;
}
int check_right(int a[4][4],int b[4][4])
{
	left_right(a);
	int flag;
	flag=check_left(a,b);
	left_right(a);
	left_right(b);
	return flag;
}
int check_up(int a[4][4],int b[4][4])
{
	left_up(a);
	int flag;
	flag=check_left(a,b);
	left_up(a);
	left_up(b);
	return flag;
}
int check_down(int a[4][4],int b[4][4])
{
	left_up(a);
	int flag;
	flag=check_right(a,b);
	left_up(a);
	left_up(b);
	return flag;
}

查找结束条件

除了要查找哪些地方需要合并,我们还要知道什么时候没有可以合并的数,并且没有空位置,来判断是否无路可走,由此判断是否游戏结束。

void check_zero(int a[4][4],int x[],int y[])
{
	int sum=0;
	for(int i=0;i<16;i++)
	{x[i]=-1;y[i]=-1;}
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			if(a[i][j]==0)
			{x[sum]=i;y[sum]=j;sum++;}
}
int check(int a[4][4],int b[4][4])
{
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			if(a[i][j]==0)
				return 1;
	int flag1,flag2;
	flag1=check_left(a,b);
	flag2=check_up(a,b);
	if(flag1==0&&flag2==0)
		return 0;
	return 1;
}

数字合并

根据我们得到的数组B,我们可以知道数组A中哪些数是可以合并的。下面的函数将完成将中可以合并的数进行合并。

void change_1(int a[4],int b[4])
{
	for(int i=0;i<4;i++)
		if(b[i]==1)
		{
			if(a[i]==a[i+1])
			{a[i]=a[i]*2;a[i+1]=0;}
			else if(a[i]==a[i+2])
			{a[i]=a[i]*2;a[i+2]=0;}
			else if(a[i]==a[i+3])
			{a[i]=a[i]*2;a[i+3]=0;}
		}
}
void change_left(int a[4][4],int b[4][4])
{
	for(int i=0;i<4;i++)
		change_1(a[i],b[i]);
}
void change_right(int a[4][4],int b[4][4])
{
	left_right(a);
	left_right(b);
	change_left(a,b);
	left_right(a);
	left_right(b);
}
void change_up(int a[4][4],int b[4][4])
{
	left_up(a);
	left_up(b);
	change_left(a,b);
	left_up(a);
	left_up(b);
}
void change_down(int a[4][4],int b[4][4])
{
	left_up(a);
	left_up(b);
	change_right(a,b);
	left_up(a);
	left_up(b);
}

数组重排

数字合并以后得到新的数组。根据游戏规则,这些数要向指定方位补空位,需要给出重排数组的函数。

void reshape_1(int a[4])
{
	int b[4],sum=0;
	for(int i=0;i<4;i++)
	{b[i]=a[i];a[i]=0;}
	for(int i=0;i<4;i++)
	{
		if(b[i]!=0)
			a[sum++]=b[i];
	}
}
void reshape_left(int a[4][4])
{
	for(int i=0;i<4;i++)
		reshape_1(a[i]);
}
void reshape_right(int a[4][4])
{
	left_right(a);
	reshape_left(a);
	left_right(a);
}
void reshape_up(int a[4][4])
{
	left_up(a);
	reshape_left(a);
	left_up(a);
}
void reshape_down(int a[4][4])
{
	left_up(a);
	reshape_right(a);
	left_up(a);
}

数组插值

根据游戏规则,在完成一次操作之后,要向空位子中随机插入新的数。我们就假设随机向两个位置中插入2。

void interp(int a[4][4])
{
	int x[16],y[16],t,nan,lim,x1,y1;
	check_zero(a,x,y);
	lim=getlim(x);
	if(lim!=0)
	{
		t=GetTickCount();
		srand(t);
		nan=rand()%lim;
	}
	else
		nan=0;
	x1=x[nan];y1=y[nan];
	a[x1][y1]=2;
}

整合游戏

基本的操作功能都已经实现,我们把操作按顺序放入一个函数movex中,方便主函数调用,我们再写出一个初始化的函数beginx,最后给出主函数即可。

void movex(int a[4][4],int b[4][4],char p)
{
	int flag;
	switch(p)
	{
	case'w':case'W':
		flag=check_up(a,b);
		if(flag)
		{
        change_up(a,b);
	    reshape_up(a);
		interp(a);
		}
		break;
	case's':case'S':
		flag=check_down(a,b);
		if(flag)
		{
	    change_down(a,b);
		reshape_down(a);
		interp(a);
		}
		break;
	case'a':case'A':
		flag=check_left(a,b);
		if(flag)
		{
		change_left(a,b);
	    reshape_left(a);
		interp(a);
		}
		break;
	case'd':case'D':
		flag=check_right(a,b);
		if(flag)
		{
		change_right(a,b);
		reshape_right(a);
		interp(a);
		}
		break;
	}
}
void beginx(int a[4][4])
{
	int t,x1,x2,y1,y2;
	t=GetTickCount();srand(t);x1=rand()%4;y1=rand()%4;
	do
	{x2=rand()%4;y2=rand()%4;}while(x1==x2&&y1==y2);
	a[x1][y1]=2;a[x2][y2]=2;
	show(a);
}
int main()
{
	while(1)
	{
		cout<<"输入w开始游戏,输入s退出游戏,游戏中输入q结束游戏"<<endl;
		char q;
		q=getch();
		if(q=='s'||q=='S')
			break;
		int a[4][4]={0},b[4][4]={0},flag=1;
		system("cls");
		beginx(a);
		while(1)
		{
			char p;
			p=getch();
			movex(a,b,p);
			system("cls");
			show(a);
			flag=check(a,b);
			if(flag==0)
			{
				cout<<"游戏结束"<<endl;
				break;
			}
			if(p=='q')
			{
				cout<<"游戏结束"<<endl;
				break;
			}
		}
	}
	return 0;
}

附整体代码

#include
#include
#include
#include
#include
#include
using namespace std;

void showx(int b[4][4])
{
	for(int i=0;i<4;i++)
		{for(int j=0;j<4;j++)
			cout<<b[i][j];
	cout<<endl;
	}
}
int getlim(int a)
{
	int sum=0;
	for(int i=1;;i++)
	{
		if(a!=0)
			sum+=1;
		else
			break;
		a=a/10;
	}
	return sum;
}
int getlim(int a[])
{
	for(int i=0;;i++)
		if(a[i]==-1)
			return i-1;
}
void show_2()
{
		cout<<"■";
	    for(int i=1;i<=4;i++)
		    cout<<setw(8)<<"■";
	    cout<<endl;
}
void show_1()
{
	for(int i=1;i<=17;i++)
		cout<<"■";
	cout<<endl;
}
void show_4(int a)
{
	int n;
	n=getlim(a);
	switch(n)
	{
	case 1:cout<<"■"<<setw(3)<<a<<setw(3)<<' ';break;
	case 2:cout<<"■"<<setw(4)<<a<<setw(2)<<' ';break;
	case 3:cout<<"■"<<setw(4)<<a<<setw(2)<<' ';break;
	case 4:cout<<"■"<<setw(5)<<a<<' ';break;
	case 0:cout<<"■"<<setw(6)<<' ';
	}
}
void show_3(int a[])
{
	show_4(a[0]);show_4(a[1]);show_4(a[2]);show_4(a[3]);
	cout<<"■"<<endl;
}
void show(int a[4][4])
{
	for(int i=0;i<4;i++)
	{
		int b[4];
		for(int j=0;j<4;j++) b[j]=a[i][j];
		show_1();show_2();show_3(b);show_2();
	}
	show_1();
}
void left_right(int a[4][4])
{
	int b[4][4];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			b[i][j]=a[i][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			a[i][3-j]=b[i][j];
}
void left_up(int a[4][4])
{
	int b[4][4];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			b[i][j]=a[i][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			a[i][j]=b[j][i];
}
int check_1(int a[4],int b[4])
{
	int flag=0;
	for(int i=0;i<4;i++) b[i]=0;
	if(a[0]!=0)
	{
		if(a[0]==a[1]&&a[2]==a[3]&&a[2]!=0)
	    {b[0]=1;b[2]=1;flag=1;}
		else if(a[0]==a[1])
		{b[0]=1;flag=1;}
	    else if(a[1]==0&&a[0]==a[2])
		{b[0]=1;flag=1;}
		else if(a[1]==0&&a[2]==0&&a[0]==a[3])
		{b[0]=1;flag=1;}
		else if(a[1]==a[2]&&a[1]!=0)
		{b[1]=1;flag=1;}
		else if(a[1]==a[3]&&a[1]!=0&&a[2]==0)
		{b[1]=1;flag=1;}
		else if(a[2]==a[3]&&a[2]!=0)
		{b[2]=1;flag=1;}
	}
	else
	{
		if(a[1]!=0)
		{
			if(a[1]==a[2])
			{b[1]=1;flag=1;}
			else if(a[1]==a[3]&&a[2]==0)
			{b[1]=1;flag=1;}
			else if(a[2]==a[3]&&a[2]!=0)
			{b[2]=1;flag=1;}
		}
		else
		{
			if(a[2]==a[3]&&a[2]!=0)
			{b[2]=1;flag=1;}
		}
	}
	if(flag==0)
	{
		if(a[0]==0&&(a[1]!=0||a[2]!=0||a[3]!=0))
			flag=1;
		else if(a[1]==0&&(a[2]!=0||a[3]!=0))
			flag=1;
		else if(a[2]==0&&a[3]!=0)
			flag=1;
	}
	return flag;
}
int check_left(int a[4][4],int b[4][4])
{
	int flag[4],flagx=0;
	for(int i=0;i<4;i++)
		flag[i]=check_1(a[i],b[i]);
	for(int i=0;i<4;i++)
		if(flag[i]==1){flagx=1;}
	return flagx;
}
int check_right(int a[4][4],int b[4][4])
{
	left_right(a);
	int flag;
	flag=check_left(a,b);
	left_right(a);
	left_right(b);
	return flag;
}
int check_up(int a[4][4],int b[4][4])
{
	left_up(a);
	int flag;
	flag=check_left(a,b);
	left_up(a);
	left_up(b);
	return flag;
}
int check_down(int a[4][4],int b[4][4])
{
	left_up(a);
	int flag;
	flag=check_right(a,b);
	left_up(a);
	left_up(b);
	return flag;
}
void check_zero(int a[4][4],int x[],int y[])
{
	int sum=0;
	for(int i=0;i<16;i++)
	{x[i]=-1;y[i]=-1;}
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			if(a[i][j]==0)
			{x[sum]=i;y[sum]=j;sum++;}
}
int check(int a[4][4],int b[4][4])
{
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			if(a[i][j]==0)
				return 1;
	int flag1,flag2;
	flag1=check_left(a,b);
	flag2=check_up(a,b);
	if(flag1==0&&flag2==0)
		return 0;
	return 1;
}
void change_1(int a[4],int b[4])
{
	for(int i=0;i<4;i++)
		if(b[i]==1)
		{
			if(a[i]==a[i+1])
			{a[i]=a[i]*2;a[i+1]=0;}
			else if(a[i]==a[i+2])
			{a[i]=a[i]*2;a[i+2]=0;}
			else if(a[i]==a[i+3])
			{a[i]=a[i]*2;a[i+3]=0;}
		}
}
void change_left(int a[4][4],int b[4][4])
{
	for(int i=0;i<4;i++)
		change_1(a[i],b[i]);
}
void change_right(int a[4][4],int b[4][4])
{
	left_right(a);
	left_right(b);
	change_left(a,b);
	left_right(a);
	left_right(b);
}
void change_up(int a[4][4],int b[4][4])
{
	left_up(a);
	left_up(b);
	change_left(a,b);
	left_up(a);
	left_up(b);
}
void change_down(int a[4][4],int b[4][4])
{
	left_up(a);
	left_up(b);
	change_right(a,b);
	left_up(a);
	left_up(b);
}
void reshape_1(int a[4])
{
	int b[4],sum=0;
	for(int i=0;i<4;i++)
	{b[i]=a[i];a[i]=0;}
	for(int i=0;i<4;i++)
	{
		if(b[i]!=0)
			a[sum++]=b[i];
	}
}
void reshape_left(int a[4][4])
{
	for(int i=0;i<4;i++)
		reshape_1(a[i]);
}
void reshape_right(int a[4][4])
{
	left_right(a);
	reshape_left(a);
	left_right(a);
}
void reshape_up(int a[4][4])
{
	left_up(a);
	reshape_left(a);
	left_up(a);
}
void reshape_down(int a[4][4])
{
	left_up(a);
	reshape_right(a);
	left_up(a);
}
void interp(int a[4][4])
{
	int x[16],y[16],t,nan,lim,x1,y1;
	check_zero(a,x,y);
	lim=getlim(x);
	if(lim!=0)
	{
		t=GetTickCount();
		srand(t);
		nan=rand()%lim;
	}
	else
		nan=0;
	x1=x[nan];y1=y[nan];
	a[x1][y1]=2;
}
void movex(int a[4][4],int b[4][4],char p)
{
	int flag;
	switch(p)
	{
	case'w':case'W':
		flag=check_up(a,b);
		if(flag)
		{
        change_up(a,b);
	    reshape_up(a);
		interp(a);
		}
		break;
	case's':case'S':
		flag=check_down(a,b);
		if(flag)
		{
	    change_down(a,b);
		reshape_down(a);
		interp(a);
		}
		break;
	case'a':case'A':
		flag=check_left(a,b);
		if(flag)
		{
		change_left(a,b);
	    reshape_left(a);
		interp(a);
		}
		break;
	case'd':case'D':
		flag=check_right(a,b);
		if(flag)
		{
		change_right(a,b);
		reshape_right(a);
		interp(a);
		}
		break;
	}
}
void beginx(int a[4][4])
{
	int t,x1,x2,y1,y2;
	t=GetTickCount();srand(t);x1=rand()%4;y1=rand()%4;
	do
	{x2=rand()%4;y2=rand()%4;}while(x1==x2&&y1==y2);
	a[x1][y1]=2;a[x2][y2]=2;
	show(a);
}
int main()
{
	while(1)
	{
		cout<<"输入w开始游戏,输入s退出游戏,游戏中输入q结束游戏"<<endl;
		char q;
		q=getch();
		if(q=='s'||q=='S')
			break;
		int a[4][4]={0},b[4][4]={0},flag=1;
		system("cls");
		beginx(a);
		while(1)
		{
			char p;
			p=getch();
			movex(a,b,p);
			system("cls");
			show(a);
			flag=check(a,b);
			if(flag==0)
			{
				cout<<"游戏结束"<<endl;
				break;
			}
			if(p=='q')
			{
				cout<<"游戏结束"<<endl;
				break;
			}
		}
	}
	return 0;
}

你可能感兴趣的:(C++)