2013-11-09 12 views
10

Sto creando un'applicazione console in C. Questo è un gioco in cui i personaggi stanno cadendo e l'utente deve premere quel tasto specifico sulla tastiera. Non so come rilevare quale tasto viene premuto dall'utente senza mettere in pausa i caratteri che cadono. Quando uso scanf, il programma attende l'input e tutto si ferma. Per favore aiutatemi presto!Ingresso tastiera continuo in C

+0

questo è in realtà interessante .. in attesa di qualche risposta – sukhvir

+0

http://stackoverflow.com/a/13035523/1119701 – ouah

+0

è C'è un altro modo per farlo senza ncurses – sukhvir

risposta

6

C'è una funzione chiamata kbhit() o _kbhit è nella biblioteca <conio.h> restituisce true o false a seconda se una chiave è stato colpito. Così si può andare con qualcosa di simile:

while (1){ 
    if (_kbhit()) 
     key_code = _getch(); 
     // do stuff depending on key_code 
    else 
     continue; 

Anche utilizzare getch() o _getch che legge un carattere direttamente dalla console e non dal buffer. Puoi leggere di più sulle funzioni conio.hhere potrebbero essere molto utili per quello che vuoi fare.

Nota: conio.h non è una libreria standard e le implementazioni possono variare dal compilatore al compilatore.

+0

con getch() il mio gioco è ancora in pausa e attende input. Non ho bisogno di premere il tasto Invio dopo aver inserito un carattere. Non è questo il problema! – zaingz

+1

@zaingz è il motivo per cui devi usare 'if (kbhit())' in modo che "aspetta" solo se qualcosa è stato premuto. Ma perché era già stato premuto quando si trattava di 'key_code = getch();' legge il tasto premuto. –

+0

Grazie mille ...Questo mi ha davvero aiutato. Un consiglio per chi usa Visual Studio dovrebbe aggiungere il carattere di sottolineatura "_" all'inizio di ogni funzione conio. vale a dire _kbhit() e _getch() – zaingz

4

Si può probabilmente cercare ncurses

ncurses (nuove maledizioni) è una libreria di programmazione che fornisce un'API che permette al programmatore di scrivere basati su testo interfacce utente in modo indipendente dal terminale. È un toolkit per lo sviluppo di un software applicativo "tipo GUI" che gira sotto un emulatore di terminale.

controllare anche C/C++: Capture characters from standard input without waiting for enter to be pressed

#include <conio.h> 

if (kbhit()!=0) { 
    cout<<getch()<<endl; 
} 
+0

può essere eseguito senza ncurses? – sukhvir

+0

Non molto sicuro, ma se fosse stato per l'implementazione grafica, potrebbe essere fatto utilizzando SDL –

+0

ncurses non è fattibile. Non c'è niente nella libreria windows.h? – zaingz

1

Penso che questo potrebbe essere l'input da tastiera non bloccante che stai cercando.

void simple_keyboard_input() //win32 & conio.h 
    { 
     if (kbhit()) 
      { 
       KB_code = getch(); 
       //cout<<"KB_code = "<<KB_code<<"\n"; 

       switch (KB_code) 
       { 

        case KB_ESCAPE: 

         QuitGame=true; 

        break; 
       }//switch 
      }//if kb 
      }//void 

E per quanto riguarda i personaggi che cadono ... ecco qua.

The Matrix falling numbers

Codice in materia, se siete su Windows:

/* The Matrix falling numbers */ 

#include <iostream> 
#include <windows.h> 

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <conio.h> 
using namespace std; 


#define KB_UP 72 
#define KB_DOWN 80 
#define KB_LEFT 75 
#define KB_RIGHT 77 
#define KB_ESCAPE 27 
#define KB_F8 66 


/* Variables*/ 

char screen_buffer[2000]={' '}; 
int y_coord[2000]={0}; 
int x=0, y=0,dy=0; 
int XMAX=77; 
int YMAX=23; 
int KB_code=0; 
bool QuitGame=false; 
int platformX=35, platformY=23; 

/* function prototypes*/ 

void gotoxy(int x, int y); 
void clrscr(void); 
void setcolor(WORD color); 
void simple_keyboard_input(); 
void draw_falling_numbers(); 
void draw_platform(); 

/* main */ 

int main(void) 
{ 
    /* generate random seed */ 
    srand (time(NULL)); 

    /* generate random number*/ 
    for(int i=0;i<XMAX;i++) y_coord[i]= rand() % YMAX; 

    while(!QuitGame) 
    { 
     /* simple keyboard input */ 
     simple_keyboard_input(); 

     /* draw falling numbers */ 
     draw_falling_numbers(); 

    } 

    /* restore text color */ 
    setcolor(7); 
    clrscr(); 
    cout<<" \n"; 

    cout<<" \nPress any key to continue\n"; 
    cin.ignore(); 
    cin.get(); 

    return 0; 
} 

/* functions */ 

void draw_falling_numbers() 
{ 

    for(x=0;x<=XMAX;x++) 
    { 
     /* generate random number */ 
     int MatixNumber=rand() % 2 ; 

     /* update falling number */ 
     y_coord[x]=y_coord[x]+1; 

     if (y_coord[x]>YMAX) y_coord[x]=0; 

     /* draw dark color */ 
     setcolor(2); 
     gotoxy(x ,y_coord[x]-1); cout<<" "<<MatixNumber<<" "; 

     /* draw light color */ 
     setcolor(10); 
     gotoxy(x ,y_coord[x]); cout<<" "<<MatixNumber<<" "; 
    } 
    /* wait some milliseconds */ 
    Sleep(50); 
    //clrscr(); 
} 


void draw_platform() 
{ 
    setcolor(7); 
gotoxy(platformX ,platformY);cout<<"  "; 

gotoxy(platformX ,platformY);cout<<"ÜÜÜÜÜÜ"; 
setcolor(7); 
Sleep(5); 
} 




void simple_keyboard_input() 
{ 
    if (kbhit()) 
     { 
      KB_code = getch(); 
      //cout<<"KB_code = "<<KB_code<<"\n"; 

      switch (KB_code) 
      { 

       case KB_ESCAPE: 

        QuitGame=true; 

       break; 

       case KB_LEFT: 
          //Do something 
        platformX=platformX-4;if(platformX<3) platformX=3; 
       break; 

       case KB_RIGHT: 
          //Do something  
        platformX=platformX+4;if(platformX>74) platformX=74; 
       break; 

       case KB_UP: 
          //Do something      
       break; 

       case KB_DOWN: 
          //Do something      
       break; 

      }   

     } 

} 


void setcolor(WORD color) 
{ 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color); 
    return; 
} 


void gotoxy(int x, int y) 
{ 
    static HANDLE hStdout = NULL; 
    COORD coord; 

    coord.X = x; 
    coord.Y = y; 

    if(!hStdout) 
    { 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    } 

    SetConsoleCursorPosition(hStdout,coord); 
} 


void clrscr(void) 
{ 
    static HANDLE hStdout = NULL;  
    static CONSOLE_SCREEN_BUFFER_INFO csbi; 
    const COORD startCoords = {0,0}; 
    DWORD dummy; 

    if(!hStdout)    
    { 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdout,&csbi); 
    } 

    FillConsoleOutputCharacter(hStdout, 
          ' ', 
          csbi.dwSize.X * csbi.dwSize.Y, 
          startCoords, 
          &dummy);  
    gotoxy(0,0); 
}