#include
#include
#include
int magic;
int block[4][4]={0};
char dir; //移动方向
int k=0; //可能位置计数器
int x; //随机数在可能位置中选取一个位置
void print();
void appear();
void move();
int main()
{
int i,j;
int count=16; //记录当前为0的个数
srand(time(NULL));
i=rand()%4;
j=rand()%4;
block[i][j]=2;
print();
for(;count!=0;)
{
move();
print();
}
printf("game over");
return 0;
}
void appear()
{
int i,j; //a为坐标
for(;magic=3;)
magic=rand()%5+2;
int a[15]={0};
int b[15]={0};
switch(dir)
{
case 'w':
{
k=0;
for(j=0;j<=3;j++)
{
for(i=0;i<=3;i++)
{
if(block[i][j]=0) //如果当前位置为0,分别记录下横纵坐标
{
a[k]=i;
b[k]=j;
k++;
}
}
}
x=rand()%k+1; //随机数为1到k
block[a[x]][b[x]]=magic; //可能位置赋值
}
case 'a':
{
k=0;
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
{
if(block[i][j]=0)
{
a[k]=i;
b[k]=j;
k++;
}
}
}
x=rand()%k+1; //随机数为1到k
block[a[x]][b[x]]=magic; //可能位置赋值
}
case 's':
{
k=0;
for(j=0;j<=3;j++)
{
for(i=0;i<=3;i++)
{
if(block[i][j]=0)
{
a[k]=i;
b[k]=j;
k++;
}
}
}
x=rand()%k+1; //随机数为1到k
block[a[x]][b[x]]=magic; //可能位置赋值
}
case 'd':
{
k=0;
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
{
if(block[i][j]=0)
{
a[k]=i;
b[k]=j;
k++;
}
}
}
x=rand()%k+1; //随机数为1到k
block[a[x]][b[x]]=magic; //可能位置赋值
}
}
}
void print()
{
int i,j; //i行 j列
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
{
printf("%d",block[i][j]);
printf("\t");
if(j==3)
printf("\n");
}
}
}
void move()
{
int i=0,j=0,k;
scanf("%c",dir);
getchar();
switch(dir)
{
case 'w':
{
for(i=0;i
{
for(j=0;j
{
if(block[i][j]!=0) //消除移动后i行可以叠加的数字
{
k=j;
for(;block[i][k]==0&&k
block[i][j]=block[i][k];
block[i][k]=0;
}
if(block[i][j+1]==block[i][j])
{
block[i][j]=2*block[i][j];
block[i][j+1]=0;
}
}
}
appear();
}
case 'a':
{
for(j=0;j
{
for(i=0;i
{
if(block[i][j]!=0)
{
k=i;
for(;block[i][k]==0&&k
block[i][j]=block[k][j];
block[k][j]=0;
}
if(block[i][j]==block[i+1][j])
{
block[i][j]=2*block[i][j];
block[i+1][j]=0;
}
}
}
appear();
}
case 's':
{
for(i=3;i>0;i--)
{
for(j=3;j>0;j--)
{
if(block[i][j]!=0)
{
k=j;
for(;block[i][k]==0&&k>0;k--)
block[i][j]=block[i][k];
block[i][k]=0;
}
}
if(block[i][j]==block[i][j-1])
{
block[i][j]=2*block[i][j];
block[i][j-1]=0;
}
}
appear();
}
case 'd':
{
for(j=3;j>0;j--)
{
for(i=0;i
{
if(block[i][j]!=0)
{
k=i;
for(;block[i][k]==0&&k>0;k--)
block[i][j]=block[k][j];
block[k][j]=0;
}
if(block[i][j]==block[i-1][j])
{
block[i][j]=2*block[i][j];
block[i-1][j]=0;
}
}
}
appear();
}
}
}