Problem mit GetAsyncKeyState()
-
Moin
,Wir fangen grade in der Schule mit C++ an. Gestern sollten wir ein einfaches "Spiel" programmieren in dem es darum geht das eine Person eine Zahl zwischen 1 und 9 eingiebt und die nächste Person diese erraten soll. Danach soll die Eingabe ausgewertet werden (zu groß, zu klein und im toleranzbreich von 3 oder nicht). Das funktioniert auch alles soweit ganz. Aber am Ende wollte ich noch eine Abfrage einbauen ob das Programm beendet oder eine neue Runde gestartet werden soll. Wärend dessen soll ein Strich rotieren (-,\,|,/) um anzuzeigen das das Programm wartet. Da ich dafür eine Scheife benutze kan ich ja kein cin verwenden. Also hab ich das ganze mit GetAsyncKeyState() probiert. Funktiniert auch, allerdings werden alle zeichen die man vor dem "Y" drückt in die Zeile für die Zahleneingabe geschrieben, inklusive des "Y". Wie kann ich das verhindern
?Hier mein Code (die wichtigen Zeilen sind die Nr. 128 und 129):
#include <windows.h> #include <cstdlib> #include <iostream> using namespace std; int gegZahl, gerZahl, dif; bool dummy; short ende,weiter; int main(int argc, char *argv[]) { while(!dummy) { system("cls"); while(!dummy) { cout << "#########################################" << endl; cout << "############### Ratespiel ###############" << endl; cout << "#########################################\n\n" << endl; cout << "Geben sie eine Zahl zwischen 1 und 9 ein: " ; cin >> gegZahl; if(gegZahl >= 1 && gegZahl <= 9) break; else { cout << endl << "Zahl falsch, nicht zwischen 1 und 9." << endl; Sleep(1500); system("cls"); } } system("cls"); while(!dummy) { cout << "#########################################" << endl; cout << "############### Ratespiel ###############" << endl; cout << "#########################################\n\n" << endl; cout << "Erraten sie die Zahl (1-9): " ; cin >> gerZahl; if(gerZahl >= 1 && gerZahl <= 9) break; else { cout << endl << "Zahl falsch, nicht zwischen 1 und 9." << endl; Sleep(1500); system("cls"); } } dif = gegZahl - gerZahl; //cout << dif << endl; if (gegZahl==gerZahl) cout << endl <<"Zahl richtig!" << endl; else { if (dif <= 3 && dif >= 1) { cout << endl << "Zahl falsch aber nur um hoechstens 3 zu klein 'Warm'" << endl; } if (dif <= -1 && dif >= -3) { cout << endl << "Zahl falsch aber nur um hoechstens 3 zu groß 'Warm'" << endl; } if (dif > 3) { cout << endl << "Zahl falsch, um mehr als 3 zu klein 'Kalt'" << endl; } if (dif < -3) { cout << endl << "Zahl falsch, um mehr als 3 zu groß 'Kalt'" << endl; } } cout << endl; for(int round=1; round >= 0; round++) { switch(round) { case 1: cout << "\rNeue Runde? (y/n) -" ; Sleep(100); break; case 2: cout << "\rNeue Runde? (y/n) \\" ; Sleep(100); break; case 3: cout << "\rNeue Runde? (y/n) |" ; Sleep(100); break; case 4: cout << "\rNeue Runde? (y/n) /" ; Sleep(100); break; } if(round==4) round=0; ende = GetAsyncKeyState(0x4E); weiter = GetAsyncKeyState(0x59); //cout << ende ; if (weiter < 0) break; if (ende < 0) return 0; } } return 0; }mfg Gambler
-
nimm statt getasync... _getch()
#include <conio.h> int c = _getchar();getch hat den vorteil es liest nur ein zeichen ein und gibt das echo nicht (wie cin und so) auf dem bildschirm aus
oben in dem beispiel würdest du nichts sehen du drückst eine taste und dann wird weitergerechnet
allerdings wartet getch auch auf eine eingabe und unterbricht solange das programm
kbhit allerdings nicht#include <conio.h> // ... int i = 0; char c; for( ; ; ) { if ( _kbhit() ) { int c = _getch(); if ( c == CODE FÜR Y || c == CODE FÜR N ) break; } if ( i%4 == 0 ) c = '-'; else if ( i%4 == 1 ) c = '/'; else if ( i%4 == 2 ) c = '|'; else if ( i%4 == 3 ) c = '\'; cout << c << "\r"; // r oder t glaub ich war dass der an den zeilen anfang zurückgeht... ++i; }da haste deine warte dingens...
-
Vielen Dank funktioniert perfekt

-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.