2048

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[5][5]; 
int read()
{
	int sum,k=1;char s;
	while(s=getchar(),s<'0'||s>'9') if(s=='-') k=-1;sum=s-'0';
	while(s=getchar(),s>='0'&&s<='9') sum=sum*10+s-'0';
	return k*sum;
}
void add()
{
	int val=rand()%2?2:4;
	vector<int>v[2];
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			if(a[i][j]==0)
			{
				v[0].push_back(i);
				v[1].push_back(j);
			}
		}
	}
	int pos=rand()%(int)v[0].size();
	a[v[0][pos]][v[1][pos]]=val;
}
void out()
{
	system("cls");
	int S=0;
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=20;j++) cout<<"-";cout<<endl;
		for(int j=1;j<=4;j++)
		{
			if(!a[i][j]) 
			{
				cout<<"|    ";
				continue;
			}
			cout<<'|'<<a[i][j];
			if(a[i][j]<1000) cout<<' ';
			if(a[i][j]<100) cout<<' ';
			if(a[i][j]<10) cout<<' ';
			S=max(S,a[i][j]);
		}
		cout<<"|"<<endl;
	}
	cout<<"_______________________"<<endl;
	if(S==2048)
	{
		cout<<"Good Job !!!"<<endl;
		cout<<"按任意键结束"<<endl; 
		char s=getchar();
		exit(0);
	}
}
bool check1()
{
	for(int i=1;i<=4;i++)
	{
		for(int j=2;j<=4;j++)
		{
			if(a[i][j]&&a[i][j-1]==0) return true;
			if(a[i][j]&&a[i][j-1]==a[i][j]) return true;
		}
	}
	return false;
}
bool check2()
{
	for(int i=1;i<=4;i++)
	{
		for(int j=3;j>=1;j--)
		{
			if(a[j][i]&&a[j+1][i]==0) return true;
			if(a[j][i]&&a[j+1][i]==a[j][i]) return true;
		}
	}
	return false;
}
bool check3()
{
	for(int i=1;i<=4;i++)
	{
		for(int j=2;j<=4;j++)
		{
			if(a[j][i]&&a[j-1][i]==0) return true;
			if(a[j][i]&&a[j-1][i]==a[j][i]) return true;
		}
	}
	return false;
}
bool check4()
{
	for(int i=1;i<=4;i++)
	{
		for(int j=3;j>=1;j--)
		{
			if(a[i][j]&&a[i][j+1]==0) return true;
			if(a[i][j]&&a[i][j+1]==a[i][j]) return true;
		}
	}
	return false;
}
void work1()
{
	for(int i=1;i<=4;i++)
	{
		vector<int>v;
		for(int j=1;j<=4;j++)
		{
			if(a[i][j]) v.push_back(a[i][j]),a[i][j]=0;
		}
		int pos=0;
		for(int j=0;j<v.size();j++)
		{
			if(j!=v.size()-1&&v[j+1]==v[j])
			{
				a[i][++pos]=v[j]<<1;
				j++;
			}
			else a[i][++pos]=v[j];
		}
	}
}
void work2()
{
	for(int i=1;i<=4;i++)
	{
		vector<int>v;
		for(int j=4;j>=1;j--) 
		{
			if(a[j][i]) v.push_back(a[j][i]),a[j][i]=0;
		}
		int pos=5;
		for(int j=0;j<v.size();j++)
		{
			if(j!=v.size()-1&&v[j]==v[j+1]) 
			{
				a[--pos][i]=v[j]<<1;
				j++;
			}
			else a[--pos][i]=v[j];
		}
	}
}
void work3()
{
	for(int i=1;i<=4;i++)
	{
		vector<int>v;
		for(int j=1;j<=4;j++) 
		{
			if(a[j][i]) v.push_back(a[j][i]),a[j][i]=0;
		}
		int pos=0;
		for(int j=0;j<v.size();j++)
		{
			if(j!=v.size()-1&&v[j]==v[j+1]) 
			{
				a[++pos][i]=v[j]<<1;
				j++;
			}
			else a[++pos][i]=v[j];
		}
	}
}
void work4()
{
	for(int i=1;i<=4;i++)
	{
		vector<int>v;
		for(int j=4;j>=1;j--)
		{
			if(a[i][j]) v.push_back(a[i][j]),a[i][j]=0;
		}
		int pos=5;
		for(int j=0;j<v.size();j++)
		{
			if(j!=v.size()-1&&v[j+1]==v[j])
			{
				a[i][--pos]=v[j]<<1;
				j++;
			}
			else a[i][--pos]=v[j];
		}
	}
}
signed main()
{
	//freopen("1.out","w",stdout);
	srand(time(0));
	cout<<"按任意键开始游戏"<<endl;
	cout<<"a代表向左 s向下 d向右 w向上"<<endl;
	cout<<"每次输入完请按Enter"<<endl; 
	char s=getchar();
	add();
	out();
	while(check1()||check2()||check3()||check4())
	{
		char s=getchar();
		if(s=='a')
		{
			if(check1()) work1(),add();
		}
		if(s=='s')
		{
			if(check2()) work2(),add();
		}
		if(s=='w')
		{
			if(check3()) work3(),add();
		}
		if(s=='d')
		{
			if(check4()) work4(),add();
		}
		out();
	}
	cout<<"Game Over !!!"<<endl;
	return 0;
}

  

posted @ 2021-12-20 16:33  ATHOSD  阅读(74)  评论(3编辑  收藏  举报