Schreiben Sie ein Java-Programm, welches das Spiel Mastermind simuliert. Dieses
Spiel wird von einem Spieler und dem Computer nach folgenden Regeln gespielt:
(i) Der Computer bestimmt ein zuf¨alliges Wort der L¨ange 4 aus vier verschiedenen
Zeichen ∈ {′A′,′ B′, . . . ,′ H′} (Geheimwort), das der Spieler erraten muss. F¨ur
alle solchen W¨orter ist die Wahrscheinlichkeit, dass sie vom Computer gew¨ahlt
werden, jeweils gleich groß (d.h., die zuf¨allige Auswahl ist gleichverteilt).
(ii) Der Spieler versucht nun, das Geheimwort zu erraten, indem er in einer begrenzten
Anzahl von Versuchen (maximal 12) vierbuchstabige W¨orter eingibt.
(iii) Nach jedem Versuch meldet ihm der Computer,
• wieviele Zeichen in dem geratenen Wort an der richtigen Stelle stehen und
• wieviele Zeichen des geratenen Wortes zwar im Geheimwort vorkommen,
dort aber an einer anderen Stelle stehen.
Beispiel: Geheimwort = “FDAC”, Rateversuch = “AFHC”
⇒ 1 Zeichen an der richtigen Position,
2 weitere Zeichen enthalten, aber an der falschen Stelle.
(iv) Das Spiel endet, sobald der Spieler das Geheimwort erraten hat (gewonnen),
oder nach dem 12. Rateversuch des Spielers (verloren).
Beachten Sie bei Ihrer Implementierung folgende Punkte:
a) Ber¨ucksichtigen Sie, dass in einem Geheimwort kein Zeichen mehrfach vorkommen
darf! Die W¨orter “ABBC” und “HEBE” sind also keine g¨ultigen Geheimw
¨orter. Trotzdem soll jedes g¨ultige Geheimwort mit der gleichen Wahrscheinlichkeit
vorkommen k¨onnen.
b) Der Aufruf Zufall.zufallszeichen(x) liefert f¨ur einen char
x ∈ {′A′,′ B′,′ C′, . . . ,′ Z′} einen zuf¨alligen char zwischen ′A′ und x (jeweils einschließlich).
Sie k¨onnen davon ausgehen, dass die so erzeugten “Zufallsbuchstaben”
gleichverteilt sind. Bedenken Sie bei der Verwendung dieser Funktionalit¨at
jedoch, dass wiederholte Aufrufe von Zufall.zufallszeichen(x) prinzipiell
beliebig oft nacheinander das gleiche Zeichen zur¨uckgeben k¨onnen, die Erzeugung
des Geheimwortes jedoch trotzdem immer terminieren sollte. Sie sollten
Zufall.zufallszeichen(. . .) insgesamt h¨ochstens viermal aufrufen, um das
Geheimwort zu erzeugen.
c) Das Spiel soll dann mittels einer do-while-Schleife durchgef¨uhrt werden. Falls
der Spieler s¨amtliche Zeichen richtig geraten hat, soll die do-while-Schleife
mittels einer break-Anweisung verlassen werden.
d) Beim Rateversuch brauchen Sie nicht zu ¨uberpr¨ufen, ob alle vom Spieler eingegebenen
Zeichen verschieden sind. Sie sollten jedoch Eingaben ablehnen, die
nicht aus genau vier Zeichen bestehen.
e) Geben Sie das Ergebnis des Spielers aus, d.h., in wievielen Versuchen das Geheimwort
erraten wurde, oder ob es nach zw¨olf Versuchen nicht erraten wurde.
f) Geben Sie weiterhin im Fall, dass der Spieler verloren hat, das Geheimwort
aus.
Hinweise:
• Wie auch schon bei Aufgabe 4 von ¨Ubungsblatt 2 k¨onnen Sie hier wieder auf
die Methoden IO.length(String s) und IO.charAt(String s, int i) zur¨uckgreifen,
um die L¨ange und den Inhalt eines Strings auszulesen.
• Ebenfalls k¨onnen Sie wieder die Funktion IO.readLine() zum Einlesen eines
Strings benutzen.
• Sie k¨onnen die gleichen Vergleichsoperationen wie bei ints verwenden, um zwei
chars anhand ihrer Position im Alphabet zu vergleichen. Beispielsweise w¨urde
der Ausdruck ’D’ > ’A’ zu true ausgewertet.
• Ebenso kann man z.B. auch den Buchstaben, der im Alphabet auf einen gegebenen
Buchstaben folgt, wie folgt erhalten:
char c = ’A’;
++c;
// c hat jetzt den Wert ’B’
hat jemand eine IdeE?
Spiel wird von einem Spieler und dem Computer nach folgenden Regeln gespielt:
(i) Der Computer bestimmt ein zuf¨alliges Wort der L¨ange 4 aus vier verschiedenen
Zeichen ∈ {′A′,′ B′, . . . ,′ H′} (Geheimwort), das der Spieler erraten muss. F¨ur
alle solchen W¨orter ist die Wahrscheinlichkeit, dass sie vom Computer gew¨ahlt
werden, jeweils gleich groß (d.h., die zuf¨allige Auswahl ist gleichverteilt).
(ii) Der Spieler versucht nun, das Geheimwort zu erraten, indem er in einer begrenzten
Anzahl von Versuchen (maximal 12) vierbuchstabige W¨orter eingibt.
(iii) Nach jedem Versuch meldet ihm der Computer,
• wieviele Zeichen in dem geratenen Wort an der richtigen Stelle stehen und
• wieviele Zeichen des geratenen Wortes zwar im Geheimwort vorkommen,
dort aber an einer anderen Stelle stehen.
Beispiel: Geheimwort = “FDAC”, Rateversuch = “AFHC”
⇒ 1 Zeichen an der richtigen Position,
2 weitere Zeichen enthalten, aber an der falschen Stelle.
(iv) Das Spiel endet, sobald der Spieler das Geheimwort erraten hat (gewonnen),
oder nach dem 12. Rateversuch des Spielers (verloren).
Beachten Sie bei Ihrer Implementierung folgende Punkte:
a) Ber¨ucksichtigen Sie, dass in einem Geheimwort kein Zeichen mehrfach vorkommen
darf! Die W¨orter “ABBC” und “HEBE” sind also keine g¨ultigen Geheimw
¨orter. Trotzdem soll jedes g¨ultige Geheimwort mit der gleichen Wahrscheinlichkeit
vorkommen k¨onnen.
b) Der Aufruf Zufall.zufallszeichen(x) liefert f¨ur einen char
x ∈ {′A′,′ B′,′ C′, . . . ,′ Z′} einen zuf¨alligen char zwischen ′A′ und x (jeweils einschließlich).
Sie k¨onnen davon ausgehen, dass die so erzeugten “Zufallsbuchstaben”
gleichverteilt sind. Bedenken Sie bei der Verwendung dieser Funktionalit¨at
jedoch, dass wiederholte Aufrufe von Zufall.zufallszeichen(x) prinzipiell
beliebig oft nacheinander das gleiche Zeichen zur¨uckgeben k¨onnen, die Erzeugung
des Geheimwortes jedoch trotzdem immer terminieren sollte. Sie sollten
Zufall.zufallszeichen(. . .) insgesamt h¨ochstens viermal aufrufen, um das
Geheimwort zu erzeugen.
c) Das Spiel soll dann mittels einer do-while-Schleife durchgef¨uhrt werden. Falls
der Spieler s¨amtliche Zeichen richtig geraten hat, soll die do-while-Schleife
mittels einer break-Anweisung verlassen werden.
d) Beim Rateversuch brauchen Sie nicht zu ¨uberpr¨ufen, ob alle vom Spieler eingegebenen
Zeichen verschieden sind. Sie sollten jedoch Eingaben ablehnen, die
nicht aus genau vier Zeichen bestehen.
e) Geben Sie das Ergebnis des Spielers aus, d.h., in wievielen Versuchen das Geheimwort
erraten wurde, oder ob es nach zw¨olf Versuchen nicht erraten wurde.
f) Geben Sie weiterhin im Fall, dass der Spieler verloren hat, das Geheimwort
aus.
Hinweise:
• Wie auch schon bei Aufgabe 4 von ¨Ubungsblatt 2 k¨onnen Sie hier wieder auf
die Methoden IO.length(String s) und IO.charAt(String s, int i) zur¨uckgreifen,
um die L¨ange und den Inhalt eines Strings auszulesen.
• Ebenfalls k¨onnen Sie wieder die Funktion IO.readLine() zum Einlesen eines
Strings benutzen.
• Sie k¨onnen die gleichen Vergleichsoperationen wie bei ints verwenden, um zwei
chars anhand ihrer Position im Alphabet zu vergleichen. Beispielsweise w¨urde
der Ausdruck ’D’ > ’A’ zu true ausgewertet.
• Ebenso kann man z.B. auch den Buchstaben, der im Alphabet auf einen gegebenen
Buchstaben folgt, wie folgt erhalten:
char c = ’A’;
++c;
// c hat jetzt den Wert ’B’
hat jemand eine IdeE?