Ich schreibe eine Computerversion des Spiels Dominion . Es ist ein rundenbasiertes Kartenspiel, bei dem Aktionskarten, Schatzkarten und Siegpunktkarten im persönlichen Deck eines Spielers gesammelt werden. Ich habe die Klassenstruktur ziemlich gut entwickelt und beginne, die Spiellogik zu entwerfen. Ich verwende Python und kann später eine einfache Benutzeroberfläche mit Pygame hinzufügen.
Die Spielreihenfolge der Spieler wird von einem sehr einfachen Automaten gesteuert. Wendet sich im Uhrzeigersinn und ein Spieler kann das Spiel nicht beenden, bevor es vorbei ist. Das Spiel einer einzelnen Runde ist auch eine Zustandsmaschine; Im Allgemeinen durchlaufen die Spieler eine "Aktionsphase", eine "Kaufphase" und eine "Aufräumphase" (in dieser Reihenfolge). Basierend auf der Antwort auf die Frage Wie implementiert man eine rundenbasierte Spiel-Engine? Die Zustandsmaschine ist eine Standardtechnik für diese Situation.
Mein Problem ist, dass sie während der Aktionsphase einer Spielerin eine Aktionskarte verwenden kann, die Nebenwirkungen auf sich selbst oder auf einen oder mehrere der anderen Spieler hat. Beispielsweise kann ein Spieler mit einer Aktionskarte unmittelbar nach Abschluss des aktuellen Zuges einen zweiten Zug ausführen. Eine andere Aktionskarte bewirkt, dass alle anderen Spieler zwei Karten aus ihren Händen ablegen. Eine weitere Aktionskarte bewirkt in der aktuellen Runde nichts, erlaubt es einem Spieler jedoch, in ihrer nächsten Runde zusätzliche Karten zu ziehen. Um die Dinge noch komplizierter zu machen, gibt es häufig neue Erweiterungen des Spiels, die neue Karten hinzufügen. Es scheint mir, dass eine harte Codierung der Ergebnisse jeder Aktionskarte in die Zustandsmaschine des Spiels sowohl hässlich als auch nicht anpassbar wäre. Die Antwort auf die rundenbasierte Strategie-Schleife geht nicht auf eine Detailebene ein, die Entwürfe zur Lösung dieses Problems anspricht.
Welche Art von Programmiermodell sollte ich verwenden, um die Tatsache zu berücksichtigen, dass das allgemeine Muster für das Abwechseln durch Aktionen geändert werden kann, die innerhalb der Abwechslung stattfinden? Sollte das Spielobjekt die Auswirkungen jeder Aktionskarte verfolgen? Oder, wenn die Karten ihre eigenen Effekte implementieren sollen (z. B. durch Implementieren einer Schnittstelle), welches Setup ist erforderlich, um ihnen genügend Leistung zu geben? Ich habe mir ein paar Lösungen für dieses Problem ausgedacht, aber ich frage mich, ob es einen Standardweg gibt, um es zu lösen. Insbesondere würde ich gerne wissen, welches Objekt / welche Klasse / was auch immer dafür verantwortlich ist, die Aktionen zu verfolgen, die jeder Spieler als Folge einer gespielten Aktionskarte ausführen muss, und auch, wie sich dies auf vorübergehende Änderungen in der normalen Reihenfolge von auswirkt die Turn-State-Maschine.