Schaffe es nicht Random-Programmierung zu vollenden. Wo liegt der Fehler in diesem Code?

RememberdiAlamo

Aktives Mitglied
Hallo 🙂
Ich hab hier ein kleines Problemchen mit der Programmierung. Die Aufgabe lautet:
Bestimmen Sie in Ihrem Programm per Zufallsgenerator eine ganze Zahl wischen 0 und 20. Raten Sie diese Zahl, indem Sie über eine Dialogbox eine Zahl eingeben. Dieser Vorgang wird wiederholt, bis die Zahl erraten wurde. Ein etsprechender Text soll ausgegeben werden. Wenn richtig (true) dann soll das Programm beendet werden, falls falsch, die Zahl nochmal eingegeben werden.

Soo, ich habe mich an dieser (für mich) sehr schwierigen Aufgabe versucht und nach über 2 Stunden mühseligem herumfurwerkeln kam ich auf "das" hier: :autsch:
Java:
import javax.swing.JOptionPane;
class random{
	public static void main (String[] args) {
	
	//Variablen festlegen
	String eingabe, ausgabe;
	int zufall, zahl;
	zufall = (int)(Math.random()*21);
	
	//initializieren
	eingabe = JOptionPane.showInputDialog("Gib eine Zahl zwischen 0 und 20 an");
	zahl = Integer.parseInt (eingabe);
	
		//Fallunterscheidung
		if (zahl>20) {
			ausgabe = "Die Zahl"+zahl+" liegt nicht innerhalb der begrenzten Auswahlmöglichkeit.Gib eine andere ein";
		}
			
		else if ((zahl >= 0) && (zahl <=20)) {
			ausgabe = "Die Zufallszahl ist die "+zufall+". ist das die Zahl, die du eraten hast?";
		}
		
		//Ergebnis
		JOptionPane.showMessageDialog (null, ausgabe);
		
		
	}
}
Wie man sehen kann bin ich nichtmal zu dem Teil gekommen, wo ich die ganze true/false, continue/exit
Anweisungen programmieren sollte. Da steht immer "variable ausgabe might not have been initialized."

Ich bin mir nicht sicher ob es an der Random liegt. Gebe ich das vereinfacht so ein in den Compiler
Java:
class random2{
	public static void main (String[] args) {
	
		int zufall = (int)(Math.random()*21);
			System.out.println(zufall);
		
	}
}
so erlange ich zufällige Zahlenwerte.
Wäre daher nett, wenn mir jemand damit helfen könnte.
 
Zuletzt bearbeitet:
Ja die Fehlermeldung ist ja eindeutig. Der compiler hat Angst das deine "ausgabe" nicht initialisiert ist, wenn es dann unten zur Anzeige kommt:
Java:
//Fallunterscheidung        
if (zahl>20) {            
    ausgabe = "Die Zahl"+zahl+" liegt nicht innerhalb der begrenzten Auswahlmöglichkeit. Gib eine andere ein";        
} else if ((zahl >= 0) && (zahl <=20)) {            
    ausgabe = "Die Zufallszahl ist die "+zufall+". ist das die Zahl, die du eraten hast?";        
}

Wenn Zahl größer als 20 .. schreib was in ausgabe
Sonst
Wenn Zahl zwischen 0 und 20 .. schreib was in ausgabe

Wenn beides nicht gilt (zahl < 20) .. dann ist Ausgabe nicht initialisiert!
 
Hej, hast nur nen logischen Denkfehler drin.
Das sollte schon eher funktionieren.
Java:
  if (zahl>20 || zahl < 0) {
            ausgabe = "Die Zahl"+zahl+" liegt nicht innerhalb der begrenzten Auswahlmöglichkeit.Gib eine andere ein";
        }
           
        else {
            ausgabe = "Die Zufallszahl ist die "+zufall+". ist das die Zahl, die du eraten hast?";
        }

grüße!
 
Zuletzt bearbeitet:
Nö, da es eine lokale Variable ist, wird diese nicht initialisiert, d.h. da ist kein Speicherplatz reserviert worden.
Schreib doch einfach:

String ausgabe = "";

oder mach einen else-Teil an den Teil, wo du ausgabe setzt und schreib dort:

ausgabe = "Unerwrteter Fall ist eingetreten";
 
Wenn die Beschreibung einen Text der Form "so lange, bis" beinhaltet, ist das ein quasi sicherer Hinweis, dass man eine Schleife brauchen wird 😉
 
zwar nicht das geworden was ich wollte, aber hier was was funktioniert hat :autsch:

Java:
//Deklaration 
            String eingabe, ausgabe ="";
      		int zahl;
      		int zufallsZahl;
            
            //Zahl per Zufall zwischen 0 und 10 bestimmen
            //random liefert Zahl mit 0<= zahl < 1
            zufallsZahl = (int)(Math.random()*11);
            
            
             
            //Werte ueber Dialogbox einlesen
            
            eingabe = JOptionPane.showInputDialog("Rate eine Zahl zwischen 0 und 10");
            zahl = Integer.parseInt (eingabe);
             
            //Fallunterscheidung und Schleife
            while(zahl != zufallsZahl){
            
                if (zahl < zufallsZahl && zahl > 0)
           			ausgabe = "hast nicht die richtige Zahl getroffen.";
           		else if (zahl > zufallsZahl && zahl < 11)
           			ausgabe = "Hast nicht die richtige Zahl getroffen.";
				else
					ausgabe = "Zahl muss zwischen 0 und 10 liegen";
           		
           		JOptionPane.showMessageDialog(null, ausgabe);
           		
           		eingabe = JOptionPane.showInputDialog("Versuchs nochmal");
            	zahl = Integer.parseInt (eingabe);
           		
          	}
          	
          	JOptionPane.showMessageDialog(null, "Gratuliere! Du hast grad wertvolle Zeit deines Lebens vergeudet! Willst du nochmal spielen?");
          
      }
      
}

Ich wollte das eigentlich mit true/false Optionen und wenn true ist dann soll das Programm beendet werden, wenn false,dann sollte es wiederholen. Etwas ähnliches wollte ich mit der PIN-Nummerabfrage machen. Wenn 3 mal falsch geraten wurde, dann soll sich das Programm nicht schließen sondern so zu sagen umleiten, dass man die PUK-Nummer eingeben muss.. Mir fehlt aber wohl noch die Übung :rtfm:
 
Zuletzt bearbeitet:
Deine Schleifenkonstruktion funktioniert bestimmt, hätte sie aber weniger kompliziert mit den if-Anweisungen gestaltet, denke ich. Liest sich irgendwie schwer.

Für deine PIN müsstest du nur noch eine Countervariable einbauen, die bei jeder Falscheingabe um einen hochzählt. (also in deinen Else-Abschnitt)

Wenn sie bei 3 angekommen ist, kannst du evtl. eine neue while-schleife starten, mit der PUK-Nummer.
 
damit ist ja sicherlich der inkrement ++ gemeint. Ja, hab das auch schon überlegt. Ich denke wohl einfach zu kompliziert.
Das mit der PUK, wär das nicht schon eher eine Array-Anweisung oder so? Sorry üfr meine Noobigkeit, bin aber erst seit 3 Wochen an Java dran...
 
Zuletzt bearbeitet:
Ich versuch mich ja auch erst seit letztem Samstag. =P

Die PUK, die denkst du dir ja aus. Ein Array bringt dir da nichts.
Du erstellst einfach eine int oder String Variable namens PUK mit einem vorgegebenen wert von.. keine Ahnung "12345" und vergleichst dann einfach wieder den eingegebenen Wert mit der PUK. Wenn die dann wieder 3x falsch ist, wird halt gesagt, das dein Rechner ab sofort gesperrt ist, du bekommst einen Bluescreen, ein paar Schwulenpornos auf den Desktop verlinkt und den Bundestrojaner noch dazu. 😉

Inkrement ist ganz einfach.
Countervariable erstellt.
Code:
int counter = 0;

dann in deiner else-anweisung einfach
Code:
counter = counter + 1
schreiben.
Weil die sagt ja, dass soeben etwas falsches eingegeben wurde.

und anschließend gleich eine neue if-Bedingung einbauen, die checkt, ob counter >= 3 ist..
und dann käme von mir aus deine neue while-schleife mit der PUK nach dem gleichen Prinzip.

Grüße.
 
Zuletzt bearbeitet:
Java:
if (zahl < zufallsZahl && zahl > 0)
    ausgabe = "hast nicht die richtige Zahl getroffen.";
else if (zahl > zufallsZahl && zahl < 11)
    ausgabe = "Hast nicht die richtige Zahl getroffen.";
else
    ausgabe = "Zahl muss zwischen 0 und 10 liegen";

Könnte man auch optimieren zu:
Java:
int max = 10; ////zahl für obere Grenze definieren, gerne auch final static als Klassenattribut
int zufallsZahl = (int) (Math.random() * (max+1)); //Zufallszahl in Abhaengigkeit dieser Variable

while (...) {
    if (zahl < 0 || zahl > max) { //Grenzwertüberschreitung checken
        ausgabe = "Zahl muss zwischen 0 und " + max + " liegen";
    } else if (zahl >= 0 && zahl <= max) { //Zahl im gueltigen Bereich, aber falsch
        ausgabe = "Hast nicht die richtige Zahl getroffen.";
    }

   ...
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben