Autor Beitrag
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 25.06.09 23:33 
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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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".

_________________
>λ=
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.06.09 16:32 
Die Diskussion mit den Regeln gabs heute bei mir auch xD Und ich denke, so wie du es sagst, stimmt es.
Allerdings liese sich meine Methode da ja durchaus noch für verwenden, wenn ich nacher einfach die "trefer" und "richtig" in meinem array zähle.
Hätte also trotzdem noch eine Lösung für mein "ein zu viel"-Problem.

Kannst du deines mal an einem Beispiel erklären
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 ;) :
ausblenden Quelltext
1:
2:
Lösung:  AAABB
Geraten: ABBAC

Pro Farbe wird die Anzahl Stife ermittelt:
ausblenden 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.

_________________
>λ=
regsnerven
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 07.07.09 14:01 
Ich bin gerade echt zu doof die Anzahl der Farbe festzustellen xD Sorry.

Außerdem fehlt mir die eindeutige Zuordnung der Farben, da Delphi ja bescheuerter WEise keine Strings als Index akzeptiert.

Kann mir das mal gerade jemand sagen, wie ich da am besten vorgehe?