Java Zahlenspiel

Renjiroo

Mitglied
Hallo,
Ich muss für eine Aufgabe ein Zahlenspiel programmiere, wo sich der Nutzer eine Zahl zwischen 1 - 1000 aussuchen muss und der Computer die Zahl erraten muss.
Meine Idee war, dass ganze mit einer Do while Schleife zu machen, wo der Computer immer wieder was abfragt und den neuen Wert bei einer neuen Methode immer wieder in die Main Methode zurückzugeben. Aber in Zeile 42 ist (guess) rot unterstrichen und das ganze Programm funktioniert deswegen nicht. Hier der Code. Also ganz unten unter der neuen Methode bei int guess ist (guess) rot unterstrichen
Java:
import java.util.Scanner;

public class zahlenspiel {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int max = 1000, min = 1, lightsaber;
        
        System.out.println("Denken sie sich irgendeine Zahl zwischen 1 bis 1000 aus: ");
        
        
        int guess = (max + min) / 2;
        guess = nextGuess(guess, max, min);
        do {
            System.out.println("ist ihre Zahl größer oder kleiner als die Zahl 500?");
            System.out.println("Wenn die Zahl gleich die angegebene Zahl ist drücke sie die 1");
            System.out.println("Wenn die Zahl keliern als die angegebene Zahl ist drücke sie die 2");
            System.out.println("Wenn die Zahl größer als die angegebene Zahl ist drücke sie die 3");
            System.out.println("Ihre Eingabe: ");
           lightsaber  = sc.nextInt();
            
            if(lightsaber == 1) {
                System.out.println("Gewonnen!");
            }
            else if(lightsaber == 2) {
                guess = max;
                guess = nextGuess(guess, max, min);
                
            }
            else if(lightsaber == 3) {
                guess = min;
                guess = nextGuess(guess, max, min);
                
            }
            else {
                System.out.println("Falsche eingabe");
            }
        } while(lightsaber != 1);
        
    }
    public static int nextGuess(int guess, int max, int min) {
        int guess = (max + min ) / 2;
        return guess;
        
    }
}
 
Die Variable wird ja zweimal erstellt einmal bei der Übergabewert und dann noch mal in der Methode.

Eigentlich brauchst du nur min und max übergeben.

Java:
public static int nextGuess( int max, int min) {
        int guess = (max + min ) / 2;
        return guess;
      
    }

oder
Java:
public static int nextGuess(int guess, int max, int min) {
        guess = (max + min ) / 2;
        return guess;

nur ob der Code auch der richtigen Logik entspricht teste selbst.
 
Zuletzt bearbeitet:
Was mir zuerst auffälllt:
in den <und > Bedingungen, da würde man meines Verständnisses nach doch min=guess bzw. max=guess zuordnen.
und nicht umgekehrt?
Weil man passt ja hier je nahc Fall die Ober oder die Untergrenze an.
Und im 2. Schritt wird mit der Folgezeile dann von diesen neuen grenzen abhängig dann die guess Zahl geändert.
Erst Grenze ändern, dann neue guess Zahl wählen.




Auch aufpassen muss man dass das Ganze irgendwann auch sicher mit einem Ergebnis endet.
Was ich meine:
Sagen wir mal, die Zahl 1000 wird gesucht.
Und zu einem Zeitpunkt hast du min=999 und max=1000.
folglich wird guess=(999+1000)/2, also 999,5 was auf 999 abgerundet wird.
Nutzer sagt ist zu klein.
Also wird die Untergrenze geändert: min=guess=999.
Nun sind min=999 und max=1000.

Merkste was?
Egal wie oft du den Nutzer fragst und er dir sasgt, du liegst zu niedrit, du wirst nicht schaffen dass guess von 999 auf 1000 hochgesetzt wird.
Wie lösen?
Simpel:
Wenn du wie hier den Fall ahst dass min und max nur 1 Zahl voneinander entfernt sind und du findest durch Nachfrage mit guess raus dass bspw. 999 die falsche Zahl ist.
Na, dann muss doch 1000 die richtige Zahl sein, oder?
Kurzum, wenn du in so einer Situation bist wo die Grenwzen direkt nebeneinander liegen und du als Antwort erhälst, dass guess falsch war, dann muss die Grenze richtig sein die nicht abgefragt wurde.

Ist eine simple if-Abfrage die du da an 2 Stellen einbauen musst.

Nur so meine 2 kurzen Ideen dazu.
Ach, eins noch:
Ich würde auch die Konsolenausgabe anpassen dass da wirklich gefragt wird ob die vom Nutzzer gewählte Zahl größer oder kleiner als dein guess Wert ist.Und nicht immer nahc < oder > 500 gefragt wird.

Wobei das jetzt wirklich unwichtig ist, wichtiger sind die ersten beiden Punkte.
Erstens dass nahc jeder Abfrage mit Ergebnis (falls Zahl nichtnerraten wurde) auch eine der beiden Grenzen angepasst wird (und nicht nur die guess Zahl erst auf einen grenzwert und dann wieder mittels nextGuess auf was Ganz Anderes gesetzt wird.

Und dann halt noch mittels 2er if Bedingungen die Fälle abfangen wo man zwischen 2 nebeneinanderliegenden Zahlen die Richtige finden muss.

Nutzer sagt guess ist zu klein, also lightsaber=3.
Nun geht dein aktueller Algorithmus ja hin, macht erst min=guess (also min=999), bestimmt (999+1000)/2, was 999.5 ergibt, was ja automatisch abgerundet wird zu guess=
 
Das mit der Zuweisung hast du richtig gesehen.

Das Problem mit den Grenzen ist aber anders lösbar. Beispiel: 1-10 als Range: es wird 5 geraten und die 5 war falsch:
Dann ist der zu Suchende Wert entweder kleiner, d.h. 1-4, oder er ist größer, d.h. 6-10.
Statt guess ist also guess-1 bzw. guess+1 zu verwenden.
 
Das mit der Zuweisung hast du richtig gesehen.

Das Problem mit den Grenzen ist aber anders lösbar. Beispiel: 1-10 als Range: es wird 5 geraten und die 5 war falsch:
Dann ist der zu Suchende Wert entweder kleiner, d.h. 1-4, oder er ist größer, d.h. 6-10.
Statt guess ist also guess-1 bzw. guess+1 zu verwenden.
klar, wenn die guess zahl zu klein war, ist die nächstgrößere die lösung und umgekehrt. Haste Recht.
 

Zurück
Oben