Hallo, bei folgendem Code soll der Benutzer eine Zahl erraten, die sich der Computer "ausgedacht" hat. Zusätzlich soll es drei Schwierigkeitsgrade geben.
Ich glaube das die while-Schleife für diesen Teil des Codes das komplette Programm blockiert, denn wenn ich sie auskommentiere, habe ich so viele Versuche wie ich will, wenn ich sie wieder einfüge, habe ich nur einen Versuch, die Zahl zu erraten, danach geht nichts mehr. Vielleicht ist es auch ein Denkfehler. Vielen Dank für eure Hilfe.
Java:
publicstaticvoidmain(String[] args){int wertebereich =100;//Die "ausgedachte" Zahl kann von 0 bis 100 gehen.errateZahl(wertebereich);}publicstaticinterrateZahl(int wertebereich){Scanner s =newScanner(System.in);int zufallsZahl =(int)(Math.random()* wertebereich);System.out.println(zufallsZahl);//Zum überprüfen gebe ich sie jedes Mal mit aus.System.out.println("Welchen Schwierigkeitsgrad möchten Sie spielen? (leicht, mittel, schwer): ");String grad = s.next();System.out.println("Geben Sie Ihre Zahl ein: ");int rateZahl = s.nextInt();int i =1;boolean quit =false;while(rateZahl!=zufallsZahl){//Diese Schleife überprüft, ob man die Zahl schon erraten hat.if(rateZahl<zufallsZahl){System.out.println("Die Zahl "+rateZahl+" war zu klein. Versuchen Sie es noch mal: ");}elseif(rateZahl>zufallsZahl){System.out.println("Die Zahl "+rateZahl+" zu groß. Versuchen Sie es noch mal.");}
rateZahl = s.nextInt();//Falls man die Zahl nicht erraten hat, kommt hier der nächste Versuch.
i++;while(quit ==false){//Diese Schleife ist das Problem. Wenn ich sie raus nehme, klappt alles wie vorher, ich habe unbegrenzte Versuche. Ist sie drin, kann ich nur ein mal raten. Es kommt dann nicht einmal die Meldung "Sie haben die Anzahl von Versuchen überschritten".if(grad.equals("leicht")&& i>20){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}elseif(grad.equals("mittel")&& i>15){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}elseif(grad.equals("schwer")&& i>10){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}}}System.out.println("***ERRATEN*** Herzlichen Glühstrumpf!!! Sie haben "+ i+" Versuche gebraucht.");return zufallsZahl;}}
Soetwas findet man ganz exzellent mit einem Debugger (Teil einer jeden Java IDE) heraus. Schau dir mal ganz genau die Schleife an:
Java:
while(quit ==false){if(grad.equals("leicht")&& i >20){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}elseif(grad.equals("mittel")&& i >15){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}elseif(grad.equals("schwer")&& i >10){
quit =true;System.out.println("Sie haben die Anzahl von Versuchen überschritten.");}}
Dies ist deine Endlosschleife, weil es sehr viele Wege durch diese Schleife gibt, die nicht dafür sorgen, dass quit = true wird.
Es wird also keiner der drei if-else-if-Fälle betreten, somit ändert sich nichts an der Bedingung der Schleife und somit macht sie unendlich lange weiter.
Erstmal vielen Dank für die schnelle Antwort😄. Ich denke ein "i > 20 && i <22" würden das Problem beheben, oder. Gilt natürlich für alle drei Fälle. Das probiere ich gleich aus.
Also ungeachtet dessen, dass diese Bedingung völlig willkürlich ist und dasselbe ist wie `i == 21`: Nein, würde es nicht.
Ich frage mich, warum du da überhaupt eine Schleife verwendest.
Hmm..., hast Recht! Erlich gesagt, wüsste ich nicht, wie ich es sonst machen könnte. Ich programmiere noch nicht lange, merkt man. Was wäre denn dein Lösungsweg?
Edit: jetzt fällt mir auf, ich habe bei der Schleife das i++ und oben das i vergessen🤦♂️
Edit2: ändert nichts...
Abend!
Versuch mal die zweite Schleife weg zu lassen. Außerdem hab ich fürs Beispiel einen Switch-Block verwendet... geht natürlich auch mit
if / else if /else...
LG
Java:
publicstaticvoidmain(String[] args){int wertebereich =100;errateZahl(wertebereich);}@SuppressWarnings("resource")publicstaticinterrateZahl(int wertebereich){Scanner s =newScanner(System.in);int zufallsZahl =(int)(Math.random()* wertebereich);System.out.println(zufallsZahl);System.out.println("Welchen Schwierigkeitsgrad möchten Sie spielen? (leicht, mittel, schwer): ");String grad = s.next();int max =0;switch(grad){case"leicht":{
max =20;break;}case"mittel":{
max =15;break;}case"schwer":{
max =10;break;}default:System.out.println("Ungültige Eingabe: "+ grad);return zufallsZahl;}int rateZahl =0;int sMax = max;while(max >0){System.out.println("Geben Sie Ihre Zahl ein: ");
rateZahl = s.nextInt();
max--;if(max <=0){System.out.println("traurig schon alle Versuche von "+ sMax +" weg :(");break;}if(rateZahl<zufallsZahl){System.out.println("Die Zahl "+rateZahl+" war zu klein. Versuchen Sie es noch mal: ");}if(rateZahl>zufallsZahl){System.out.println("Die Zahl "+rateZahl+" zu groß. Versuchen Sie es noch mal.");}if(rateZahl == zufallsZahl){System.out.println("***ERRATEN*** Herzlichen Glühstrumpf!!! Sie haben "+(sMax-max)+" Versuche gebraucht.");break;}}return zufallsZahl;}
Morgen! Vielen Dank für deine Antwort😄. Ich werde das ganze mal mit if/else Verweigungen ausprobieren, weil mir Switch-Blöcke noch nicht so bekannt sind.
Habe jetzt die while-Schleife raus genommen. Es klappt, allerdings bricht das Programm nicht ab, nachdem die Anzahl der Versuche überschritten wurde, was ich ja mit der Schleife errichen wollte. Gibt es da noch eine Möglichkeit, die Anfänger freundlich ist?
Wie meinst du das? Bis auf den Switch-Block und das @SuppressWarnings hielt ich meinen Code für ziemlich anfängerfreundlich...
Ich weiß nicht ob du jetzt etwas von mit übernommen hast oder nicht ich empfehle dir jedenfalls die Versuche immer zu verringern
(also --) und in die while genau diese Bedingung rein zu schreiben und nicht einfach ein boolean
Also...
Java:
int versuche =10while(versuche >0){
versuche--;//Dein Code}//Alle Versuche durchgelaufen!