15拼图程序,左上方向下命令

时间:2017-12-05 03:03:10

标签: c

{{1}}

我无法将光标向右或向下移动?我可以左右上升,但不是其他两个。我不是在找人回答整个程序,只是我被困在这几个小时,而我看到的每一个其他代码都与我的相似。I can get it to correctly do up and left but right and down cause a problem and not sure why.

1 个答案:

答案 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!");
                }
            }

        }
    }
    ...

如果breakdown,您可以检查是否有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()逻辑并使用它。而且,瓷砖的移动也可以通过另一种功能来完成。

Tricky downlogic(Edit-1)。

在downlogic的情况下,简单的分解循环不会起作用,因为如果你这样做,将有可能在下一次迭代中它将再次获得-1并尝试将其与下一个数字交换。