2013-01-07 19 views
5

Czy jest jakaś funkcja, która może czekać na dane wejściowe, aż do osiągnięcia określonego czasu? Robię coś w rodzaju gry Snake.Czekaj na dane przez określony czas.

Moja platforma to Windows.

+1

Żadna standardowa metoda C++ nie zrobi tego bez długotrwałych efektów, chyba że program zakończy się tuż po wprowadzeniu. Nawet gdyby tak było, nie polecałbym tego. – chris

+4

Tytuł mówi "C" - tagi mówią zarówno "C" i "C++" - co to jest? –

+1

Jak wspomniano, nie ma standardowego sposobu, aby to zrobić. W Linuksie sugeruję użycie ncurses [może również działać w systemie Windows]. Większość systemów operacyjnych ma metodę wprowadzania "bez oczekiwania", ale nie ma dla niej standardowej metody. –

Odpowiedz

0

Spróbuj z bioskey(), this jest przykładem, że:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <bios.h> 
#include <ctype.h> 

#define F1_Key 0x3b00 
#define F2_Key 0x3c00 

int handle_keyevents(){ 
    int key = bioskey(0); 
    if (isalnum(key & 0xFF)){ 
     printf("'%c' key pressed\n", key); 
     return 0; 
    } 

    switch(key){ 
     case F1_Key: 
     printf("F1 Key Pressed"); 
     break; 
     case F2_Key: 
     printf("F2 Key Pressed"); 
     break; 
     default: 
     printf("%#02x\n", key); 
     break; 
    } 
    printf("\n"); 
    return 0; 
} 


void main(){ 
    int key; 
    printf("Press F10 key to Quit\n"); 

    while(1){ 
     key = bioskey(1); 
     if(key > 0){ 
     if(handle_keyevents() < 0) 
      break; 
     } 
    } 
} 
+0

Po prostu wskazywanie ludzi na link jest złym sposobem na odpowiedź na pytanie: linki umierają. Skopiowałem przykład, z którym się łączyłeś. Teraz jest o wiele jaśniejsze, że twoja odpowiedź nie wydaje się odpowiadać na pytanie. – Richard

+0

Nie mam nagłówka "bios.h". Szukałem i wypróbowałem w Google, ale żaden z nich nie działa. Używam edytora CodeBlocks z MinGW. Czy możesz mi zaproponować coś takiego? – Xuicide

2

przypadku gier opartych terminali należy spojrzeć na ncurses.

int ch; 
nodelay(stdscr, TRUE); 
for (;;) { 
     if ((ch = getch()) == ERR) { 
      /* user hasn't responded 
      ... 
      */ 
     } 
     else { 
      /* user has pressed a key ch 
      ... 
      */ 
     } 
} 

Edit:

Zobacz również Is ncurses available for windows?

+0

Pytanie jest wyraźnie oznaczone jako C lub C++ – thecoshman

+1

@ theoshoshman 'ncurses' to biblioteka dla C/C++. –

+0

ah, przepraszam, wziąłem "dla gier opartych na terminalu", co oznacza, że ​​dostarczyłeś rozwiązanie w języku terminalowym, odnoszę to do wiadomości – thecoshman

1

znalazłem rozwiązanie używając kbhit() funkcję conio.h następująco: -

int waitSecond =10; /// number of second to wait for user input. 
    while(1) 
    { 

    if(kbhit()) 
     { 
     char c=getch(); 
     break; 
     } 

    sleep(1000); sleep for 1 sec ; 
    --waitSecond; 

    if(waitSecond==0) // wait complete. 
    break; 
    } 
0

podstawie @birubisht answer I wykonał funkcję, która jest nieco czystsza i używa niezauważonych wersji kbhit() i getch() - ISO C++: _kbhit() i _getch().
funkcja przyjmuje: liczbę sekund oczekiwania na wejście użytkownika
powraca funkcję:_ gdy użytkownik nie umieszczać żadnych char, w przeciwnym razie zwraca inputed char.

/** 
    * Gets: number of seconds to wait for user input 
    * Returns: '_' if there was no input, otherwise returns the char inputed 
**/ 
char waitForCharInput(int seconds){ 
    char c = '_'; //default return 
    while(seconds != 0) { 
     if(_kbhit()) { //if there is a key in keyboard buffer 
      c = _getch(); //get the char 
      break; //we got char! No need to wait anymore... 
     } 

     Sleep(1000); //one second sleep 
     --seconds; //countdown a second 
    } 
    return c; 
} 
Powiązane problemy