2013-11-23 3 views
0

Я сделал из-за скуки просто простую игру из лабиринта, однако есть странная ошибка, что я не могу понять, почему это происходит.Простая консольная лабиринтная игра: Нужна помощь в выяснении ошибки.

Когда я пытаюсь перейти в препятствие, первый ряд моих выходных сдвигов. Кроме того, в зависимости от того, где я пытаюсь двигаться, он может сдвинуть только 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

Я не знаю, Знаю почему. Они всегда пытаются поставить такой вопрос на СО. На самом деле я на 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. О возвращаемом значении main, я бы рекомендовал вам прочитать this. Кроме того, ваше Этие объявить свои функции, прежде чем главный:

int showFrame(); 
void revertPosition(); 

либо переместить их все определения, прежде чем основные. Как бы то ни было, ваш код не компилировался на моей машине (gcc 4.8.1).

+0

Он был уверен, большое спасибо за решение и замечания по поводу кода, Cheers! – 3Nex

Смежные вопросы