Dies ist größtenteils eine theoretische Frage zu FP, aber ich nehme Textabenteuer (wie Old-School-Zork), um meinen Standpunkt zu veranschaulichen. Ich würde gerne wissen, wie Sie eine Stateful-Simulation mit FP modellieren würden.
Text-Abenteuer scheinen wirklich OOP zu erfordern. Zum Beispiel sind alle "Räume" Instanzen einer Room
Klasse, Sie können eine Basisklasse Item
und Schnittstellen wie Item<Pickable>
für Dinge haben, die Sie tragen können und so weiter.
Die Weltmodellierung in FP funktioniert anders, insbesondere wenn Sie Unveränderlichkeit in einer Welt erzwingen möchten, die im Verlauf des Spiels mutieren muss (Objekte werden bewegt, Feinde werden besiegt, die Punktzahl wächst, der Spieler ändert seinen Standort). Ich stelle mir ein einziges großes Objekt vor World
, das alles bietet: Welche Räume können Sie erkunden, wie sind sie miteinander verbunden, was der Spieler trägt, welche Hebel wurden betätigt?
Ich denke, dass ein reiner Ansatz wäre, dieses große Objekt grundsätzlich an eine beliebige Funktion zu übergeben und es von ihnen zurückgeben zu lassen (möglicherweise modifiziert). Zum Beispiel habe ich eine moveToRoom
Funktion, die es bekommt World
und mit World.player.location
dem neuen Raum verändert zurückgibt , World.rooms[new_room].visited = True
und so weiter.
Auch wenn dies der "korrektere" Weg ist, scheint es die Reinheit deswegen zu erzwingen. Abhängig von der Programmiersprache World
kann das Hin- und Herbewegen dieses möglicherweise sehr großen Objekts teuer sein. Außerdem muss jede Funktion möglicherweise Zugriff auf ein beliebiges World
Objekt haben. Zum Beispiel kann ein Raum zugänglich sein oder nicht, abhängig von einem Hebel, der in einem anderen Raum ausgelöst wurde, weil er möglicherweise überflutet ist. Wenn der Spieler jedoch eine Schwimmweste trägt, kann er ihn trotzdem betreten. Ein Monster kann aggressiv sein oder nicht, je nachdem, ob der Spieler seinen Cousin in einem anderen Raum getötet hat. Dies bedeutet , dass die roomCanBeEntered
Funktion zugreifen muss World.player.invetory
und World.rooms
, describeMonster
Bedürfnisse Zugang World.monsters
und so weiter (im Grunde, Sie müssendie ganze Ladung herumreichen). Das scheint mir wirklich eine globale Variable zu sein, auch wenn dies alles andere als ein guter Programmierstil ist, besonders in FP.
Wie würden Sie dieses Problem lösen?