Suche Alternative zum Standart "cin >> ..." Befehl für C++ Konsolenanwendung



  • Guten Abend liebes C++ Forum,
    Ich bin Kugli9345 und bin neu hier! 🙂 Ich habe mich hier angemeldet weil ich einfach keine Antwort auf meine Frage gefunden habe. Vielleicht kann mir hier ja jemand helfen... 👍 Hier mein Problemchen:

    Ich brauche eine Alternative für den Befehl "cin >> Variablenname". Mit diesem lassen sich zwar Daten über die Tastatur eingeben, aber man muss die eingegebenen Daten immer mit Enter bestätigen. Nun möchte ich aber das wenn man zum Beispiel die Taste 'W' drückt sofort eine Aktion durchgeführt wird, zum Beispiel das beim drücken von W die Geschwindigkeit um 1 erhöht wird.

    Ich arbeite an einem kleinen "Konsolen-Spielchen", ich programmiere in C++. Mein Betriebssystem ist Windows 7.

    Ich hoffe ihr könnt mir helfen, das wäre echt toll!! 🙄 (Und entschuldigt wenn ich im falschen Unterforum poste, was wahrscheinlich der Fall ist...)





  • AH, vielen Dank schonmal hustbaer! Das sieht schonmal gut aus! Mir ist aber noch nicht ganz klar ist wie ich den _getch Befehl verwende... 😞
    Also der Teil des Programms soll ungefähr so aussehen:

    - Wenn die Taste W gedrückt wird sollst du die Geschwindigkeit um 1 erhöhen

    Da ist mir halt noch nicht ganz klar wie ich das mache, könntest du mir das vielleicht nochmal erklären? Wäre super von dir... 🙂



  • Kugli9345 schrieb:

    Wenn die Taste W gedrückt wird sollst du die Geschwindigkeit um 1 erhöhen.
    Da ist mir halt noch nicht ganz klar wie ich das mache, könntest du mir das vielleicht nochmal erklären?
    Wäre super von dir... 🙂

    Der Tipp mit _getch() ist für ein Consolenspiel OK.
    Wegen der conio.h ist es plattformabhängig und kein C++.

    - Ein Beispiel ist doch unter dem Link bereits vorhanden ?
    - Wie sieht denn das bisherige Programmgerüst aus ?

    ---

    Hier noch eine Version mit Abfrage von w.

    #include <stdio.h>
    #include <conio.h>
    
    int speed = 0;
    
    int main( void )
    {
       int ch;
       puts( "Type 'X' to Exit!" );
       do {
         switch(ch = _getch())
         {
         case (int)'w':
            puts("W: Speedup");
            speed++;
            break;
         case (int)'s':
            puts("s: Speeddown");
            speed--;
            break;
         }
       } while( ch != 'X' );
    
    return 0;
    }
    


  • Bzw. falls du bei jedem Schleifendurchlauf wissen willst ob eine bestimmte Taste *gerade* gedrückt ist, kannst du GetAsyncKeyState verwenden.

    Das ist dann aber wirklich *sehr* Windows-spezifisch.

    ps:

    Kugli9345 schrieb:

    Da ist mir halt noch nicht ganz klar wie ich das mache, könntest du mir das vielleicht nochmal erklären? Wäre super von dir... 🙂

    Poste was du bis jetzt hast, und beschreib wo du anstehst.



  • Wenn Windows System-Calls erlaubt sind geht auch:

    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    char buffer[1];
    DWORD numread;
    
    // SetConsoleMode(hStdin, ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT);
    SetConsoleMode(hStdin, NULL);
    
    BOOL rt = ReadConsole(hStdin, buffer, sizeof(buffer), &numread, NULL);
    ch = buffer[0];
    
    // ch = _getch()
    

    Alternativ auch mit ReadConsoleInput(), was auch Maus und andere Eingaben feststellt.

    INPUT_RECORD buffer;
    DWORD events;
    
    // PeekConsoleInput(hStdin, &buffer, 1, &events);
    // if(events > 0) {
    
    buffer.EventType = 0;
    while(buffer.EventType != KEY_EVENT) 
      { 
      ReadConsoleInput(hStdin, &buffer, 1, &events);	
      ch = (int)buffer.Event.KeyEvent.uChar.AsciiChar; 
      }
    

    Wenn man vorher prüfen will ob ein Zeichen eingegeben wurde kann
    man zusätzlich PeekConsoleInput() verwenden.


Log in to reply