{{1}}
我无法将光标向右或向下移动?我可以左右上升,但不是其他两个。我不是在找人回答整个程序,只是我被困在这几个小时,而我看到的每一个其他代码都与我的相似。I can get it to correctly do up and left but right and down cause a problem and not sure why.
答案 0 :(得分:0)
错误是检查逻辑错误,你所遵循的错误做法是大量重复的代码。
我把代码简化为简单的东西。
...
else if (strcmp("down", move) == 0 || strcmp("Down", move) == 0 || strcmp("DOWN", move) == 0){
int d = 0;
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
if (disp[i][j] == -1)
if (i+1 < 4){ // <--- notice the change
int temp = disp[i][j];
disp[i][j] = disp[i + 1][j];
disp[i + 1][j] = temp;
d = 1;
break; // <-- and this
}
else {
printf("%s","Invalid move!");
}
}
if( d == 1)
break;
}
}
else if (strcmp("right", move) == 0 || strcmp("Right", move) == 0 || strcmp("RIGHT", move) == 0){
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
if (disp[i][j] == -1)
if ( j+1 < 4){ // <--- notice the change
int temp = disp[i][j];
disp[i][j] = disp[i][j + 1];
disp[i][j + 1] = temp;
break; // <-- and this
}
else {
printf("%s","Invalid move!");
}
}
}
}
...
如果break
和down
,您可以检查是否有right
声明。原因是,当您向右或向下交换-1
时,您将在循环迭代中再次见面。
因此,如果没有break
,结果将是
_ 1 2 3
4 5 6 7
8 9 1 2
3 4 5 6
>>> right
1 2 3 _
4 5 6 7
8 9 1 2
3 4 5 6
另一件事是不要重复代码。当你这样做时,可读性会更差。维护代码更加困难。更好的是,您可以编写swap()
逻辑并使用它。而且,瓷砖的移动也可以通过另一种功能来完成。
在downlogic的情况下,简单的分解循环不会起作用,因为如果你这样做,将有可能在下一次迭代中它将再次获得-1
并尝试将其与下一个数字交换。