Java Zahl erraten?

1 Antwort

Guten Abend,

an sich sieht das schonmal nicht falsch aus.

Dein Code:

Random random = new Randon();
int numberToGuess = random.nextInt(100) + 1;

System.out.println("Rate eine Zahl");
int guess = scanner.nextInt();

while(guess != numberToGuess); {
if(guess < numberToGuess) {
System.out.println("Meine Zahl ist größer");
}
else {
System.out.println("Meine Zahl ist kleiner");
}
System.out.println("Richtig die Zahl ist" + numberToGuess);

}

Was macht dein Programm?

Dein Programm soll eine zufällige Zahl zwischen 1 und 100 erstellen und diese in eine integer Variable mit dem Namen "numberToGuess" speichern.

Danach wird vom System eine Zeile ausgegeben in der ausgegeben in der steht: "Rate eine Zahl".

In der Eingabezeile kann man dann eine Zahl reinschreiben die in eine integer Variable gespeichert werden soll mit dem Namen "guess".

Danach wird eine Schleife gestartet die sich so lange wiederholt wie die Zahl in der Variable "numberToGuess" und "guess" unterschiedlich ist.

In der ersten if-Abfrage wird dann gefragt ob die Zahl in der Variable "guess" kleiner ist als die Zahl in der Variable "numberToGuess", wenn der Fall eintrifft soll vom System aufgegeben werden das die zu erratene Zahl größer ist als die angegebene Zahl ("Meine Zahl ist größer").

In allen anderen Fällen wird ausgegeben das die eingegebene Zahl größer ist als die zu erratene Zahl ("Meine Zahl ist kleiner").

Danach wird jedes mal wenn die Schleife durch läuft vom System ausgegeben was die richtige Zahl ist.

Welche Syntaxfehler sind vorhanden?

In der Zeile in dem du die Schleife beginnst steht: "while(guess != numberToGuess); {". Der Fehler ist das du nach der schließenden Klammer ein Semikolon (";"). Das Semikolon sagt dem System das dort eine Zeile endet und dementsprechend wird die Schleife nicht weiter ausgeführt und der Debugger wird ein Fehler auswerfen das er mit der Zeile nix anfangen kann.

Zudem sind die notwendigen Classen von "Random" und "Scanner" nicht importiert. Das System weis gar nicht was er mit den Funktionen die du dort hingeschrieben hast anstellen soll weil die Dateien dazu fehlen,

Sonstige Fehler

In deinem Programm/Spiel wird der Nutzer/Spieler nur einmal aufgefordert eine Zahl einzugeben, dass bedeutet das die Schleife dauerhaft ausgeführt wird weil der Nutzer/Spieler keine Möglichkeit hat eine neue Zahl einzugeben.

Der Scanner wird am Ende nicht geschlossen um Ressourcen zu sparen.

Verbesserter Code

// Hier wird die "Random" Classe importiert
import.until.Random;
// Hier wird die "Scanner" Classe importiert
import.until.Scanner;

// Deklaration der Prozedur die bei Java ausgeführt wird
void main() {
// Erstellung einer neuen Scanner Klasse
Random random = new Random();
// Erstellung der "numberToGuess" Variable
int numberToGuess = random.nextInt(100) + 1;

// Erstellung einer neuen Scanner Klasse der gesagt wird das sie Eingaben in der Textzeile scannen soll
Scanner scanner = new Scanner(System.in);

// Ausgabe von "Rate eine Zahl"
System.out.println("Rate eine Zahl");
// Erstellung der "guess" Variable und die gescannte Zahl wird dort gespeichert
int guess = scanner.nextInt();

// Erstellung der Schleife die durchlaufen soll solange der Wert in der "numberToGuess" und die "guess" Variable ungleich ist
while(guess != numberToGuess) {
// Erste if-Abfrage ob die "guess" Variable über 100 ist weil die größte Zahl die geraten werden kann 100 ist
if(guess > 100) {
// Ausgabe von "ERROR: Wähle eine Zahl zwischen 1 und 100"
Sysem.out.prinln("ERROR: Wähle eine Zahl zwischen 1 und 100");
// Zweite if-Abfrage ob die "guess" Variable kleiner ist als die "numberToGuess" Variable
else if(guess < numberToGuess) {
// Ausgabe von "Meine Zahl ist kleiner"
System.out.println("Meine Zahl ist kleiner");
// Dritte if-Abfrage ob die "guess" Variable größer ist als die "numberToGuess" Variable
else if(guess > numberToGuess) {
// Ausgabe von "Meine Zahl ist größer"
System.out.println("Meine Zahl ist größer");
// Jetzt kommt der else-Teil in dem nur Werte in der "guess" Variable ankommen können die ungleich der "numberToGuess" Variable ist, kleiner als 100 ist, wo der Wert in der "guess" Variable weder größer noch kleiner als der Wert in der "numberToGuess" Variable ist und wo der Datentyp nicht ein String ist. Also können hier nur noch Kommazahlen ankommen
else {
// Ausgabe von "Es dürfen nur ganze Zahlen angegeben werden"
System.out.println("Es dürfen nur ganze Zahlen angegeben werden");
// Schließende Klammer von dem if-else-Baum
}

// Ausgabe von "Rate eine neue Zahl"
System.out.println("Rate eine neue Zahl");
// Speichern von der neuen Zahl in der "guess" Variable
guess = scanner.nextInt();
// Schließende Klammer von der Schleife

}

// Ausgabe von "Richtig, die Zahl ist "numberToGuess"
System.out.println("Richtig, die Zahl ist:" + numberToGuess);
// Schließen von der "Scanner" Klasse um Ressourcen zu sparen
scanner.close();

// Schließende Klammer von der "Main" Funktion
}

Der korrigierte Code ist sehr unübersichtlich wegen den ganzen Kommentare, kopiere dir den Code in deine IDE. Dort sollten Kommentare und der gleichen farblich markiert sein. Befasse dich mit der Lösung und versuche zu verstehen was die einzelnen funktionen, Schleifen, if-Anweisungen, usw. zu bedeuten haben und was sie machen.

Es könnte sein das meine Lösung nicht 100% richtig ist weil ich selber das erste mal mit der "Scanner" Klasse arbeite. Chat GPT hat mir bei der Antwort geholfen.

Bei weiteren Fragen kannst du mir gerne dein Discord-Tag geben und ich adde dich für weitere Hilfe wenn du wirklich daran interessiert bist die Programmiersprache zu lernen.

Mit freundlichen Grüßen

Woher ich das weiß:Studium / Ausbildung

DragonAnime  26.07.2024, 13:10
// Hier wird die "Random" und "Scanner" Classe importiert
import.until.Random;
import.until.Scanner;

/*
Soweit ich weis und es gelernt habe ist die Main Prozedur, die Prozedur die beim Start des Programms automatisch ausgeführt wird. Das bedeutet in die Prozedur kommen dann der Code, die Prozeduren oder Funktionen die ausgeführt werden sollen.
*/

void main() {
  /*
  Hier wird eine zufällige Zahl erstellt und in der
  "numberToGuess" Variable gespeichert.
  */

  Random random = new Random();
  int numberToGuess = random.nextInt(100) + 1;

  /*
  Hier wird ein Scanner erstellt und gesagt das der Scanner
  die Werte aus der System Textzeile achten soll.
  */

  Scanner scanner = new Scanner(System.in);

  System.out.println("Rate eine Zahl");

  int guess = scanner.nextInt();

  /*
  Die while-Schleife beginnt sobald die Werte der Variablen
  "guess" und "numberToGuess" ungleich ist.

  In der ersten if-Abfrage wird dann abgefragt ob der Wert in
  der Variable "guess" größer als 100 ist trifft der Fall zu
  wird eine Warnung vom System ausgegeben das der
  Nutzer/Spieler nur Zahlen zwischen 1 und 100 benutzen darf.

  In der zweiten if-Abfrage wird abgefragt ob der Wert in der
  Variable "guess" kleiner ist als in der Variable
  "numberToGuess", wenn der Fall eintritt wird ausgegeben das
  die zu eratene Zahl größer ist als die angegebene.

  In der dritten if-Anweisung wird abgefragt ob der Wert in
  der "guess" Variable größer ist als in der "numberToGuess"
  Variable, tritt der Fall ein wird ausgegeben das die zu
  eratene Zahl kleiner ist als die angegebene.

  In dem else Teil werden dann alle anderen Fälle bearbeitet.

  Diese Fälle können nicht mehr auftretten:
  - "guess" != "numberToGuess"
  - "guess" ist größer als 100
  - "guess" ist kleiner als "numberToGuess"
  - "guess" ist größer als "numberToGuess"

  Das einzige was noch passieren kann ist das der
  Nutzer/Spieler eine Kommazahl eingegeben hat. Entweder wird
  das Programm/Spiel abstürtzen weil das Programm versucht
  eine Float-Zahl in einer Integer-Variable zu speichhern
  oder es wird aufgerundet/abgerundet oder sogar die
  Float-Zahl gespeichert wurde.

  Es sollten keine Kommazahlen auftauchen weil die "Random"
  Klasse soweit ich weis, nur ganze Zahlen in die
  "numberToGuess" Variable abspeichert.
  */

  while(guess != numberToGuess) {
      if(guess > 100) {
        Sysem.out.prinln("Sie dürfen nur eine Zahl zwischen 1 und 100 nehmen");
      else if(guess < numberToGuess) {
        System.out.println("Meine Zahl ist größer");
      else if(guess > numberToGuess) {
        System.out.println("Meine Zahl ist kleiner");
      else {
        System.out.println("Es dürfen nur ganze Zahlen angegeben werden");
      }

      /*
      Die Systemausgabe wo nach einer neuen Zahl gefragt wird
      muss hinter dem if-else-Paket einfach damit sobald das
      System entweder ausgegeben hat, dass die Zahl zu groß
      oder zu klein etc. wird dann jedes mal nach einer neuen
      Zahl gefragt.
      */

      System.out.println("Rate eine neue Zahl");
      guess = scanner.nextInt();
  }

  System.out.println("Richtig, die Zahl ist:" + numberToGuess);

  /*
  Am Ende des Programms solte man die "Scanner" Klasse noch
  beenden um Ressourcen zu sparen.
  */

  scanner.close();
}

/*
Tut mir leid für meine sehr unübersichtliche Antwort auf dein Beitrag, ich selber mache gerade mein Fachabi im Bereich Informations- und Kommunikationstechnik. 

An sich kann dir das egal sein. Ich möchte dir nur mitteilen das wir beigebracht bekommen das gerade beim lernen, es hilft auf einem Zettel zu schreiben was das Programm genau machen soll.

Am Ende wenn wir es dann testen und es funktioniert nicht, sollten wir immer oben anfangen und verschriftlichen was genau das Programm von oben nach unten macht.

Ich finde die Vorgehensweise ganz gut weil einem selber dann schnell kleine Fehler auffallen, gerade wenn man beispielsweise eine Funktion im Programm/Spiel vergessen hat.

Bei dir wäre ein gutes Beispiel das du bei deinem if-else-Paket jeweils vergessen hast nach einer neuen Zahl zu fragen (kein Front, ich versuche es nur zu verbildlichen).

Ansonsten wenn du Fragen hast und ein großes Interesse hast Java zu lernen kannst du mir gerne dein Discord-Tag geben oder mich hier bei gutefrage.net adden und direkt anschreiben.

Ich will aber anmerken das auch ich Fehler mache und nicht perfekt bin.
*/
0
Johannesvb 
Beitragsersteller
 26.07.2024, 13:08

Danke für deine Antwort. Es funktioniert jetzt. :)

0
DragonAnime  26.07.2024, 13:13
@Johannesvb

Seih bitte so nett, tu mir und dir den Gefallen noch kurz einmal meine Erklärung in dem neuen Kommentar zu lesen ^^

0
Johannesvb 
Beitragsersteller
 26.07.2024, 13:19
@DragonAnime

Danke für den Tipp, dass man den Code von oben nach unten durch geht. Ich glaube das wird mir helfen, wenn ich wieder ein Problem habe. Wenn ich es trotzdem nicht schaffe, schreibe ich dich gerne wieder an. Mfg

0
DragonAnime  26.07.2024, 12:33

@Johannesvb sry wegen meiner Antwort, ich sehe jetzt erst das der Quelcode den ich für dich verbessert hatte überhaupt nicht eingerückt ist was ich vorher mit viel Mühe versucht hatte haha. Ich werde hier drunter den Code nochmal eingerückt rein posten.

0
DragonAnime  26.07.2024, 08:45

Guten Morgen nochmal,

ich möchte zu meinem Beitrag noch erwähnen das ich keinerlei Antworten von Chat GPT hier in meinem Beitrag kopiert und eingefügt habe.

Ich habe die KI lediglich dazu genutzt um mich mit der Funktionsweise der "Scanner" Klasse auseinander zu setzen.

Mit freundlichen Grüßen

0