Java :: Aufgabe #203 :: Lösung #2
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.
#2

von guandi (230 Punkte)
- 14.08.2018 um 11:36 Uhr
Main Methode:
Java-Code
Methode Ausgabe:
Java-Code
Methode Zahlenkontrolle:
Java-Code
Methode Zufallszahlen:
Java-Code

import controller.*; public class MMApp { public static void main(String[] args) { /* 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. */ // Erklärung Array zahlenBreaker: // Spalte 0 = Spielnummer // Spalte 1 = UserZahl 1 // Spalte 2 = UserZahl 2 // Spalte 3 = UserZahl 3 // Spalte 4 = UserZahl 4 // Spalte 5 = Treffer Exakt // Spalte 6 = Treffer Vorhanden // zahlenMaker ist das Array in dem die Zufallszahlen des Makers gespeichert werden int zahlenMaker[] = new int[4]; int zahlenBreaker[][] = new int[12][7]; // zahlenTreffer - hier werden die exakten und vorhandenen Zahlentreffer gespeichert um keine Doppelzählung zu haben int zahlenTreffer[] = new int[5]; // Kleine Begrüßung Ausgabe.Begrüßung(); // Erstellung von 4 Zufallszahlen und speichern in dem dazugehörigen Array Zufallszahlen.erstellen(zahlenMaker); // Für Testzwecke Ausgabe der Maker Zahlen // Ausgabe.test(zahlenMaker); // Spiellänge 12 Runden for(int i=0;i<12;i++) { // Zuweisen der Spielnummer an dazugehörige Position int x = i+1; zahlenBreaker[i][0] = x; // Ausgeben der Spielnummer Ausgabe.spielnummer(zahlenBreaker[i]); // Abfragen der Userzahlen und speichern im dazugehörigen Arrayblock Ausgabe.UserEingabe(zahlenBreaker[i]); // Kontrolle ob der User eine Zahl exakt eingegeben hat zahlenBreaker[i][5] = Zahlenkontrolle.kontrolleUserZahlenExakt(zahlenBreaker[i], zahlenMaker, zahlenTreffer); // Kontrolle ob der User eine richtige Zahl eingegeben hat die aber nicht am richtigen Platz ist zahlenBreaker[i][6] = Zahlenkontrolle.kontrolleUserZahlenVorhanden(zahlenBreaker[i], zahlenMaker, zahlenTreffer); // Ausgabe der Spielrunge, der vom User eingegebenen Zahlen und der Treffer für alle bisher gespielten Runden for(int j=0; j<=i; j++) { Ausgabe.ausgabeTreffer(zahlenBreaker[j]); } // Ausgabe ob neue Runde oder Spielende Ausgabe.rundenende(zahlenBreaker[i]); // Zurücksetzen der getroffenen Zahlen für die neue Runde for(int k=0;k<5;k++) { zahlenTreffer[k] = 0; } } } }
Methode Ausgabe:

package controller; import java.util.Scanner; public class Ausgabe { // Begrüßungstext public static void Begrüßung() { System.out.println("Willkommen bei MasterMind."); System.out.println("Der CodeMaker wünscht dir viel Glück!"); } // Eingabe der Userzahlen public static void UserEingabe(int []usrZahl) { boolean eingabe = false; int x = 0; Scanner myScanner = new Scanner(System.in); // Schleife für die Eingabe von 4 Zahlen ab 1 da 0 in dem Array die Rundennummer enthält for(int i=1; i<5; i++) { // Auffordern für die eingabe einer Zahl und Kontrolle do{ System.out.println("Bitte gib deine " + i + ". Zahl zwischen 1 und 6 ein:"); x = myScanner.nextInt(); // Aufrufen der Methode für die Kontrolle der Eingabe eingabe = Zahlenkontrolle.kontrolleUserEingabe(x); // Die Zahl muss so lange eingegeben werden bis sie den Vorgaben entspricht }while(eingabe == false); // Abspeichern der eingegebenen und geprüften Userzahl im Array usrZahl[i] = x; } } // Ausgabe der Spielnummer, Usereingabe und der Treffer public static void ausgabeTreffer(int []x) { System.out.print("Spiel Nr: " + x[0] + " - Deine Eingabe: "); for(int i=1; i<5;i++) { System.out.print(x[i]); if(i<4) { System.out.print(", "); } } System.out.println(" - Treffer Exakt: " + x[5] + " - Vorhanden: " + x[6]); } // Ausgabe der Rundennummer public static void spielnummer(int []x) { System.out.println("Dies ist Spiel Nummer: " + x[0]); } // Ausgabe des weiteren Spielverlaufs public static void rundenende(int []x) { // Prüfen ob das Spiel gewonnen wurde und Ausgabe if(x[5] == 4) { System.out.println("Sie haben gewonnen!"); System.out.println("Spielende..."); // Beenden des Spieles System.exit(1); // Prüfen ob die Rundenzahl erreicht wurde und das Spiel verloren }else if(x[0]==11){ System.out.println("Leider Verloren!"); }else { System.out.println("Neuer Verusch!"); } } // Ausgabe der Makerzahlen für Testzwecke // public static void test(int [] zahlenMaker) { // for(int i=0; i<4;i++) { // System.out.print(zahlenMaker[i] + " "); // } // System.out.println(""); // } }
Methode Zahlenkontrolle:

package controller; public class Zahlenkontrolle { // Kontrolle der Userzahlen public static boolean kontrolleUserEingabe(int usrZahl) { boolean eingabe = false; // Wenn die eingegebene Userzahl nicht 0 ist und kleiner als 7 dann ist die Eingabe richtig if(usrZahl>0 & usrZahl<7) { eingabe = true; } return eingabe; } // Kontrolle ob eine Userzahl exakt mit einer Zahl des Makers übereinstimmt und speichern des Ergebnisses in einem Array public static int kontrolleUserZahlenExakt(int []breakerZahlen, int []makerZahlen, int [] zahlenTreffer) { int treffer = 0; // j ist eine Zahl höher als i um die Daten an dem richtigen Arrayplatz zu speichern int j = 1; // Prüfen aller 4 Zahlen for(int i=0; i<4; i++) { // Wenn die Userzahl exakt mit der Makerzahl übereinstimmt wird der Treffer hochgezählt und in einem Array gespeichert if(makerZahlen[i] == breakerZahlen[j]) { treffer ++; zahlenTreffer[j] = 1; } j++; } return treffer; } // Kontrolle ob die eingegebenen Userzahlen bei den Makerzahlen vorhanden sind aber nicht exakt getroffen wurden public static int kontrolleUserZahlenVorhanden(int []breakerZahlen, int []makerZahlen, int [] zahlenTreffer) { int treffer = 0; // Überprüfen jeder vom User eingegebenen Zahl mit jeder vom Maker erstellten Zahl for(int i=0; i<4; i++) { for(int j=1; j<5; j++) { // Wenn die Zahlen vom Maker und User übereinstimmen UND die Zahl nicht von der exakten Prüfung schon gezählt wurde // Zähle den Treffer eins hoch und speicher den Treffer in dem Array if(makerZahlen[i] == breakerZahlen[j] & zahlenTreffer[j] != 1) { treffer ++; zahlenTreffer[j] = 1; } } } return treffer; } }
Methode Zufallszahlen:

package controller; public class Zufallszahlen { // Erstellen von 4 Zufallszahlen und spiechern dieser in dem Maker Array public static void erstellen(int [] maker) { // int maker[] = new int[4]; int zufallsZahl = 0; for(int i=0; i<4; i++) { zufallsZahl = 0; while( zufallsZahl == 0 | zufallsZahl > 6 ) { zufallsZahl = (int) (Math.random() * 10); } maker[i] = zufallsZahl; } // return maker; } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1