2013-11-23 80 views
0

我做了一個非常簡單的labirinth遊戲出來的無聊,但有一個奇怪的錯誤,我不明白爲什麼發生。簡單的控制檯labirinth遊戲:需要幫助找出一個bug

當我嘗試進入障礙時,輸出的第一行發生了變化。另外,根據我嘗試移動的位置,它可以向右移動1個或多個1個字符。這對我來說很奇怪,因爲我的showFrame()函數在輸出之前每次都會清除屏幕。

當您嘗試進入障礙物時,第90行正在運行。如果新位置無效,它將首先恢復位置,然後調用showFrame(),並且showFrame()在輸出前清除控制檯。那麼是什麼導致第一行轉移?爲什麼它會根據按下哪個鍵而有所不同?

代碼如下。如果我理解正確,你需要編譯和運行在Linux上,而不是Windows,因爲ncurses的東西和getchar函數?但我不確定。 (其實不是C程序員)

編譯時加上-lncurses參數。如果你沒有安裝ncurses庫這樣做,它可以在這裏下載: http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.7.tar.gz

#include <stdio.h> 
#include <ncurses.h> 
#include <stdlib.h> 

int positionX = 1, 
    positionY = 19, 
    oldPositionX, 
    oldPositionY, 
    sizeX, 
    sizeY; 
char matrix[20][20] = 
    {'|', ' ', '|', ' ', ' ', ' ', ' ', ' ', '-', '-', '-', '-', '-', ' ', ' ', ' ', ' ', '|', ' ', '|', 
    '|', ' ', '|', ' ', ' ', ' ', '|', '-', '-', ' ', ' ', ' ', '-', '-', '|', ' ', ' ', ' ', ' ', '|', 
    '|', ' ', '-', '-', '-', '-', '-', ' ', ' ', ' ', '|', ' ', ' ', ' ', '|', ' ', '-', '-', ' ', '|', 
    '|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '-', ' ', '|', ' ', ' ', ' ', '|', ' ', ' ', '|', ' ', '|', 
    '-', '-', '-', '|', ' ', '|', ' ', ' ', '|', ' ', '|', ' ', ' ', ' ', '-', '-', ' ', '|', ' ', '|', 
    ' ', ' ', ' ', '|', ' ', '|', ' ', ' ', '|', ' ', '-', '-', '|', ' ', ' ', '|', ' ', '|', ' ', '|', 
    ' ', '|', ' ', '|', ' ', '|', ' ', ' ', '|', ' ', ' ', ' ', '|', ' ', '|', '|', ' ', '|', ' ', '|', 
    ' ', '|', ' ', ' ', ' ', '-', '-', '|', '|', ' ', ' ', ' ', '|', ' ', '|', ' ', ' ', '|', ' ', '|', 
    ' ', '-', '-', '|', ' ', ' ', ' ', '|', ' ', ' ', ' ', ' ', '|', ' ', '|', ' ', '-', '-', '-', '|', 
    ' ', ' ', ' ', '|', ' ', '|', ' ', '|', ' ', '|', '-', '-', '-', ' ', '|', ' ', '|', ' ', ' ', '|', 
    '-', '-', '-', '|', ' ', '|', ' ', '|', ' ', '|', ' ', ' ', ' ', ' ', '|', ' ', '-', '|', ' ', '|', 
    '|', ' ', ' ', ' ', ' ', '|', ' ', ' ', ' ', '|', ' ', ' ', ' ', ' ', '|', ' ', ' ', '|', ' ', '|', 
    '|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|', ' ', '-', '-', '-', '|', ' ', ' ', '|', ' ', '|', 
    '|', ' ', '|', '-', '-', '-', '-', '-', '-', '-', ' ', ' ', ' ', ' ', '|', ' ', '-', '-', ' ', '|', 
    '|', ' ', '|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '-', '-', '-', ' ', ' ', '|', 
    '|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '-', '-', '-', '-', ' ', ' ', ' ', ' ', ' ', ' ', '|', 
    '|', '-', '-', '-', '-', '-', ' ', '|', '-', '-', ' ', ' ', '|', ' ', ' ', ' ', '-', '-', '-', '|', 
    '|', ' ', ' ', ' ', ' ', ' ', ' ', '|', ' ', ' ', '|', ' ', '-', '|', ' ', ' ', ' ', ' ', ' ', '|', 
    '|', ' ', '|', '-', '-', '-', '-', '-', ' ', ' ', '|', ' ', ' ', ' ', ' ', '-', '-', '-', '-', '|', 
    '|', ' ', '|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|', '-', '-', '|', ' ', '|', ' ', ' ', ' ', ' '}; 

void main() { 
    char key; 
    int stty; 

    // Get the size of the matrix 
    sizeX = sizeof(matrix)/sizeof(matrix[0]); 
    sizeY = sizeof(matrix[0]); 

    while(1) { 
     // Output level 
     showFrame(); 

     // Wait for user input to move player position 
     stty = system("stty raw"); 
     key = getchar(); 
     system("stty cooked"); 

     // Store previou position and move player position accordingly 
     oldPositionX = positionX; 
     oldPositionY = positionY; 
     switch(key) { 
     case 'w': positionY--; 
        break; 
     case 'a': positionX--; 
        break; 
     case 's': positionY++; 
        break; 
     case 'd': positionX++; 
        break; 
     default: printf("\bThat's an invalid key, stupid!\nYou're supposed to play with WASD keys.\n"); 
        exit(0); 
     } 

     // Check to see if new position is okay 
     if(positionY >= sizeY || positionY < 0 || positionX >= sizeX || positionX < 0) { 
     revertPosition(); 
     } 

     // Check to see if level cleared! 
     if(positionX == 1 && positionY == 0) { 
     showFrame(); 
     printf("You cleared the level, Sherlock.\nYou must be really proud of yourself\n"); 
     return; 
     } 
    } 
} 

int showFrame() { 
    int i, j; 

    // Output the matrix 
    system("clear"); 
    for(i=0; i<sizeX; i++) { 
     for(j=0; j<sizeY; j++) { 
     // Check if player's position is at the current block 
     if(i == positionY && j == positionX) { 
      // If the players position is in an invalid block, revert his position 
      if(matrix[i][j] != ' ') { 
       revertPosition(); 
       showFrame(); 
       printf("You can't go there, stupid!\n"); 
       return 1; 
      } else { 
       printf("* "); 
      } 
     } else { 
      printf("%c ", matrix[i][j]); 
     } 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

void revertPosition() { 
    positionX = oldPositionX; 
    positionY = oldPositionY; 
} 
+0

更好地問它[代碼審查](http://codereview.stackexchange.com/) – haccks

+0

@haccks我做了,但他們把我引回這裏,因爲一些模糊的原因,我沒有完全明白 – 3Nex

+0

我不'不知道爲什麼。他們總是試圖在SO上推這樣的問題。其實我在Win7上。我無法進一步幫助你。(在虛擬盒子上我安裝了'kali',但有一些問題)。希望有人會回覆。 – haccks

回答

1

似乎有一個問題明確。

要確定問題,您應該開始找出那些移動第一行的字符來自哪裏。添加:

system("clear"); 
    printf('\n'); 
    for(i=0; i<sizeX; i++) { 
     for(j=0; j<sizeY; j++) { 

帶來一點點光。看起來,如果我想上去,那裏的人物和上線的人物一樣,到我的位置。

現在,您需要找出爲什麼這些字符不會被system("clear");刪除,因爲它應該是這樣。經過一些試驗和錯誤之後,我設法發現,如果您在清除之前打印'\ n',它會按照設想運行。

因爲我從來沒有用過ncurses,所以我無法向你解釋爲什麼會發生這種情況。我的想法是,清晰的命令逐行清除終端。並且一行以換行符結束。所以,你需要做的一切就是那些尾隨字符後,追加換行符(我建議你在showFrame函數開始打印出來,避免呈三角情況):

int showFrame() { 
    int i, j; 

    // Output the matrix 
    printf('\n'); 
    system("clear"); 
    for(i=0; i<sizeX; i++) { 
     for(j=0; j<sizeY; j++) { 
     // Check if player's position is at the current block 
     if(i == positionY && j == positionX) { 
      // If the players position is in an invalid block, revert his position 
      if(matrix[i][j] != ' ') { 
       revertPosition(); 
       showFrame(); 
       printf("You can't go there, stupid!\n"); 
       return 1; 
      } else { 
       printf("* "); 
      } 
     } else { 
      printf("%c ", matrix[i][j]); 
     } 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

我希望這是對你有用。另外,讓我對你的代碼做一些評論:

使用全局變量是strongly discouraged。 關於主返回值,我建議您閱讀this。 此外,您西爾前主聲明你的功能:

int showFrame(); 
void revertPosition(); 

之前主要將他們的整個定義。事實上,你的代碼並沒有在我的機器上編譯(gcc 4.8.1)。

+0

當然,非常感謝解決方案和代碼評論,乾杯! – 3Nex