[C++] Warum funktioniert es nur ein mal?
-
Hallo Leute,
ich programmiere TicTacToe und habe ein Problem: Wenn der User nach einem Spiel ins Menu zurück ins Menu kehrt, kann er nix auswählen, weil der Computer erkennt, dass diese Taste ungültig ist. Dies ist aber beim Starten nicht der Fall!
Ich füge nur ein Teil des Codes hier ein, weil der gesamte Code über 300 Zeilen beträgt und nur hier der Fehler Stecken kann:
#include <iostream> #include <conio.h> #include <time.h> using namespace std; //Variables: int nPlayer=1; int nWinner=0; int nOption=0; int nDistance=20; int nSelectedField=0; int nHighField; char cField [9]={0,0,0,0,0,0,0,0,0}; char cOption=0; char cSelectedField=0; char cAsk=0; bool bGameOver = false; //Functions: void makeDistance(); // Macht 20 (nDistance) mal ' ' void menu(); void einzelspieler(); void zweispieler(); void makeField(); void Help(); void checkForWinner(); void clear(); //Main: int main (){ start:; menu (); if (nOption==1) einzelspieler(); else if (nOption==2) zweispieler(); else { cout<<endl; makeDistance(); cout<<"Falsche eingabe! Bitte Warten!"; clock_t clock(50); goto start; } system ("CLS"); cout<<endl<<endl<<endl; makeDistance(); cout<<"Wollen Sie Beenden (b) oder zum Menu zurückkehren (z)?"<<endl; makeDistance(); cAsk=getch(); if (cAsk=='b') {} else goto start; } [...] void menu (void) { system ("CLS"); cout<<endl<<endl<<endl; makeDistance(); cout<<"Einzelspieler (1)"<<endl<<endl; makeDistance(); cout<<"Zwei Spieler (2)"<<endl<<endl; makeDistance(); cOption=getch(); nOption = atoi (&cOption); }Es wäre sehr nett wenn ihr mir helfen könntet!
Danke schon mal im vor hinaus!
HUND123

-
Hi,
wenn du das zweite Mal in "menu()" reingehst, welche Werte haben cOption und nOption?
cOption=getch(); nOption = atoi (&cOption);Felix
-
- Lass goto sein
- lass globale Variablen sein
- was heißt der Compiler erkennt, das diese Taste ungültig ist? Welche ist "diese"? Der Compiler erkennt da garnichts, denn wenn das Programm läuft hat der Compiler schon lange Feierabend.
-
Ok, Wenn ich das Programm Starte, wird die Funktion "main" durchgeführt, diese ruft "menu" auf, das menu Übergibt dann die Variable cOption & nOption, die die main verarbeitet, "1" -> einspieler; "2" -> zweiSpieler. Ist keine von den Beiden gedrückt, kommt die Fehlermeldun (im Editor):"Falsche eingabe!". Dann wird gefordert, nochmal einzugeben. Das geht so weiter, bis die Eingabe korrekt ist, dann werden die neue Funktionen auufgerufen, nach jedem Spiel werden die Variablen "auf null gesetzt":
void clear (void) { //Field for (int i=0; i<=8; i++) cField[i]=0; //Other Variables: nWinner=0; cAsk=0; nPlayer=1; nOption=0; nSelectedField=0; cOption=0; cSelectedField=0; bGameOver = false; }Dann wird das Menu geöffnet, dass heißt, 'goto start' in der main.
Die globalen Variablen habe ich gemacht, weil jede Funktion Variablen ändertn soll, und Zwar für alle Funktionen, so ist das am Einfachsten!

HUND123
-
Hallo,
atoi() funktioniert nur mit nullterminierten Strings, NICHT mit einem einzelnen Zeichen (char)!
Da du aber den ASCII-Wert der Ziffer in eine Zahl wandeln möchtest, reicht auch einfach
nOption = cOption - '0';
-
Ok, danke, das war der Fehler

HUND123