Java: Computer soll Zahl erraten?
Hallo, es geht um folgende Aufgabe: Der Spieler soll sich eine Zahl zwischen 1 und 1000 denken. Nun soll der Computer durch geschicktes Fragen innerhalb von 10 Versuchen diese Zahl erraten, natürlich ohne dass der Spieler ihm diese sagt. Meine Idee war, die Menge der möglichen Zahl als Intervall aufzufassen. Der Computer probiert es zunächst einmal mit der Mitte dieses Intervalls (am Anfang wäre es 500, denn 500 liegt genau in der Mitte von 1 und 1000). Dann fragt er den Spieler, ob die Zahl größer oder kleiner ist und passt dementsprechend das Intervall der möglichen Zahlen an, bis eben das Intervall so klein ist, bis er schließlich die richtige Zahl errät. Mit diesem Gedanken habe ich versucht, ein Programm zu schreiben, das aber leider nicht funktioniert und ich finde die Fehler einfach nicht selbst. Über Hilfe / Tipps würde ich mich sehr freuen! Danke!
import java.util.Scanner;
public class Aufgabe16 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// k dient als Zählvariable für die benötigten Versuche
int k = 0;
double g1, g2, mitte;
// g1 ist die linke Grenze des Intervalls, in der die Zahl liegen muss
g1 = 0;
// g2 ist die rechte Grenze des Intervalls, in der die Zahl liegen muss
g2 = 1000;
// mitte ist die Mitte des Intervalls
mitte = -1;
// n als Eingabe des Spielers
int n = -1;
System.out.println("Denke dir eine beliebige Zahl zwischen 1 und 1000.");
do {
// Versuche zählen
k = k + 1;
// Mitte des Intervalls berechnen
mitte = (g2 - g1) / 2;
System.out.println(mitte);
System.out.println("Ist die Zahl größer oder kleiner?");
System.out.println("Drücke 0 für kleiner); 1 für größer; 2 wenn richtig erraten");
n = input.nextInt();
if (n == 0) {
// Zahl ist kleiner als die Mitte des Intervalls
// also rechte Intervallgrenze anpassen
g2 = mitte;
} else {
if (n == 1) {
// Zahl ist größer als die Mitte des Intervalls
// also linke Intervallgrenze anpassen
g1 = mitte;
} else {
if (n != 2) {
// Wenn man was anderes als 0, 1, 2 eintippt, kommt Fehlermeldung
System.out.println("Inkorrekte Eingabe!");
}
}
}
// while-Schleife, bis der Spieler 2 drückt (richtig erraten)
} while (!(n == 2));
input.close();
System.out.println("Die Zahl wurde erraten. Sie lautet " + mitte + ".");
System.out.println("Der Computer hat " + k + " Versuche gebraucht.");
} }
3 Antworten
Zunächst: Dein Ansatz ist richtig, nennt man binäre Suche und ist immer in log_2(n) zu schaffen. für 1000 ist log_2(n)<10, da 2^10=1024.
Du berechnest die Mitte falsch, das ist alles ;-). Schau Dir einfach mal das Beispiel mit den hypotetischen Intervallgrenzen 700 und 900 an.
Die Lösung ist eher g1+(g2-g1)/2 (oder für die Badboys (g1+g2)/2 - In Anlehnung an den Mittelwert/das arithmetische Mittel).
Addier auf deine Mitte mal noch deine Untergrenze drauf.
Folgendes Beispiel:
Untergrenze: 125
Obergrenze: 250
Gesucht: 146
Mitte = (250-125)/2=125/2=62,5~62
Das dürfte ziemlich daneben gehen mit der Rechnung ^^.
Der Computer nimmt die Zahlenfolge 512 256 128 64 32 16 8 4 2 1 und je nachdem ob du höher oder niedriger sagst wird die nächste Zahl dazugezählt oder abgezogen – funktioniert immer in 10 Versuchen.