C++版2048(控制台)

/*游戏2048
  通过上,下,左,右,四个不同的操作键对屏幕上的数字进行操作。
  按上可以将元素都移到上面,并对通过一列相邻且相同的数字进行求和,并
  输出。下,左,右的操作类似。
  每次操作屏幕上多一个数,直到屏幕填满且无相邻的相同数字,游戏结束。
  输出分数*/
#include <iostream>
#include <conio.h>
using namespace std;
bool isfull(int photo[4][4])
{
	int line,low,k=0;
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			if(photo[line][low]!=0)
				k++;
	if(k==16)		
		return false;
	else
		return true;
}

bool full(int photo[4][4])
{
	int line,low,k=0;
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
		{
			if((photo[line][low]!=photo[line][low+1])&&(photo[line][low]!=photo[line][low-1])&&(photo[line][low]!=photo[line+1][low])
				&&(photo[line][low]!=photo[line-1][low])&&(photo[line][low]!=0))
				k++;
		}
	if(k==16)
		return false;
	else
		return true;
}

bool success(int photo[4][4])
{
	int line,low,k=0;
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			if(photo[line][low]==2048)
				k=1;
	if(k==1)
		return true;
	else 
		return false;
}

void left(int photo[4][4])
{
	int line,low,k;
	int p[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	int q[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	for(line=0;line<4;line++)//左移,且将值给p
		for(low=0,k=0;low<4;low++)
		{
			if(photo[line][low]!=0)
			{
				p[line][k]=photo[line][low];
				k++;
			}
		}
	for(line=0;line<4;line++)//将结果再给photo
		for(low=0;low<4;low++)
			photo[line][low]=p[line][low];
	for(line=0;line<4;line++)//相同值做加法
		for(low=0;low<4;low++)
		{
			if(photo[line][low]==photo[line][low+1])
			{
				photo[line][low]=photo[line][low]+photo[line][low+1];
				photo[line][low+1]=0;
			}
		}
	for(line=0;line<4;line++)//再次左移
		for(low=0,k=0;low<4;low++)
		{
			if(photo[line][low]!=0)
			{
				q[line][k]=photo[line][low];
				k++;
			}
		}
	for(line=0;line<4;line++)//最后结果赋值
		for(low=0;low<4;low++)
			photo[line][low]=q[line][low];

}

void up(int photo[4][4])
{
	int line,low,k;
	int p[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	int q[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	for(low=0;low<4;low++)
		for(line=0,k=0;line<4;line++)
		{
			if(photo[line][low]!=0)
			{
				p[k][low]=photo[line][low];
				k++;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=p[line][low];

	for(low=0;low<4;low++)
		for(line=0;line<4;line++)
		{
			if(photo[line][low]==photo[line+1][low])
			{
				photo[line][low]=photo[line][low]+photo[line+1][low];
				photo[line+1][low]=0;
			}
		}
	for(low=0;low<4;low++)
		for(line=0,k=0;line<4;line++)
		{
			if(photo[line][low]!=0)
			{
				q[k][low]=photo[line][low];
				k++;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=q[line][low];


}

void right(int photo[4][4])
{
	int line,low,k;
	int p[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	int q[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	for(line=0;line<4;line++)
		for(low=3,k=3;low>=0;low--)
		{
			if(photo[line][low]!=0)
			{
				p[line][k]=photo[line][low];
				k--;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=p[line][low];
	for(line=0;line<4;line++)
		for(low=3;low>=0;low--)
		{
			if(photo[line][low]==photo[line][low-1])
			{
				photo[line][low]=photo[line][low]+photo[line][low-1];
				photo[line][low-1]=0;
			}
		}
	for(line=0;line<4;line++)
		for(low=3,k=3;low>=0;low--)
		{
			if(photo[line][low]!=0)
			{
				q[line][k]=photo[line][low];
				k--;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=q[line][low];
}

void down(int photo[4][4])
{
	int line,low,k;
	int p[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	int q[4][4]={0,0,0,0,
		         0,0,0,0,
				 0,0,0,0,
				 0,0,0,0};
	for(low=0;low<4;low++)
		for(line=3,k=3;line>=0;line--)
		{
			if(photo[line][low]!=0)
			{
				p[k][low]=photo[line][low];
				k--;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=p[line][low];	
	for(low=0;low<4;low++)
		for(line=3;line>=0;line--)
		{
			if(photo[line][low]==photo[line-1][low])
			{
				photo[line][low]=photo[line][low]+photo[line-1][low];
				photo[line-1][low]=0;
			}
		}
	for(low=0;low<4;low++)
		for(line=3,k=3;line>=0;line--)
		{
			if(photo[line][low]!=0)
			{
				q[k][low]=photo[line][low];
				k--;
			}
		}
	for(line=0;line<4;line++)
		for(low=0;low<4;low++)
			photo[line][low]=q[line][low];	
}

void add(int photo[4][4])
{
	int i,j,k=0;
	for(j=0;j<4;j++)
	{
		for(i=0;i<4;i++)
			if(photo[j][i]==0)
			{
				photo[j][i]=2;
				k=1;
			    break;
			}
		if(k==1)
			break;
	}
}

void out(int photo[4][4])
{
	int i,j;
	for(j=0;j<4;j++)
	{
		cout<<endl<<"\t\t\t";
		for(i=0;i<4;i++)
		{
			if(photo[j][i]>=0&&photo[j][i]<10)
			    cout<<photo[j][i]<<"    ";
			else if(photo[j][i]>10&&photo[j][i]<99)
				cout<<photo[j][i]<<"   ";
			else if(photo[j][i]>100&&photo[j][i]<999)
				cout<<photo[j][i]<<"  ";
			else
				cout<<photo[j][i]<<" ";
		}		
	}
}

void main()
{
	int photo[4][4]={0,0,0,0,
				     0,0,0,0,
					 0,0,0,0,
					 0,0,0,0};
	int num=0;
	char op;
	cout<<"\t\t\t  欢迎来到2048"<<endl;
	out(photo);
	cout<<endl<<"任意点击开始"<<endl;
	getch();
	system("cls");
	add(photo);
	add(photo);
	out(photo);
	do
	{
		cout<<endl<<"请输入你的操作:";
		cout<<"向上选8或w,向下选2或s,向左选4或a,向右选6或d"<<endl;
		cin>>op;
		system("cls");
		switch(op)
		{
		case 'w':
		case '8':up(photo);
			break;
		case 's':
		case '2':down(photo);
			break;
		case 'a':
		case '4':left(photo);
			break;
		case 'd':
		case '6':right(photo);
			break;
		default :cout<<"输入错误。"<<endl;
		}
		if(isfull(photo))
           add(photo);
		out(photo);
		num++;
	}while(full(photo)&&!success(photo));
	if(success(photo))
	{
		cout<<endl<<"你赢了!!!"<<endl;
		cout<<"最后得分"<<num<<endl;
	}
	else
	{
		cout<<endl<<"游戏结束!!!"<<endl;
		cout<<"最后得分"<<num<<endl;
	}
}


    


个人原创,转载注明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值