Hilfe bei einem kleinen Zahlenspiel...
-
Hi,
ich programmiere noch nicht lange unter c++ und habe nun ein kleines Problem bei meinem Zahlenspiel. Ich habe mir shcon Stunden den Kopf zerbrochen, aber ich komme nicht auf des Rätsels Lösung. Werft doch mal einen Blick auf meinen C++-Code.
Ich habe folgende Probleme:
1. Wenn man am Ende des Programms "y" eingibt, dann entsteht eine Endllosschleife
2. Der Vergleich, der ermittelt wer gewonnen hat, funtkioniert nicht. Er zeigt immer "Gleichstand" anDa ich nicht genau weiß, wo die Fehler sind, habe ich mal den ganzen Sourcecode gepostet. Also bitte nicht böse sein.
P.S. Könnt ihr mich auch noch Dinge sagen, die man hätte besser machen können oder welche man hätte vermeiden sollen? Ich bin für jede Kritik dankbar.
#include <iostream> using namespace std; void ZugComputer(); void ZugSpieler(); int main() { cout << " ***********RATESPIEL*********** " << endl; srand(time(NULL)); char restart = 'y'; while(restart == 'y') { restart = 'n'; int anzahlcomputer = 0; int anzahlspieler = 0; bool spielergefunden; bool computergefunden; ZugSpieler(); ZugComputer(); if(anzahlspieler < anzahlcomputer) if(spielergefunden == true) cout << "Sie haben gewonnen!" << endl; else if(anzahlspieler > anzahlcomputer) if(computergefunden == true) cout << "Sie haben verloren!" << endl; else cout << "Gleichstand!" << endl; cout << "Nochmal?(y/n)" << endl; do cin.get(restart); while(restart != 'y' && restart != 'n'); } } void ZugComputer() { int anzahl = 0; bool computergefunden = false; int obergrenze = 15; int untergrenze = 0; int vorherigezahl = 0; //zahl, die der computer tippt int gesuchtezahl = (rand() % 15) +1; int anzahlcomputer; while( anzahl < 3 && !computergefunden) { neu: srand(time(NULL)); if(vorherigezahl < gesuchtezahl) //falls die zahl des Computers kleiner ist { //dann rechnet er diese schritte untergrenze = vorherigezahl; vorherigezahl = obergrenze - untergrenze; vorherigezahl = vorherigezahl / 2; vorherigezahl = vorherigezahl + ((rand() % 4) -2); vorherigezahl = untergrenze + vorherigezahl; } if(vorherigezahl > gesuchtezahl) //falls die zahl des Computers größer ist { //dann rechnet er diese schritte obergrenze = vorherigezahl; vorherigezahl = obergrenze - untergrenze; vorherigezahl = vorherigezahl / 2; vorherigezahl = vorherigezahl + ((rand() % 4) -2); vorherigezahl = obergrenze - vorherigezahl; } if(vorherigezahl == obergrenze || vorherigezahl == untergrenze || vorherigezahl > obergrenze || vorherigezahl < untergrenze) goto neu; cout << vorherigezahl << " "; //hier wird die zahl ausgegeben if(vorherigezahl < gesuchtezahl) //hier wird sie mit der zufallszahl verglichen cout << " zu klein!" << endl; else if(vorherigezahl > gesuchtezahl) cout << " zu gross!" << endl; else computergefunden = true; anzahl++; //anzahl der versuche wird um 1 erhöht anzahlcomputer++; } if(!computergefunden) cout << "Der Computer hat die Zahl nicht erraten!" << endl << "Die gesuchte Zahl: " << gesuchtezahl << endl; else cout << endl << "Der Computer hat die Zahl erraten!" << endl; } void ZugSpieler() { int eingabe; int anzahl = 0; bool spielergefunden = false; int gesuchtezahl = (rand() % 15) +1; int anzahlspieler; while( anzahl < 3 && !spielergefunden) { cin >> eingabe; anzahl++; if(eingabe < gesuchtezahl) cout << " zu klein!" << endl; else if(eingabe > gesuchtezahl) cout << " zu gross!" << endl; else spielergefunden = true; anzahlspieler++; } if(!spielergefunden) cout << "Sie haben die Zahl nicht erraten!" << endl << "Die gesuchte Zahl: " << gesuchtezahl << endl << endl; else cout << "Glueckwunsch! Sie haben die Zahl erraten!" << endl << endl; }
-
bool spielergefunden; bool computergefunden; ZugSpieler(); ZugComputer(); if(spielergefunden&&!computergefunden) cout<<"sie haben gewonnen"; else if(!spielergefunden&&computergefunden) cout<<"sie haben verloren"; else if(anzahlspieler<anzahlcomputer) cout<<"sie haben gewonnen"; else if(anzahlspieler>anzahlcomputer) cout<<"sie haben verloren"; } else { cout << "Gleichstand!" << endl; } cout << "Nochmal?(y/n)" << endl; do cin.get(restart); while(restart == 'y'); }
habs mal korrigiert
so, so is es richtig, kürzer gehts nur mit "||"
-
es funktioniert noch immer nicht richtig.... ich habe es getestet. Ich habe die Zahl erraten und der computer nicht und trotzdem stand da, dass ich verloren habe.
Zudem schließt sich dsa Fenster sofort wieder nachdem der Computer dran war. Also dein while(restart == 'y') hilft leider nicht...
-
fehler(dickes plural) gefunden,hier der neue "leicht" veränderte code
#include <iostream> using namespace std; void ZugComputer(bool& computergefunden,int& anzahlcomputer); void ZugSpieler(bool& spielergefunden,int& anzahlspieler); int main() { cout << " ***********RATESPIEL*********** " << endl; srand(time(NULL)); char restart = 'y'; while(restart == 'y') { restart = 'n'; int anzahlcomputer = 0; int anzahlspieler = 0; bool spielergefunden=false; bool computergefunden=false; ZugSpieler(spielergefunden,anzahlspieler); ZugComputer(computergefunden,anzahlcomputer); if(spielergefunden&&!computergefunden) cout<<"sie haben gewonnen"<<endl; else if(!spielergefunden&&computergefunden) cout<<"sie haben verloren"<<endl; else if(anzahlspieler<anzahlcomputer) cout<<"sie haben gewonnen"<<endl; else if(anzahlspieler>anzahlcomputer) cout<<"sie haben verloren"<<endl; else cout << "Gleichstand!" << endl; cout << "Nochmal?(y/n)" << endl; cin>>restart; } } void ZugComputer(bool& computergefunden,int& anzahlcomputer) { int anzahl = 0; int obergrenze = 15; int untergrenze = 0; int vorherigezahl = 0; //zahl, die der computer tippt int gesuchtezahl = (rand() % 15) +1; while( anzahl < 3 && !computergefunden) { neu: srand(time(NULL)); if(vorherigezahl < gesuchtezahl) //falls die zahl des Computers kleiner ist { //dann rechnet er diese schritte untergrenze = vorherigezahl; vorherigezahl = obergrenze - untergrenze; vorherigezahl = vorherigezahl / 2; vorherigezahl = vorherigezahl + ((rand() % 4) -2); vorherigezahl = untergrenze + vorherigezahl; } if(vorherigezahl > gesuchtezahl) //falls die zahl des Computers größer ist { //dann rechnet er diese schritte obergrenze = vorherigezahl; vorherigezahl = obergrenze - untergrenze; vorherigezahl = vorherigezahl / 2; vorherigezahl = vorherigezahl + ((rand() % 4) -2); vorherigezahl = obergrenze - vorherigezahl; } if(vorherigezahl == obergrenze || vorherigezahl == untergrenze || vorherigezahl > obergrenze || vorherigezahl < untergrenze) goto neu; cout << vorherigezahl << " "; //hier wird die zahl ausgegeben if(vorherigezahl < gesuchtezahl) //hier wird sie mit der zufallszahl verglichen cout << " zu klein!" << endl; else if(vorherigezahl > gesuchtezahl) cout << " zu gross!" << endl; else computergefunden = true; anzahl++; //anzahl der versuche wird um 1 erhöht anzahlcomputer++; } if(!computergefunden) cout << "Der Computer hat die Zahl nicht erraten!" << endl << "Die gesuchte Zahl: " << gesuchtezahl << endl; else cout << endl << "Der Computer hat die Zahl erraten!" << endl; } void ZugSpieler(bool& spielergefunden,int& anzahlspieler) { int eingabe; int anzahl = 0; int gesuchtezahl = (rand() % 15) +1; while( anzahl < 3 && !spielergefunden) { cin >> eingabe; anzahl++; if(eingabe < gesuchtezahl) cout << " zu klein!" << endl; else if(eingabe > gesuchtezahl) cout << " zu gross!" << endl; else spielergefunden = true; anzahlspieler++; } if(!spielergefunden) cout << "Sie haben die Zahl nicht erraten!" << endl << "Die gesuchte Zahl: " << gesuchtezahl << endl << endl; else cout << "Glueckwunsch! Sie haben die Zahl erraten!" << endl << endl; }
-
okay danke otze... es funktioniert....
-
der computer is aber nich sehr schlau, hat grad bei mir 2mal jintereinander "3" gesagt
-
das geht doch eigentlich gar nicht....
if(vorherigezahl == obergrenze || vorherigezahl == untergrenze ||
vorherigezahl > obergrenze || vorherigezahl < untergrenze)
goto neu;verhindert das doch... also bei mir hat er noch nie 2mal hintereinander die selbe zahl genannt....
-
eben, das hat mich ja auch gewundert,scheint auch nur vorzukommen, wenn der wert nahe am maximum/minimum ist