Gibt es eine Funktion, die auf Eingaben warten kann, bis eine bestimmte Zeit erreicht ist? Ich mache eine Art Snake-Spiel.
Meine Plattform ist Windows.
Selbstmord
Gibt es eine Funktion, die auf Eingaben warten kann, bis eine bestimmte Zeit erreicht ist? Ich mache eine Art Snake-Spiel.
Meine Plattform ist Windows.
Klas Lindbäck
Für terminalbasierte Spiele sollten Sie einen Blick darauf werfen ncurses.
int ch;
nodelay(stdscr, TRUE);
for (;;) {
if ((ch = getch()) == ERR) {
/* user hasn't responded
...
*/
}
else {
/* user has pressed a key ch
...
*/
}
}
Bearbeiten:
Siehe auch Ist ncurses für Windows verfügbar?
ah, Entschuldigung, ich habe “für terminalbasierte Spiele” so verstanden, dass Sie eine Lösung in einer terminalbasierten Sprache bereitgestellt haben. Ich nehme diese Ablehnung zurück
– der Koschmann
9. Januar 2013 um 10:15 Uhr
Obwohl der “Nodelay”-Vorschlag funktionieren wird, kann seine Verwendung dazu führen, dass die CPU-Last dramatisch ansteigt und die Laptop-Batterien wahrscheinlich viel schneller entladen werden. Eine einfache Alternative ist “halfdelay(1)”, das bei jeder Eingabeaufforderung höchstens 1 Zehntelsekunde wartet.
– Brandin
11. Januar 2013 um 16:54 Uhr
Ich habe eine Lösung mit der Funktion kbhit () von conio.h wie folgt gefunden: –
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;
}
Warum nicht while(waitSecond > 0) und durch if + break? Gibt es dafür eine Nebenwirkung?
– Tamim Attafi
12. Dezember 2020 um 8:39 Uhr
Rajesh
Versuche es mit bioskey()
, diese ist ein Beispiel dafür:
#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;
}
}
}
Leute einfach auf einen Link zu verweisen, ist eine schlechte Art, eine Frage zu beantworten: Links sterben. Ich habe das von dir verlinkte Beispiel kopiert. Jetzt ist es viel klarer, dass Ihre Antwort die Frage nicht zu beantworten scheint.
– Richard
7. Januar 2013 um 9:40 Uhr
Ich habe den Header “bios.h” nicht. Ich habe einige auf Google gesucht und ausprobiert, aber keiner von ihnen funktioniert. Ich verwende den CodeBlocks-Editor mit MinGW. Können Sie mir einige empfehlen, die funktionieren?
– Xuizid
7. Januar 2013 um 13:05 Uhr
jave.web
Beyogen auf @birubischt Antwort Ich habe eine Funktion erstellt, die etwas sauberer ist und NICHT veraltete Versionen von verwendet kbhit()
und getch()
– ISO C++ _kbhit()
und _getch()
.
Funktion dauert: Anzahl der Sekunden, die auf Benutzereingaben gewartet wird
Funktion gibt zurück: _
Wenn der Benutzer kein Zeichen eingibt, wird sonst das eingegebene Zeichen zurückgegeben.
/**
* 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;
}
Kein Standard-C++-Weg wird dies ohne anhaltende Effekte tun, es sei denn, Ihr Programm endet direkt nach der Eingabe. Selbst wenn, würde ich es nicht empfehlen.
– Chris
7. Januar 2013 um 8:26 Uhr
Titel sagt “C” – Tags sagen sowohl “C” als auch “C++” – was ist es?
– PaulR
7. Januar 2013 um 8:26 Uhr
Wie bereits erwähnt, gibt es dafür keine Standardmethode. Unter Linux würde ich vorschlagen, die ncurses zu verwenden [may also work for Windows]. Die meisten Betriebssysteme haben eine “no wait”-Eingabemethode, aber es gibt keine Standardmethode dafür.
– Mats Petersson
7. Januar 2013 um 8:31 Uhr
C und C++ können das nicht? Gibt es eine einfache Sprache, die dies tun kann?
– Xuizid
7. Januar 2013 um 8:38 Uhr
Benutzt du irgendwelche Frameworks? Anstatt auf die Eingabe zu warten, können Sie den Tastaturstatus in einer Schleife überprüfen. Unter Windows können Sie dies mit API-Funktionen tun, aber wenn Sie SDL oder SFML oder ähnliches verwenden, gibt es auch andere Optionen.
– Skalli
7. Januar 2013 um 9:05 Uhr