Java :: Aufgabe #203 :: Lösung #1
2 Lösungen

#203
Programmierung von MasterMind
Anfänger - Java
von hollst
- 02.07.2018 um 10:54 Uhr
MasterMind ist ein deduktives Spiel, das insbesondere Anfang der 70er Jahre sehr beliebt war.
Ziel des Spiels ist es, einen Geheimcode zu entschlüsseln.
In der klassischen Variante ordnet ein Spieler, genannt "codemaker", eine Sequenz von vier Symbolen
geheim an. Praktisch geschieht dies mittels unterschiedlich oder teilweise bzw. gänzlich
gleich gefärbter Pins oder Murmeln in einer Reihe, wobei maximal sechs Farben zur Verfügung stehen.
Ein zweiter Spieler, genannt "codebreaker", versucht durch Testmuster, gleichfalls bestehend aus vier gereihten
Symbolen (Pins/Murmeln), den Code zu erraten. Hätte der codebreaker 6 * 6 * 6 * 6 = 1.296 Versuche zur Verfügung,
wäre dies kein Problem, allerdings wird die Anzahl der Tests als Spielregel auf zwölf (manchmal weniger) begrenzt.
Als Responds auf ein Testmuster muss der codemaker zwei Informationen geben:
1.) Wieviele Symbole im Testmuster stehen an exakt der gleicher Stelle wie im Geheimmuster (im Falle vier, wäre das
Spiel für den codebreaker gewonnen) und
2.) wieviele Symbole (Pin-/Murmelfarben) sind sowohl im Geheim- als auch im Testmuster
vorhanden, allerdings nicht in übereinstimmender Position in der Reihe.
Die Programmieraufgabe bestehe nun darin, MasterMind interaktiv am PC zu simulieren, wobei der Computer als
codemaker fungiert, der zunächst per Zufallsgenerator das Geheimmuster erzeugt. Anschließend sind sukzessive
maximal zwölf Testmuster vom codebreaker (User) einzugeben und vom codemaker jeweils die zwei Fagen zu beantworten.
Anmerkung: MasterMind wurde auch von Mathematikern unter die Lupe genommen und bereits Mitte/Ende der 70er Jahre konnte
bewiesen werden, dass man es mit maximal fünf Testmustern lösen kann, sehr erstaunlich, oder? Daraufhin wurde
SuperMasterMind vorgeschlagen. Unterschied: Reihen mit fünf Symbolen und acht unterschiedlichen Pin-/Murmelfarben.
Wer MasterMind lediglich als schöne Spielerei ansieht, überlege bitte folgendes: Seit 1971 (release)
wurden bisher pro Jahr im Durchschnitt eine Million Spiele weltweit verkauft. Wärest Du der Erfinder und bekämest
als Lizenzgeber pro Exemplar 10 Cent, Du hättest finanziell ausgesorgt.
Ziel des Spiels ist es, einen Geheimcode zu entschlüsseln.
In der klassischen Variante ordnet ein Spieler, genannt "codemaker", eine Sequenz von vier Symbolen
geheim an. Praktisch geschieht dies mittels unterschiedlich oder teilweise bzw. gänzlich
gleich gefärbter Pins oder Murmeln in einer Reihe, wobei maximal sechs Farben zur Verfügung stehen.
Ein zweiter Spieler, genannt "codebreaker", versucht durch Testmuster, gleichfalls bestehend aus vier gereihten
Symbolen (Pins/Murmeln), den Code zu erraten. Hätte der codebreaker 6 * 6 * 6 * 6 = 1.296 Versuche zur Verfügung,
wäre dies kein Problem, allerdings wird die Anzahl der Tests als Spielregel auf zwölf (manchmal weniger) begrenzt.
Als Responds auf ein Testmuster muss der codemaker zwei Informationen geben:
1.) Wieviele Symbole im Testmuster stehen an exakt der gleicher Stelle wie im Geheimmuster (im Falle vier, wäre das
Spiel für den codebreaker gewonnen) und
2.) wieviele Symbole (Pin-/Murmelfarben) sind sowohl im Geheim- als auch im Testmuster
vorhanden, allerdings nicht in übereinstimmender Position in der Reihe.
Die Programmieraufgabe bestehe nun darin, MasterMind interaktiv am PC zu simulieren, wobei der Computer als
codemaker fungiert, der zunächst per Zufallsgenerator das Geheimmuster erzeugt. Anschließend sind sukzessive
maximal zwölf Testmuster vom codebreaker (User) einzugeben und vom codemaker jeweils die zwei Fagen zu beantworten.
Anmerkung: MasterMind wurde auch von Mathematikern unter die Lupe genommen und bereits Mitte/Ende der 70er Jahre konnte
bewiesen werden, dass man es mit maximal fünf Testmustern lösen kann, sehr erstaunlich, oder? Daraufhin wurde
SuperMasterMind vorgeschlagen. Unterschied: Reihen mit fünf Symbolen und acht unterschiedlichen Pin-/Murmelfarben.
Wer MasterMind lediglich als schöne Spielerei ansieht, überlege bitte folgendes: Seit 1971 (release)
wurden bisher pro Jahr im Durchschnitt eine Million Spiele weltweit verkauft. Wärest Du der Erfinder und bekämest
als Lizenzgeber pro Exemplar 10 Cent, Du hättest finanziell ausgesorgt.
#1

von roadman1991 (360 Punkte)
- 01.08.2018 um 10:58 Uhr
Ich habe hier einen kleinen Ansatz, mit 12 Leben
Java-Code
Java-Code
Java-Code
Java-Code
Java-Code

package florian.mastermind; public class MasterMind { public static void main(String[] args) { PlayGround pg = new PlayGround(); pg.startGame(); } }

package florian.mastermind; import java.util.Arrays; // Das Spielfeld public class PlayGround { Actor actor; SecretCode secretCode; boolean actorDead = false; boolean gameWin = false; // Start des Spiels void startGame(){ welcome(); placeSecretCode(); placeActor(); // Eine Art 'GameLoop' Die solange läuft bis der Actor keine Leben mehr hat oder das Spiel gewonnen. while(actorDead == false) { if(gameWin == false) { actor.guessCode(); evaluateGuessedSecretCode(); } else { System.out.println("You Win"); System.exit(0); return; } } System.out.println("Game Over"); System.exit(0); return; } SecretCode placeSecretCode(){ return secretCode = new SecretCode(); } Actor placeActor(){ return actor = new Actor(); } // Vergleichen des Secret Codes mit dem des Actors void evaluateGuessedSecretCode(){ if(Arrays.equals(secretCode.getSecretCode(), actor.getGuessedPins())) { gameWin = true; } else { reduceActorLife(); for(int i = 0; i < secretCode.getSecretCode().length; i++) { if(secretCode.getSecretCode()[i].getValue() == actor.getGuessedPins()[i].getValue()) { System.out.println("Pin " + (i+1) + " with value of: " + actor.getGuessedPins()[i].getValue() + " was correct"); } } } } void reduceActorLife(){ actor.setLife(actor.getLife()-1); checkActorsLifeNotZero(actor.getLife()); } boolean checkActorsLifeNotZero(int life){ if (actor.getLife() < 1) { actorDead = true; return actorDead; } else { return actorDead; } } void welcome(){ System.out.println("Welcome to Mastermind. You have to guess a secret code of a 4 digit number. \n" + "There are 6 number options for each pin from 0 to 5\n" + "you have 6 lifes. Once 0 lifes are reached, you loose! \n" + "Good luck!"); } }

package florian.mastermind; import java.util.Random; public class SecretCode { private Pin[] secretCode = new Pin[4]; public Pin[] getSecretCode() { return secretCode; } // Secret Code, welcher automatisch generiert wird SecretCode(){ for (int i = 0; i < 4; i++) { Pin pin = new Pin(); Random rnd = new Random(); int rndNumber = rnd.nextInt(5); pin.setValue(rndNumber); secretCode[i] = pin; } } }

package florian.mastermind; import java.util.Scanner; //Der Spieler, Aktör public class Actor { private int life; private Pin[] guessedPins = new Pin[4]; public Pin[] getGuessedPins() { return guessedPins; } public int getLife() { return life; } public void setLife(int life) { this.life = life; } // Anzahl der Leben Actor(){ setLife(12); } // Actor kann hier eine Kombination von 4 Pins eingeben public void guessCode() { @SuppressWarnings("resource") Scanner reader = new Scanner(System.in); for(int i = 0; i < guessedPins.length; i++) { System.out.println("Enter Pin " + (i+1) + " : "); int n = reader.nextInt(); Pin pin = new Pin(); pin.setValue(n); guessedPins[i] = pin; } } }

package florian.mastermind; // Ein Pin im Spiel. Könnte durch ein Enum ersetzt werden public class Pin { private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } // Funktionen zum vergleichen der Pins vom Actor mit dem Secret Code @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + value; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Pin other = (Pin) obj; if (value != other.value) return false; return true; } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1