Mastermind Treffer abfrage (Ich bin am Verzweifeln)

desperade

Grünschnabel
Hi,
ich bin dabei Mastermind zu programmieren und bis auf eine Sache läuft es. Das wichtigste, die Treffer abfrage läuft noch nicht wie gewünscht.

Einen absoluten Treffer bekomme ich ohne Probleme, doch wenn das siegMuster z.B. "gelb" "gelb" "gruen" "gruen" ist un der Spieler "gelb" und 3-mal "rot" eingibt, bekomme ich einen absoluten (schwarzes pinnchen) Treffer (ist ja auch klar, weil an der Stelle [0] beides "gelb" ist), aber auserdem bekomme ich einen halben (weisses pinnchen) Treffer.

Hier die Methode dazu:
! siegMuster ist das random Muster, welches man erraten muss, !
! spielFeldString ist das vom Spieler eingegebene Muster. !
PHP:
private void treffer() {
		genaueTreffer = 0;
		halbeTreffer = 0;
		for (int i = 0; i < siegMuster.length; i++) {
			if (siegMuster[i].equals(spielfeldString[i][spielRunden])) {
				genaueTreffer++;
			} else
				for (int j = 0; j < siegMuster.length; j++) {
					if (j == i) {
						continue;
					}
					if (siegMuster[i].equals(spielfeldString[j][spielRunden])) {
						halbeTreffer++;
					}
				}
		}
		if (genaueTreffer == 4) {
			getSiegDialog();
		}
	}

Bedanke mich schon mal,
Lenny!

EDIT:
Habe es hinbekommen
PHP:
private void treffer() {
		genaueTreffer = 0;
		halbeTreffer = 0;
		for (int i = 0; i < siegMuster.length; i++) {
			if (siegMuster[i].equals(spielfeldString[i][spielRunden])) {
				genaueTreffer++;
				siegMuster[i]=siegMuster[i]+"a";
				spielfeldString[i][spielRunden]=spielfeldString[i][spielRunden]+"z";
			} else
				for (int j = 0; j < siegMuster.length; j++) {
					if (j == i) {
						continue;
					}
					if (siegMuster[i].equals(spielfeldString[j][spielRunden])) {
						halbeTreffer++;
					}
				}
			if (siegMuster[i].charAt(siegMuster[i].length()-1) == 'a'){
				siegMuster[i] = siegMuster[i].substring(0, siegMuster[i].length()-1);
			}
		}
		
		if (genaueTreffer == 4) {
			getSiegDialog();
		}
	}
 
Zuletzt bearbeitet:
Leider ist es so noch nicht wirklich korrekt.

mit den genauenTreffer klappt jetzt alles, aber ich bekomme ein Problem mit den halbenTreffern. Wenn ich z.B. "gelb" "gelb" "rot" "rot" habe und "blau" "rot" "blau" "blau" eingebe, bekomme ich nicht einen halbenTreffer, sondern 2.

Jemand ne Idee?
 
Zuletzt bearbeitet:
Hallo,

jetzt hab ich erstmal ne Frage zu Mastermind. Ich kenne das so, dass wenn die Farbe stimmt aber nicht die Position ein "halber" Treffer ist und wenn die Position auch noch stimmt ein ganzer Treffer ist, aber in deinen Beispielen erkenne ich dass irgendwie nicht.

MFG

zEriX
 
Ja, genauso ist das.

und mit dem Vergleich
PHP:
if (siegMuster[i].equals(spielfeldString[i][spielRunden])) {
                genaueTreffer++;
            }
wird der genaueTreffer auch abgefragt und dazu addiert.
ist der Inhalt von siegMuster[1] gleich "gelb" und spielFeldString[1][spielRunde] auch gleich "gelb", wird genaueTreffer um eins erhöht.
Mit
PHP:
siegMuster[i]=siegMuster[i]+"a";
spielfeldString[i][spielRunden]=spielfeldString[i][spielRunden]+"z";
wird bei einem Treffer (in diesem Beispiel) bei siegMuster[1] "gelb" zu "gelba" und bei spielFeldString[1][spielRunde] "gelb" zu "gelbz". Somit ist siegMuster[1] im Durchlauf bei den halbenTreffern nicht mehr vergleichbar und dadurch wird das Anfangsproblem
Einen absoluten Treffer bekomme ich ohne Probleme, doch wenn das siegMuster z.B. "gelb" "gelb" "gruen" "gruen" ist un der Spieler "gelb" und 3-mal "rot" eingibt, bekomme ich einen absoluten (schwarzes pinnchen) Treffer (ist ja auch klar, weil an der Stelle [0] beides "gelb" ist), aber auserdem bekomme ich einen halben (weisses pinnchen) Treffer.
umgangen.

Aber nun gibt es halt noch das Problem :
ich bekomme ein Problem mit den halbenTreffern. Wenn ich z.B. "gelb" "gelb" "rot" "rot" habe und "blau" "blau" "rot" "blau" eingebe, bekomme ich nicht einen halbenTreffer, sondern 3.
 
Zuletzt bearbeitet:
Aber nun gibt es halt noch das Problem :
Zitat:
ich bekomme ein Problem mit den halbenTreffern. Wenn ich z.B. "gelb" "gelb" "rot" "rot" habe und "blau" "blau" "rot" "blau" eingebe, bekomme ich nicht einen halbenTreffer, sondern 3.

Das ist genau das was ich nicht vestehe. Das Beispiel ist für mich aber nicht ein halber Treffer sondern ein ganzer. Da "rot" an der richtigen Stelle steht. Damit wäre es für mich ein ganzer und 0 halbe Treffer.

MFG

zEriX
 
ups, sorry meinte natürlich "gelb" "gelb" "rot" "rot" und "blau" "rot" "blau" "blau".
Ausserdem habe ich mich mit der Anzahl der halbenTreffer auch vertan. Bekomme in diesem Beispiel natürlich nicht 3, sonder 2 halbeTreffer.
Werde langsam Wahnsinnig, weil heute ja Abgabetermin ist.

Änder ich oben auch!:)
 
Zuletzt bearbeitet:
Mein Vorschlag wäre, dass du jedes Array in eine eigene ArrayList packst und alles was "getroffen" hat aus der liste entfernst.

Also Beispiel: Gefordert "rot" "rot" "gelb" "rot"
eingegeben "gelb" "blau" "grün" "rot"

Wenn du jetzt die halben Treffer überprüfst, entfernst du nachher das gelb aus der Gefordert liste und brichst die überprüfung für das erste der eingegebenen ab.
ich hoffe das war halbwegs verständlich.

MFG

zEriX
 
Ich finde das mit den Strings verändern viel zu kompliziert. Ich würde mir einen weiteren Array (trefferarray) nehmen, indem ich mir Treffer an Stellen merke und dann 3 Schleifen bauen.

1. Schleife: Genaue Treffer
Du vergleichst Eingabe und Zielmuster auf exakte Treffer. Erfolgte ein Treffer, so ist trefferarray[ i ]=1 sonst 0;

2. (Doppel)Schleife: Ungenaue Treffer
Du nimmst den ersten Wert aus der Eingabe und vergleichst ihn mit allen Werten im Zielmuster, an den Stellen, die noch nicht mit 1 oder 2 markiert wurden. Kommt er vor, so wird die Stelle mit 2 markiert. Das machst du für alle Stellen der Eingabe, an denen noch nicht 1 oder 2 in trefferarray steht.

3. Schleife: Auswertung von trefferarray
Du zählst die Einsen und Zweien und hast die Zahl genauer und ungenauer Treffer.
 
Zurück