2015-02-19 5 views
0

До сих пор я сделал простую карту (сделанную из символов в моем терминале), и я пытаюсь получить «O», чтобы передвигаться по ней. Мне досадно, что каждый раз, когда я хочу двигаться, я должен нажать Enter. Я нашел команду stty, и я хотел бы проверить, что такое текущее состояние, установить его в raw, и когда я закончил, верните его в прежнее состояние. Если кто-то знает лучший способ, я бы хотел это услышать. Я использую Ubuntu.программирование простой игры в c

EDIT: Вот что я сделал:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_Y 12 
#define MAX_X 23 

typedef enum { 
    _notOk=0, 
    _Ok 
}_state; 

typedef struct { 
    int x, y; 
    char map[MAX_Y][MAX_X]; 

}_map; 

void mapPrint(_map gameState); 
_state mapMove(_map* gameState); 

int main() 
{ 
    char gameMode=_Ok; 
    _map gameState={ 
    .x=1, 
    .y=1, 
    .map={ 
    "######################", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "#     #", 
    "######################"} 
    }; 



    system ("/bin/stty raw"); 
    do 
    { 
    mapPrint(gameState); 
    gameMode=mapMove(&gameState); 
    } while(gameMode); 
    system ("/bin/stty cooked"); 

    return 0; 
} 

void mapPrint(_map gameState) 
{ 
    int i, j; 

    system("clear"); 
    for(i=0; i<MAX_Y; i++) 
    { 
    for(j=0; j<MAX_X; j++) 
     if (i==gameState.y && j==gameState.x) 
    printf("%c", '0'); 
     else 
    printf("%c", gameState.map[i][j]); 
    printf("\n"); 
    } 

} 


_state mapMove(_map* gameState) 
{ 
    char c=getchar(); 

    while (c!='w' && c!='a' && c!='s' && c!='d') 
    { 
    printf("Pomera se sa WASD!\n"); 
    c=getchar(); 
    } 


    switch(c) 
    { 
    case 'w': (*gameState).y--; break; 
    case 'a': (*gameState).x--; break; 
    case 's': (*gameState).y++; break; 
    case 'd': (*gameState).x++; break; 
    } 

    if((*gameState).map[(*gameState).y][(*gameState).x]==' ') 
    return _Ok; 

    return _notOk; 
} 

Я новичок.

+0

что вы пробовали ?? –

+3

Почему вы не используете библиотеку (n) curses, которая уже включает в себя функцию, которая делает то, что вы хотите, а также заботится о выходе терминала? – llogiq

ответ

1

Если вы хотите сделать это с помощью программы, в системах Unix вы можете использовать функции termios (tcsetattr и tcgetattr). Как и было предложено, библиотека ncurses может выполнить большую часть болезненной работы: установить атрибуты терминала и нарисовать на экране.

+0

Не могли бы вы рассказать мне, почему функция mapPrint дает такой странный результат, хотелось бы узнать из моих ошибок. Заранее спасибо – someoneb100

+0

В необработанном режиме '\ n' не переведены, поэтому, если вашему термину требуется комбинация символов (обычно возврат каретки и перевод строки) для имитации' return', печать 'n' в режиме raw только делает строку корм. Измените свой код на 'printf (" \ r \ n ")'. –