Hallo werte Java-Freunde!
Ich habe hier ein Nullsummenspiel mit perfekter Information, das heißt es ist nach dem was
ich heute gelesen habe bestens geeignet für einen MinMax-Algorithmus, um einen Computer-
Gegner zu implementieren.
So weit so gut.
Ich erkläre vielleicht zunächst einmal das Spiel.
Das Spielfeld besteht aus 2 x 8 Felder die jeweils 2 x 4 angeordnet sind:
-
-
-
- ===> Spieler A
-
-
-
-
-
- ===> Spieler B
-
-
Auf jedem Feld befinden sich zu beginn zwei Spielsteine:
2 2 2 2
2 2 2 2 ===> Spieler A
2 2 2 2
2 2 2 2 ===> Spieler B
Spieler A beginnt. Wenn er nun ein Feld auswählt, werden die Steine,
die sich auf dem Feld befinden, gegen den Uhrzeigersinn auf die anderen
Felder verteilt. Auf jedem Feld, darf dabei nur ein Stein abgelegt werden.
Nehmen wir an, er hätte das vierte Feld, aus der zweiten
Reihe gewählt:
2 2 3 3
2 2 2 0 ===> Spieler A
2 2 2 2
2 2 2 2 ===> Spieler B
Nun sind auf dem dritten Feld in Reihe eins, auf dem der letzte Stein gelandet
ist, drei Steine, diese müssen weiter verteilt werden, das ganze geht solange,
bis auf einem Feld nur noch ein einzelner Stein liegen geblieben ist.
3 3 0 3
3 2 2 0 ===> Spieler A
2 2 2 2
2 2 2 2 ===> Spieler B
===========================================================
3 3 0 3
0 3 3 1 ===> Spieler A
2 2 2 2
2 2 2 2 ===> Spieler B
So, nun haben wir die Situation, dass ein einzelner Stein auf einem Spielfeld
liegt. Die Steine des Gegners auf den gegenüberliegenden Feldern werden
nun weg genommen:
3 3 0 3
0 3 3 1 ===> Spieler A
2 2 2 0
2 2 2 0 ===> Spieler B
Nun ist Spieler B an der Reihe. Das Spiel geht so lange, bis ein Spieler keine
Steine mehr hat. Dieser Spieler hat dann verloren.
Steine dürfen nur genommen werden, wenn der einzelne Spielstein bei Spieler
A in der zweiten Reihe und bei Spieler B in der ersten Reihe liegen bleibt, d.h.
bei folgendem Ergebnis hätte Spieler A keine Steine nehmen dürfen:
3 0 3 1
3 0 3 3 ===> Spieler A
2 2 2 2
2 2 2 2 ===> Spieler B
Mir sind nun einige Dinge nicht ganz klar. Zum einen die Bewertungsfunktion des
MinMax Algorithmus. Für einen Zug, der mir einen unmittelbaren Sieg einbringt,
gebe ich die Bewertung +undendlich zurück. Für einen Zug bei dem der Gegner gewinnt,
gebe ich -unendlich zurück, bei einem unentschieden 0.
Was gebe ich bei allen anderen Situationen zurück? Vielleicht die Anzahl der
Steine die genommen werden können?
Des weiteren ist mir nicht ganz klar, wie ich das ganze Code-Technisch implementieren kann.
Bis jetzt funktioniert das Spiel mit zwei Spielern (ohne Computer). Es ist möglich Züge
Rückgängig zu machen und sie zu wiederholen. Es ist außerdem möglich sich Replays von
Spielen anzugucken.
Ich speichere nämlich jeden gemachten Zug sowie die Verteilung der Spielsteine ab und
kann sie auf die Festplatte serialisieren.
Das heißt ich habe eine Liste, deren Elemente jeweils einen Spielstand darstellen.
Ich habe die Grafik und die Logik auch so weit getrennt, dass ich alles vorberechnen
könnte.
Kann mir einer bei der herangehensweise helfen?