Mastermind Spiel

Feras

Aktives Mitglied
Hi, ich soll zwei positive ganze Zahlen n und k einlesen. Anschließend soll ich zufällig eine Folge von k natürlichen Zahlen aus der Menge {1, . . . , n} erzeugen. Dabei dürfen auch Zahlen mehrfach vorkommen. Nun soll der Nutzer die Zahlen im Spiel raten können und bei richtigen ZAhel neine MEldung erhalten.

Das versuche ich zu realisieren und habe das Problem, dass ich bei der Ausgabe nicht weiß, welche Zahl richtig geraten wurde, da nur komischer Code herauskommt und ich nicht weiß warum? Zusätzlich bin ich mir auch noch nicht sicher, ob der Algo so stimmt :/


MfG Feras


Java:
import java.util.Random;
import java.util.Scanner;

public class Mastermind {

	public static int[] zufall(int n, int k) {

		int[] result = new int[k], set = new int[n + 1];
		int rndIndex;
		Random rnd = new Random();

		for (int i = 0; i <= n; i++)	{
			set[i] = i;
			
		}
		
		for (int i = 0; i < k; i++) {
			
			rndIndex = rnd.nextInt(n + 1 - i);
			result[i] = set[rndIndex];
			set[rndIndex] = set[n - i];
		}

		return result;
	}

	public void prüfen(int[] eingabe, int[] result, int k) {

		for (int counter = 0; counter < k; counter++) {

			if (eingabe[counter] == result[counter]) {

				System.out.println("An der Stelle: [ " + (counter + 1)
						+ "] war die Zahl: " + eingabe + " richtig ");

			}

		}
	}

	public static void main(String[] args) {

		Mastermind spiel = new Mastermind();

		Scanner input = new Scanner(System.in);

		System.out.println("Geben Sie bitte n ein: ");
		int n = input.nextInt();

		System.out.println("Geben Sie bitte k ein: ");
		int k = input.nextInt();

		int[] eingabe = new int[k];

		System.out.println("Raten Sie Ihre Zahlen: ");

		for (int i = 0; i < eingabe.length; i++) {

			eingabe[i] = input.nextInt();
		}

		spiel.zufall(n, k);
		spiel.prüfen(eingabe, zufall(n, k), k);

	}
}
 
Hallo Feras 🙂

Zunächst mal solltest du deine Methode prüfen umbenennen, da diese einen Umlaut enthält:
Java:
// die Übergabe des Parameters k könntest du dir auch sparen, da k in deinen Arrays steckt...
public void pruefen(int[] eingabe, int[] result, int k) {...}
Der "komische" Code wird ist vermutlich die Stelle, an der die richtig geratene Zahl steht? Wenn ja, liegt das daran, dass du in Zeile 34 nicht die Zahl, sondern die Speicherstelle des Arrays eingabe ausgibst.
Java:
// Das hier sollte funktionieren: eingabe durch eingabe[counter] ausgetauscht
System.out.println("An der Stelle [" + (counter + 1) + "] war die Zahl " + eingabe[counter] + " richtig.");
Überdenke nochmal deine Methode zufall, diese Methode soll doch lediglich ein int-Array mit k zufälligen Werten liefern, wieso benötigst du also das set-Array? Du kannst es dir hier schon deutlich einfacher machen. Nebenbei erzeugst du theoretisch eine Folge mit Zahlen aus dem Intervall [0, n], ich glaube nicht, dass das gewollt ist.
In Zeile 62 rufst du deine Methode zufall auf, um zufällige Zahlen für dein Spiel zu generieren, in Zeile 63 willst du diese prüfen. Als Parameter für deine zufällige Zahlenfolge gibst du allerdings deine Methode an, was dazu führt, dass du eine neue Folge erzeugst. Du solltest also entweder das Ergebnis aus Zeile 62 speichern und in Zeile 63 übergeben, oder Zeile 62 einfach weglassen.

Vielleicht solltest du in deinen Code ein paar Kommentare für uns einfügen. Das hier sind schon ein paar Zeilen, für jemanden, der dir helfen will heißt das, dass er sich erst einmal ordentlich mit dem Code auseinandersetzen muss. Durch Kommentare ist dein Gedankengang einfacher nachvollziehbar und Fehler können einfacher identifiziert werden, zudem kommt es schon mal häufiger vor, dass einem selbst beim Kommentieren Fehler auffallen 🙂

Mit freundlichen Grüßen
Xelsarion
 
Zuletzt bearbeitet:
Danke für die Hilfe^^

So, ich habe jetzt erstmal die Methode "zufall" aufgeräumt und in der main den Methodenaufruf verkürzt.

Und ich möchte ja, dass die aktuelle "eingabe" zurückgegeben wird, also habe ich jetzt in der Zeile 24 "eingabe[counter]" hinzugefügt.

Ist das Programm jetzt einigermaßen passabel? 🙂


MfG Feras

Java:
import java.util.Scanner;

public class Mastermind {

	public static int[] zufall(int n, int k) {

		int[] zahlen = new int[k];

		for (int i = 0; i < k; i++) {

			zahlen[i] = (int) (Math.random() * n) + 1;
		}

		return zahlen;
	}

	public void pruefen(int[] eingabe, int[] result, int k) {

		for (int counter = 0; counter < k; counter++) {

			if (eingabe[counter] == result[counter]) {

				System.out.println("An der Stelle: " + (counter + 1)
						+ " war die Zahl: " + eingabe[counter] + " richtig ");

			}

		}
	}

	public static void main(String[] args) {

		Mastermind spiel = new Mastermind();

		Scanner input = new Scanner(System.in);

		System.out.println("Geben Sie bitte n ein: ");
		int n = input.nextInt();

		System.out.println("Geben Sie bitte k ein: ");
		int k = input.nextInt();

		int[] eingabe = new int[k];

		System.out.println("Raten Sie Ihre Zahlen: ");

		for (int i = 0; i < eingabe.length; i++) {

			eingabe[i] = input.nextInt();
		}

		spiel.pruefen(eingabe, zufall(n, k), k);

	}
}
 
Sieht gut aus 🙂

Ob es das macht, was du willst, kannst du ja selber testen!
Zu deiner Methode pruefen hätte ich weiterhin den Vorschlag, den dritten Parameter wegfallen zu lassen. Das ist natürlich Geschmackssache und dir überlassen, allerdings möchte ich darauf aufmerksam machen, dass k sowohl in deinem eingabe-Array, als auch in deinem result-Array steckt, da k ja gerade gleich der Länge der beiden Arrays entspricht. Alternativ könntest du also schreiben:
Java:
public void pruefen(int[] eingabe, int[] result) {
   // oder counter < result.length, beide Arrays sind theoretisch gleich lang
   for (int counter = 0; counter < eingabe.length; counter++) {
      if (eingabe[counter] == result[counter]) {
         System.out.println("An der Stelle: " + (counter + 1)
            + " war die Zahl: " + eingabe[counter] + " richtig ");
      }
   }
}
Zudem frage ich mich, was dich dazu bewegt, die Methode zufall als static zu deklarieren und die Methode pruefen abhängig vom Objekt zu machen. Das ist auf gar keinen Fall falsch und ich will dir auch nichts anderes vorschlagen, ich frage nur nach, weil es mich persönlich interessiert, was du dir dabei gedacht hast 😉

Gut gemacht und weiter so!

Mit freundlichen Grüßen
Xelsarion
 
Zuletzt bearbeitet:
Naja, ich habe die Methode static gemacht, weil mir das eclipse bei der Fehlerbehandlung vorgeschlagen hat. Denn wenn ich die Methode zufall nicht static habe erhalte ich in Zeile 52 bei zufall die Fehlermeldung: " Cannot make a static reference to a non static method zufall(int, int) from the type mastermind.

Hat das denn irgendwelche Nachteile?


MfG Feras
 
[...] wenn ich die Methode zufall nicht static habe erhalte ich in Zeile 52 bei zufall die Fehlermeldung: "Cannot make a static reference to a non static method zufall(int, int) from the type mastermind."
Ganz grob gesagt bedeutet das static bei Methoden, dass die Methode nicht vom einzelnen Objekt abhängig ist, sondern von der Klasse. Wenn du also die Methode zufall static hast und sie dann aufrufen willst, würde man normalerweise Mastermind.zufall(...); schreiben. Wenn du das static weg machst, gehört die Methode zum Objekt. Das hast du ja auch bei der Methode pruefen gemacht. Und die rufst du auf, indem du Objekt.Methode(); schreibst. In Zeile 52 selbst machst du das ja.

Die Erklärung vom Schlüsselwort static ist an dieser Stelle alles andere als einwandfrei, aber vielleicht hilft dir das ja beim Verständnis bzw. der Vorstellung 🙂
Nachteile seh ich an der Stelle nicht wirklich, ebenso wenig wie Vorteile. Wenn du allerdings keinen speziellen Grund hast, das so zu machen, würde ich es vermutlich einheitlich machen. Falls du beides static machen solltest, kannst du dir das Objekt spiel sparen.
Vielleicht kann an der Stelle ein richtiger Experte mehr dazu sagen, geht mir dann auch zu sehr ins Detail, würde ich mal behaupten 😉

Mit freundlichen Grüßen
Xelsarion
 
Zuletzt bearbeitet:
Solange ..., bis ... hört sich doch schonmal sehr nach einer Schleife an 😉
Die Bedingung könnte bspw. eine Variable sein, die dann auf false gesetzt wird, wenn alle Zahlen erraten wurden.

Hilft dir das weiter?

Mit freundlichen Grüßen
Xelsarion
 
So wie du es jetzt gemacht hast, müsstest du es eigentlich schon in der main machen.. Umschreiben musst du dafür aber sowieso wieder einiges.
In der Methode fängst du nichts damit an, da du ja immer andere eingabe-Arrays brauchst 🙂

Mit freundlichen Grüßen
Xelsarion
 

Zurück
Oben