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.
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.
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;
}
}
}
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
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
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?
Pytanie jest wyraźnie oznaczone jako C lub C++ – thecoshman
@ theoshoshman 'ncurses' to biblioteka dla C/C++. –
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
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;
}
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;
}
Ż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
Tytuł mówi "C" - tagi mówią zarówno "C" i "C++" - co to jest? –
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. –