Delete - Do 25.06.09 23:33
Titel: Arrays miteinander vergleichen (Mastermind-Style)
Hallo Leute,
bin gerade dabei Mastermind zu programmieren und bin jetzt an der kniffligen Stelle des Vergleiches der beiden Arrays code (also der vom Computer errechnete) und versuch (also dem, was der User getippt hat).
Für die, die Mastermind nicht kennen:
- 2 Spieler spielen gegeneinander
- Spieler 1 (Computer) denkt sich einen Code aus, der aus Farben besteht (in diesem Fall habe ich 4 verschiedene, was aber noch auf 8 erweitert wird)
~in dem Code dürfen Farben doppelt verwendet werden
- Spieler 2 versucht nun diesen Code zu erraten
- Hat Spieler 2 einen Versuch beendet, muss ihm Spieler 1 sagen, ob er einen VOLLTREFFER (richtige Farbe UND richtige Position), einen Treffer (richtige Farbe ABER falsche Position) oder eine falschen (falsche Farbe und falsch Position = nicht vorhanden) hat.
Ein Volltreffer ist relativ leicht zu bestimmen und das ist auch nicht das Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for i := 0 to length(versuch) -1 do begin if (versuch[i] = code[i]) then richtig[i] := 'richtig' else richtig[i] := 'falsch'; end; |
So, nun geht's aber weiter:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| for I := 0 to Length(richtig) - 1 do begin if (richtig[i] = 'falsch') then begin for X := 0 to length(versuch) - 1 do begin if ((versuch[i] = code[x]) AND (richtig[x] <> 'richtig')) then begin richtig[i] := 'treffer'; break; end; end; end; end; |
Treffer werden jetzt, genau so wie richtige, super angezeigt. Das Problem ist nur, dass er "(richtig[x] <> 'richtig')" iwie übersieht.
Habt ihr ne Idee, warum?
Falls ihr noch eine andere Methode kennt, dann sagt mir diese doch auch ^^
Gr33tZ
Rn
Edit:---->
okay, ich hab jetzt festgestellt, dass das Problem auftritt, wenn ich von einer Farbe 2 Vorkommen im Code habe, einen richtig tippe und die anderen 2 auf die falschen Positionen setze. Dann generiert er mir 2 Treffer, obwohl ich ja nur noch einen habe.
Jemand einen Ahnung, wie ich das verhindern kann?
Kha - Fr 26.06.09 01:18
Die normalen Regeln sehen aber anders aus: Es wird nur bekannt gegeben,
wie viele Stifte richtig/falsch platziert sind.
Ich habe selbst mal einen Solver geschrieben, dabei bin ich so vorgegangen:
- Ein Array, das für jede Farbe die Anzahl der Stifte in der Lösung angibt.
- Für jedes "richtige Farbe, richtige Position" wird der entsprechende Array-Eintrag dekrementiert.
- Für jeden Stift der "Frage" wird danach wieder dekrementiert, falls nicht schon eine 0 drinsteht => "richtige Farbe, falsche Position".
Kha - Fr 26.06.09 17:07
Mein Algorithmus war irgendwie noch leicht fehlerhaft :mrgreen: , hier die Verbesserung:
Nehmen wir mal die hypothetischen Farben A, B und C ;) :
Quelltext
1: 2:
| Lösung: AAABB Geraten: ABBAC |
Pro Farbe wird die Anzahl Stife ermittelt:
Quelltext
1: 2: 3:
| // A, B, C Lösung: [3, 2, 0] Geraten:[2, 2, 1] |
Von jeder Farbe nehmen wir jeweils die kleinere Zahl und addieren alles: 2 + 2 + 0 = 4
Der eine Volltreffer (orange) wird wie bei dir über eine Schleife ermittelt, bleiben 3: Das sind die "falsche Position, richtige Farbe"-Treffer.