Regel- / Validierungsentwurfsmuster

8

Welche Entwurfsmuster können verwendet werden, um ein Regel- / Validierungssystem für ein Spiel wie Schach zu erstellen (dies ist nur ein einfaches Beispiel, das eigentliche Spiel benötigt schwierigere Regelsätze).

Ich habe mehrere Fragen auf dieser Website gelesen und weder eine schlüssige Antwort noch eine Antwort gefunden, die mich in die richtige Richtung weist.

Dieses System würde Folgendes erfordern:

  • Jedes Objekt, auf das Regeln angewendet werden, sollte eine bestimmte Schnittstelle mit einer Methode implementieren, die der Ausgangspunkt für die Validierung ist
  • Die Regel sollte in zwei Schritten angewendet werden: Zuerst muss sie validiert werden (kann A auf Feld D4 verschieben), wenn wahr, dann Methode A ausführen, wenn falsch, dann Methode B ausführen
  • Jedes Objekt kann mehrere Regeln haben, die in einer bestimmten Reihenfolge angewendet werden müssen. Wenn Regel 1 beendet ist, sollte Regel 2 mit der Validierung usw. Beginnen
  • Jede separate Regel (zum Beispiel: kann sich nur um ein Quadrat bewegen, kann sich nur diagonal bewegen usw.) muss in einer eigenen Klasse sein und muss wiederverwendbar und auf Objekte anwendbar sein, die Regeln benötigen.
  • Beachten Sie, dass dies in einem Multiplayer-Spiel im Backend verwendet wird
  • Beachten Sie, dass jede Regel mehrere Objekte benötigt, um ihre Gültigkeit zu testen. Normalerweise kann sich ein Bauer um 1 Feld bewegen. Jetzt wird das nächste Feld auf dem Spielbrett von einem Bauern Ihres Gegners gefüllt. Ergebnis: Ihr Bauer kann sich nicht bewegen. Der Bauer sollte die anderen Bauernpositionen oder das Spielbrett in seine Validierung einbeziehen.

Ein anderes Wort für diese Regeln wären Verhaltensgrenzen.

Thomas
quelle

Antworten:

3

Stellen Sie sich ein Spiel als eine Folge von Zuständen vor , die durch Züge getrennt sind . Jedes Mal, wenn ein Spieler einen Zug macht, wird ein neuer Status generiert.

Geben Sie hier die Bildbeschreibung ein
(Es ist wie in diesem XKCD-Comic !)

Wie

Erstellen Sie eine Klasse Move, die einen Zug eines Spielers darstellt . (In Reversi ist eine ausreichende Beschreibung ein Satz von Brettkoordinaten, in denen eine Figur platziert werden soll. In Schach sind eine Ursprungs- und eine Zielkoordinate ausreichend.)

Erstellen Sie eine Klasse GameState, die den aktuellen Stand des Spiels darstellt . (In Reversi wäre eine ausreichende Beschreibung der Inhalt des Bretts und der Spieler, der an der Reihe ist. In Schach müssten Sie zusätzlich speichern, ob es jedem Spieler noch möglich ist, Königs- oder Königinnenschloss zu burgieren.)

Jetzt können Sie sich wahrscheinlich vorstellen GameState, eine isMoveLegal(Move)Methode zu haben. Schließlich enthält es alle Informationen, die es benötigt, um diese Entscheidung zu treffen.

Warum

Dieses Design isoliert die Regellogik sauber und reduziert die Abhängigkeiten zwischen Komponenten.

Es macht auch KI einfach! Sie können trivial alle möglichen Bewegungen aus a generieren GameState, prüfen, ob sie legal sind, mehr GameStates daraus generieren und im Grunde einen Baum erstellen , den Sie für Minimax verwenden können , möglicherweise mit Alpha-Beta-Bereinigung .

Anko
quelle