Tic Tac Toe
-
@Freddy#32: Und editiere deinen Beitrag und setze den Code in entsprechende C++ Tags...
-
@ Neo 47 ,
danke schonmal für die Antwort aber :An welcher stelle? also ich hab es schonmal so versucht:
#include <iostream> #include <windows.h>// für die funktion sleep using namespace std; char square[10] ={'0','1','2','3','4','5','6','7','8','9'};//Repräsentiert die 9 Felder des Spielfeldes //Der erste Wert ist unbedeutent und nur wichtig damit die eingegebene Zahl gleich dem Index ist int checkwin();// int = ganze zahlen überprüfung ob gewonnen void board();//zeichnet das Spielfeld int main()//Hauptmetode { anfang: char square[10] ={'0','1','2','3','4','5','6','7','8','9'}; int player = 1; //Überprüft wer an der Reihe ist int i; int choice; char mark;// X oder O char again; ...
das funktioniert leider nicht, denn dann wird gar kein Zeichen mehr angezeigt.
Also gesetzt schon, denn wenn ich z.B. auf 1 drücke...bleibt die 1 stehen aber er setzt dort was hin (was er nicht anzeigt) denn wenn ich erneut auf 1 drücke, sagt er mir ungültige eingabe ...ich bin echt ratlos -,-
-
Freddy#32 schrieb:
int main() { // ... char square[10] ={'0','1','2','3','4','5','6','7','8','9'};//Repräsentiert die 9 Felder des Spielfeldes // ...
das funktioniert leider nicht, denn dann wird gar kein Zeichen mehr angezeigt.
Ja. Gratuliere. Du hast eben selbst erlebt warum es (unter anderem) doof ist, globale Variablen zu verwenden.
Du deklarierst (und definierst)square
sowohl im globalen scope als auch im scope vonmain()
. Die beiden sind zwei seperate Variablen. Das Problem ist, daß dassquare
inmain()
das andere im globalen scope überdeckt. Dh. du setzt inmain()
lustig Werte insquare
, jedoch ermitteltboard()
seine Ausgabe anhand des globalensuare
, daß sich aber nie nicht ändert.@ Freddy #32 ,
tu was dir Th69 gesagt hat!
-
@ Swordfish
Lösungsvorschlag?
Wie gesagt, bin Anfänger, wäre schön wenn jemand mir nen leicht zu verstehenden Lösungsvorschlag anbieten könnte.
-
Freddy#32 schrieb:
Lösungsvorschlag?
Akut? Nicht neu deklarieren sondern nur den Elementen des Arrays die Werte zuweisen, die sie haben sollen.
Langfristig? Funktionsparameter statt globaler Variablen.
Ziel? OOP wo's sinn macht.
-
Hättest du eventuell ein Beispiel für das Akkute?
-
Mit einer Schleife drüberlaufen und Werte setzten?
-
ich weiß nicht genau wie du das meinst....
kannst du nicht bitte kurz den Quellcode posten, wäre auf jeden Fall leichter...
-
char square[10]; int main() { anfang: for(int i = 0; i < 10; i++) square[i] = '0' + i; .... }
Das hat Swordfish gemeint.
-
Oder ganz einfach noch lokaler werden, wie es sich gehört. Alles was zum Spiel gehört, gehört eben auch nur in den Block des Spiels:
int main() { anfang: { char square[10] ={'0','1','2','3','4','5','6','7','8','9'}; int player = 1; char mark; int i; // Hier das Spiel } { char again; cout<< "\n\nM\x94 \bchten Sie erneut spielen ? "; cout<< "\n\nDr\x81 \bcken Sie <j> um erneut zu Spielen oder <n> um das Spiel zu beenden !";// j für erneutes Spiel n für programm schließen cin>> again; if(again=='j') { system("cls"); goto anfang; } if (again=='n') { return 0; } } }
Das wäre natürlich wesentlich einfacher, wenn man vernünftige Kontrollstrukturen nutzen würde, statt goto. Und wesentlich lesbarer, wenn man nicht den Uraltstil benutzen würde, alles am Anfang eines Blocks zu deklarieren.
Und die check-Funktion kann nun nicht mehr auf ein globales Spielfeld zugreifen. Aber das ist eine gute Sache, denn das zwingt dich, es richtig zu lernen.
goto, globale Variablen, und dein Uralt-Stil . Wo hast du C++ gelernt? Das Programm ist wie eine Ansammlung sämtlicher Techniken, die man nicht nutzen sollte. Gerade goto wird normalerweise gar nicht mehr richtig gelehrt, höchstens als Randnotiz, dass es das auch gibt und man es meiden sollte. Deine Probleme hier sind größtenteils auch darauf zurück zu führen, wieso man diese Techniken normalerweise nicht (oder nur mit viel Erfahrung und großer Vorsicht) benutzen sollte.
Deine Zeilen 43-69 sind übrigens recht kompakt schreibbar:
if (choice >= 1 && choice <= 9 && square[choice] == choice + '0') square[choice] = mark;
Als Anfänger bist du natürlich noch nicht so vertraut damit, solche Abkürzungen zu sehen, aber als Faustregel, kommt in einem guten Code keine Zeile doppelt vor oder auch nur eine Zeile, die einer anderen sehr ähnlich sieht. Wenn sich etwas zig-Mal mit leichter Variation wiederholt, dann gibt es garantiert eine bessere Lösung. Solche Stellen gibt es in deinem Code noch anderswo.