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

2 Lösungen Lösungen öffentlich
#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.
#1
vote_ok
von roadman1991 (360 Punkte) - 01.08.2018 um 10:58 Uhr
Ich habe hier einen kleinen Ansatz, mit 12 Leben

Quellcode ausblenden Java-Code
package florian.mastermind;

public class MasterMind {

	public static void main(String[] args) {
		PlayGround pg = new PlayGround();
		pg.startGame();
	}
}


Quellcode ausblenden Java-Code
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!");
	}
}


Quellcode ausblenden Java-Code
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;
		}
	}
	
	
}


Quellcode ausblenden Java-Code
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;
		}
	}
}


Quellcode ausblenden Java-Code
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

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2094354

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.