Gibt es eine übliche Technik, um Zustände (im Allgemeinen) in einer funktionalen Programmiersprache zu behandeln? Es gibt in jeder (funktionalen) Programmiersprache Lösungen für den globalen Zustand, aber ich möchte dies so weit wie möglich vermeiden.
Alle rein funktionalen Zustände sind Funktionsparameter. Ich muss also den gesamten Spielstatus (eine gigantische Hashmap mit der Welt, Spielern, Positionen, Punkten, Assets, Feinden, ...) als Parameter für alle Funktionen angeben, die die Welt mit einem bestimmten Eingang oder Trigger manipulieren möchten . Die Funktion selbst wählt die relevanten Informationen aus dem Gamestate-Blob aus, tut etwas damit, manipuliert den Gamestate und gibt den Gamestate zurück. Aber das scheint eine schlechte Lösung für das Problem zu sein. Wenn ich den gesamten Gamestate in alle Funktionen einbaue, habe ich im Gegensatz zu globalen Variablen oder dem imperativen Ansatz keinen Nutzen für mich.
Ich könnte nur die relevanten Informationen in die Funktionen einfügen und die Aktionen zurückgeben, die für die gegebene Eingabe ausgeführt werden. Und eine einzige Funktion wendet alle Aktionen auf den Gamestate an. Die meisten Funktionen benötigen jedoch viele "relevante" Informationen. move()
brauche die Objektposition, die Geschwindigkeit, die Karte für die Kollision, die Position aller Feinde, die aktuelle Gesundheit, ... Also scheint dieser Ansatz auch nicht zu funktionieren.
Meine Frage ist also, wie ich mit der enormen Menge an Status in einer funktionalen Programmiersprache umgehen kann - insbesondere für die Spieleentwicklung?
BEARBEITEN: Es gibt einige Spiel-Frameworks zum Erstellen von Spielen in Clojure. Ein Ansatz, um dieses Problem teilweise zu lösen, besteht darin, alle Objekte im Spiel als "Entitäten" zu fädeln und in einen riesigen Beutel zu packen. A gigant Hauptfunktion hält den Bildschirm und die Entitäten und Griff Ereignisse ( :on-key-down
, :on-init
, ...) für diese Einheiten und die Hauptanzeigeschleife laufen. Aber das ist nicht die saubere Lösung, nach der ich suche.
move()
, sollten Sie wahrscheinlich an der ‚aktuellen‘ Objekt werden vorbei (oder eine Kennung für sie), plus die Welt es bewegt sich durch, und nur herleiten aktuelle Position und Geschwindigkeit ... ausgegeben die gesamte Physik Welt dann, oder zumindest eine Liste der geänderten Objekte.