Mit Esc Programm beenden || Tipps für Ki?

CodeCrafterCpp

Erfahrenes Mitglied
Hallo,
Ich möchte gerne das man mein Spiel(TicTacToe) und ich möchte gerne das es jeder Zeit mit der Taste ESC beendet werden kann.
Diesen Code habe ich zum großen Teil so aus einen andern Thema bekommen.


Code:
SHORT state = GetAsyncKeyState(VK_ESCAPE);
	
        if(GetForegroundWindow() == GetConsoleWindow()) {

				if((state & 0x8000) != 0)
				{
					system("cls");
					cout << "Spiel Beenden? Y oder N" << endl;
					escfrage = getch();
					if(escfrage == 'Y' || escfrage == 'y')
					{
						break;
					}
					else if(escfrage == 'N' || escfrage == 'n')
					{
						system("cls");
						Render(f);
					}
					else
					{
						while(true)
						{
							system("cls");
							cout << "Spiel Beenden? Y oder N" << endl;
							escfrage = getch();
							if(escfrage == 'Y' || escfrage == 'y')
							{

								exit(0);
							}
							else if(escfrage == 'N' || escfrage == 'n')
							{
								system("cls");
								Render(f);
								break;
							}

						}
					}
				}
			}
        state = GetAsyncKeyState(VK_ESCAPE);

Wie mache ich das aber jetzt das er überall in Spiel beendet wenn ich esc drücke ich möchte das auch gerne in einer Funktion das hat aber auch nicht so geklappt.


Wenn ich damit fertig bin möchte ich gerne eine ki mit 5 Stufen schreiben. Habt ihr da Tipp oder so wie ich da vorgehen soll. Sieht ja ein bisschen doof aus wenn ich jede Möglichkeit mit einer if abfrage mache.


mfG
 
Ich nehme mal an unter Windows. Nächstes mal einfach suche verwenden ;) Ich habe das auch schon gefragt aber hier: exit(int Code); oder PostQuitMessage(0);
 
Hi

Wenn du schon mit getch arbeitest, warum dann nicht auf kbhit dazunehmen?
GetAsyncKeyState dazu ist etwas seltsam.

Zur KI: Zuerst mal überlegen, wie der Computerzug abläuft.

zB.:
Eine bestimmte Zuganzahl vorberechnen, jede Möglichkeit.
Ergebnis ist eine Menge Möglichkeiten, die
a) Zum Sieg, b) Zur Niederlage führen,
c) in der berrechneten Zuganzahl das Spiel noch nicht beenden.

Dann zufällig eine der Möglichkeiten hernehmen, wobei die Gewinne viermal so wahrscheinlich wie Verluste gezogen werden, und Noch-Unbekannt zweimal so wahrscheinlich wie Verluste.

Bei jeder Schwierigkeitsstufe hast du eigene Werte
für Zugberechnungsweite und die Gewichtugen (hier 4-2-1).

In ein Array, Schwierigkeit=Index.

Gruß
 
Ok wie das Programm beende ist mir auch klar aber wo schreib ich das denn mach ich eine Funktion und rufe die immer wieder auf oder reicht das wenn ich das an einer bestimmten stelle schreibe?
Ich hab probleme damit das Programm zu beenden wenn ich das in einer Funktion schreibe.
 
Hä? Wieso wenn man exit aufruft, dann beendet das Programm sofort. Einfach nach GetAsyncKeyState( VK_ESC ); exit aufrufen. Oder?, verstehe ich das falsch.
 
Gemeint war (denk ich), wo man die Abfrage überall einbauen muss,
damit das Programm jederzeit (+- paar Millisekunden) per Esc beendet werden kann.
 
Genau und genau :D
Ich hatte mit exit(0); auch einige Probleme.
Das mit über all ist eine unschöne Lösung oder verstehe ich das falsch?
Habt ihr ein gutes Tutorial zu Thread oder könnt ihr mir sagen wie man msdn verstehen soll. Wenn ich mir das so anschaue verstehe ich nicht mal wie ich std::cout benutze.



Hoffe es ist nicht zu viel verlangt.


mfG
 
Zuletzt bearbeitet:
Überall wäre die saubere Lösung.
Bei jeder Tastatureingabe auch auf Esc prüfen, auch wo keine Eingaben sind ein paar Prüfstellen in den Code, ob Esc gedrückt wurde...
Nachteil: Viel Aufwand

Thread: Einfach, aber meistens ungeeignet.
Also am main-Anfang einen Thread starten, der gleichzeitig mit main läuft.
Im Thread nur darauf warten, dass Esc gedrückt wird.
Wenn das passiert, mit exit alles (Thread und main) beenden.
Falls main ohne Esc sein Ende ereicht, beendet sich der Thread automatisch mit.

Problem an der Sache: man hat keine Vorwarnung, wird einfach gekillt.
Offene Dateien werden nicht automatisch geschlossen, etc...

Frohes neues Jahr!
 
Wunderschönes 2012 alle zusammen!
Also ich fände die Lösung mit dem Thread nicht schlecht, heutzutage haben die meisten Comuter mindestens Dual-Core und das sollte man auch nutzen, zumal die Belastung solcher Funktionen vernachlässigbar ist.
Die Frage ist, WIE man das machen soll.
Ich fände eine Prüfung der Variablen im Thread nicht schlecht, da weiss man immer, ob auch alles gut läuft. Zeige bitte mal deinen Code von bisher.

@CodeCrafterCpp
Anstatt GetAsyncKeyState() aufzurufen und zu prüfen, ob das Fenster vorne ist, weshalb nicht kbhit() und getch() bzw. _kbhit() und _getch() verwenden und dann die Richtigkeit kontrollieren?
Weshalb willst du unbedingt die std::cout verwenden?
Immer gute Tutorials:
http://www.youtube.com/user/SterminioProductions/videos?view=pl
Alles ist gut geordnet, ob es jetzt Standard oder WinApi oder STL, alles ist da und erst noch in Deutsch.

Gruss
cwriter
 
Zuletzt bearbeitet:
Zurück