#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
char c;
int num[6][6],step;
char * d2s(int n)
{
switch(n)
{
case 0:
return " ";
case 2:
return "2";
case 4:
return "4";
case 8:
return "8";
case 16:
return "16";
case 32:
return "32";
case 64:
return "64";
case 128:
return "128";
case 256:
return "256";
case 512:
return "512";
case 1024:
return "1024";
case 2048:
return "2048";
}
}
void Show()
{
printf("\t 请按上下左右键操作\n");
printf("\t 当前已走步数:%d\n",step);
printf ("\t┏━━┳━━┳━━┳━━┓\n");
printf ("\t┃%4s┃%4s┃%4s┃%4s┃\n",d2s(num[1][1]),d2s(num[1][2]),d2s(num[1][3]),d2s(num[1][4]));
printf ("\t┣━━╋━━╋━━╋━━┫\n");
printf ("\t┃%4s┃%4s┃%4s┃%4s┃\n",d2s(num[2][1]),d2s(num[2][2]),d2s(num[2][3]),d2s(num[2][4]));
printf ("\t┣━━╋━━╋━━╋━━┫\n");
printf ("\t┃%4s┃%4s┃%4s┃%4s┃\n",d2s(num[3][1]),d2s(num[3][2]),d2s(num[3][3]),d2s(num[3][4]));
printf ("\t┣━━╋━━╋━━╋━━┫\n");
printf ("\t┃%4s┃%4s┃%4s┃%4s┃\n",d2s(num[4][1]),d2s(num[4][2]),d2s(num[4][3]),d2s(num[4][4]));
printf ("\t┗━━┻━━┻━━┻━━┛\n");
}
int NewNum()
{
int n=((rand()*rand()+rand())%2+1)*2;
// printf("%d\n",n);
int i,j;
if(c=='w'||c==' ')
{
i=4;
while(j=rand()%4+1)
if(num[i][j]==0)
{
num[i][j]=n;
return n;
}
}
else if(c=='s')
{
i=1;
while(j=rand()%4+1)
if(num[i][j]==0)
{
num[i][j]=n;
return n;
}
}
else if(c=='a')
{
j=4;
while(i=rand()%4+1)
if(num[i][j]==0)
{
num[i][j]=n;
return n;
}
}
else if(c=='d')
{
j=1;
while(i=rand()%4+1)
if(num[i][j]==0)
{
num[i][j]=n;
return n;
}
}
return 0;
}
int cal()
{
int i,j,ok=0,k;
if(c=='w')
for(j=1;j<=4;++j)
{
//push
for(i=1;i<4;++i)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i+k][j])
{
ok=1;
num[i][j]=num[i+k][j];
num[i+k][j]=0;
break;
}
if(i+k>4)
break;
}
if(i+k>4)
break;
}
//calculate
for(i=1;i<=3;++i)
{
if(num[i][j]==num[i+1][j]&&num[i][j]!=0)
{
ok=1;
num[i][j]*=2;
num[i+1][j]=0;
}
}
//push
for(i=1;i<4;++i)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i+k][j])
{
ok=1;
num[i][j]=num[i+k][j];
num[i+k][j]=0;
break;
}
if(i+k>4)
break;
}
if(i+k>4)
break;
}
}
if(c=='s')
for(j=1;j<=4;++j)
{
//push
for(i=4;i>0;--i)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i-k][j])
{
ok=1;
num[i][j]=num[i-k][j];
num[i-k][j]=0;
break;
}
if(i-k<0)
break;
}
if(i-k<0)
break;
}
//calculate
for(i=4;i>0;--i)
{
if(num[i][j]==num[i-1][j]&&num[i][j]!=0)
{
ok=1;
num[i][j]*=2;
num[i-1][j]=0;
}
}
//push
for(i=4;i>0;--i)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i-k][j])
{
ok=1;
num[i][j]=num[i-k][j];
num[i-k][j]=0;
break;
}
if(i-k<0)
break;
}
if(i-k<0)
break;
}
}
if(c=='a')
for(i=1;i<=4;++i)
{
//push
for(j=1;j<4;++j)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i][j+k])
{
ok=1;
num[i][j]=num[i][j+k];
num[i][j+k]=0;
break;
}
if(j+k>4)
break;
}
if(j+k>4)
break;
}
//calculate
for(j=1;j<=3;++j)
{
if(num[i][j]==num[i][j+1]&&num[i][j]!=0)
{
ok=1;
num[i][j]*=2;
num[i][j+1]=0;
}
}
//push
for(j=1;j<4;++j)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i][j+k])
{
ok=1;
num[i][j]=num[i][j+k];
num[i][j+k]=0;
break;
}
if(j+k>4)
break;
}
if(j+k>4)
break;
}
}
if(c=='d')
for(i=1;i<=4;++i)
{
//push
for(j=4;j>0;--j)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i][j-k])
{
ok=1;
num[i][j]=num[i][j-k];
num[i][j-k]=0;
break;
}
if(j-k<0)
break;
}
if(j-k<0)
break;
}
//calculate
for(j=4;j>0;--j)
{
if(num[i][j]==num[i][j-1]&&num[i][j]!=0)
{
ok=1;
num[i][j]*=2;
num[i][j-1]=0;
}
}
//push
for(j=4;j>0;--j)
{
k=0;
while(num[i][j]==0)
{
++k;
if(num[i][j-k])
{
ok=1;
num[i][j]=num[i][j-k];
num[i][j-k]=0;
break;
}
if(j-k<0)
break;
}
if(j-k<0)
break;
}
}
return ok;
}
int fail()
{
for(int i=1;i<=4;++i)
{
for(int j=1;j<=4;++j)
{
if(num[i][j]==0)
return 0;
if(num[i][j]==num[i+1][j]||
num[i][j]==num[i-1][j]||
num[i][j]==num[i][j+1]||
num[i][j]==num[i][j-1])
{
return 0;
}
}
}
return 1;
}
int operate(int key)
{
if(key==72)
{
c='w';
if(cal())
{
NewNum();
return 1;
}
}
else if(key==75)
{
c='a';
if(cal())
{
NewNum();
return 1;
}
}
else if(key==77)
{
c='d';
if(cal())
{
NewNum();
return 1;
}
}
else if(key==80)
{
c='s';
if(cal())
{
NewNum();
return 1;
}
}
return 0;
}
int success()
{
for(int i=1;i<=4;++i)
{
for(int j=1;j<=4;++j)
{
if(num[i][j]==2048)
return 1;
}
}
return 0;
}
int main()
{
c=' ';
int key,a=1;
step=0;
a=NewNum();
while(1)
{
Show();
if((key=getch())<0)
{
key=getch();
}
if(fail())
{
printf("GAME OVER!!!\n");
break;
}
if(success())
{
printf("WIN!!!\n");
break;
}
if(operate(key))
{
step++;
}
system("cls");
}
system("pause");
return 0;
}