为2048的游戏写一个算法,输入一个元素只能为0,2或4的二维数组和一个操作,字符wsad代替上下左右,时间复杂度越小起好。(不用随机产生2和4)如,
输入:
0 0 2 2
2 0 0 0
0 0 0 0
4 4 2 2
a
输出:
4 0 0 0
2 0 0 0
0 0 0 0
8 4 0 0
下面这段代码如何更改才能实现?
#include
void main()
{
char turn ;
int s[4][4];
int a[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
int i,j;
int q=0;
int e=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",s[i][j]);
}
}
scanf("%c",&turn);
switch(turn)
{
case 'w':
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(s[i][j]==s[i][j+1])
{
a[q][e]=s[i][j]+s[i][j+1];
e++;
j++;
}
else
{
a[i][j]=s[i][j];
}
}
}
break;
}
case 's':
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(s[i][j]==s[i][j+1])
{
e=3;
a[q][e]=s[i][j]+s[i][j+1];
e--;
j++;
}
else
{
a[i][j]=s[i][j];
}
}
}
break;
}
case 'a':
{
for(j=0;j<4;i++)
{
for(i=0;i<4;j++)
{
if(s[i][j]==s[i+1][j])
{
a[q][e]=s[i][j]+s[i+1][j];
q++;
i++;
}
else
{
a[i][j]=s[i][j];
}
}
}
break;
}
case 'd':
{
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
if(s[i][j]==s[i+1][j])
{
q=3;
a[q][e]=s[i][j]+s[i+1][j];
q--;
i++;
}
else
{
a[i][j]=s[i][j];
}
break;
}
}
break;
}
default:
printf("输入无效");
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",a[i][j]);
}
}
}
首先,你的输入数组语句都少了'&',在第14行和倒数第四行,还有就是你这个2048有很大的问题啊,操作都没有循环的,而且没有判断输掉的条件,没有判断可以移动的条件,为什么一开始要输入数组的?结束时也是要输入,是为什么要这么设计呢?我到时有个好的方案,要是不介意时间关系的话,我这个星期天把代码给你看。只要你留个邮箱给我?因为最近事情有点多,只有周末有点空写了。可以的话就回复我咯。
表示强烈关注,持续围观中
首先scanf输入应为scanf("%d ",&s[i][j]);
其次最后的scanf应改为printf函数,
再者输出时应每四个数应换行故:
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%d",a[i][j]);
}
putchar('\n');
}
}
我测试了一下可以通过。
参考代码
https://github.com/707wk/Senior-middle-school/tree/master/2048