2013-11-23 1 views
0

나는 아주 단순한 labirinth 게임을 갑갑 상태에서 풀어 냈습니다. 그러나 왜 그런 일이 일어나는지 알 수없는 이상한 버그가 있습니다.간단한 콘솔 labirinth 게임 : 버그를 찾아내는 데 도움이 필요합니다

장애물로 이동하려고하면 출력물의 첫 번째 행이 바뀝니다. 또한 이동하려는 위치에 따라 오른쪽으로 1 자 또는 1자를 넘길 수 있습니다. 이것은 내 showFrame() 함수가 출력 전에 매번 화면을 지우는 것을 고려할 때 나에게는 이상한 일입니다.

장애물로 이동하려고하면 90 번째 줄이 작동합니다. 새로운 위치가 유효하지 않은 경우, 먼저 위치를 되 돌린 후 showFrame()을 호출하고 showFrame()은 출력하기 전에 콘솔을 지 웁니다. 첫 번째 줄이 바뀌게하는 원인은 무엇입니까? 왜 어떤 키를 눌렀는지에 따라 다르게 변하는가?

코드는 다음과 같습니다. 내가 올바르게 이해한다면, 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

나는 ' 이유를 모르겠습니다. 그들은 항상 그러한 질문을 밀어 붙이려고합니다. 사실 나는 Win7에있다. 그리고 너를 더 이상 도울 수 없어.(가상 상자에'kali'를 설치했지만 문제가 있습니다.) 누군가가 회신하기를 바랍니다. – haccks

답변

1

그것은 문제가 명확와 함께이 보인다.

문제를 확인하려면 첫 번째 행으로 이동하는 문자의 출처를 찾아야합니다. 추가 중 :

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

약간의 빛을 가져옵니다. 내가 올라 가기를 원한다면, 위의 줄과 같은 문자가 나의 위치에있는 것처럼 보인다.

이제 문자가 system("clear");에 의해 삭제되지 않는 이유를 찾아야합니다. 시행 착오 끝에, 나는 '지우기'전에 '\ n'을 출력하면 그것이 정상적으로 작동한다는 것을 발견했다.

이전에 ncurses를 사용 해본 적이 없기 때문에이 문제가 왜 발생하는지 설명 할 수 없습니다. 저의 확실한 명령은 터미널을 라인별로 지우는 것입니다. 그리고 줄 바꿈 문자로 끝납니다.

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; 
} 

을 나는이 당신을 위해 유용 희망 : 그래서, 당신이해야 할 모든 것을 (I, 당신은 showFrame 함수의 시작 부분에 인쇄를 제안 simillar 상황을 피하기 위해) 그 뒤에 문자 후에 개행 문자를 추가하는 것입니다 . 또한 코드에 대해 몇 가지 설명을 드리겠습니다.

전역 변수 사용은 strongly discouraged입니다. 주 반환 값에 대해서는 this을 읽어 보시기 바랍니다.

int showFrame(); 
void revertPosition(); 

을 하나 주 전에 전체 정의를 이동 : 또한, 당신의 이디어 주 전에 함수를 선언합니다. 그대로, 내 컴퓨터에서 코드가 컴파일되지 않았습니다 (gcc 4.8.1).

+0

솔루션과 코드에 대해 정말 고마워했습니다. 건배! – 3Nex

관련 문제