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