Warten Sie eine bestimmte Zeit auf die Eingabe

Lesezeit: 3 Minuten

Benutzer-Avatar
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.

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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;
}

1012470cookie-checkWarten Sie eine bestimmte Zeit auf die Eingabe

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy