Ich habe mich in letzter Zeit mit der Programmierung eines einfachen textbasierten Abenteuerspiels unterhalten und bin bei einem scheinbar sehr einfachen Designproblem festgefahren.
Um einen kurzen Überblick zu geben: Das Spiel ist in Room
Objekte unterteilt. Jedes Room
hat eine Liste von Entity
Objekten, die sich in diesem Raum befinden. Jedes Entity
hat einen Ereignisstatus, bei dem es sich um eine einfache Zeichenfolge-> Boolesche Zuordnung handelt, und eine Aktionsliste, bei der es sich um eine Zeichenfolge-> Funktionszuordnung handelt.
Benutzereingaben haben die Form [action] [entity]
. Der Room
verwendet den Entitätsnamen, um das entsprechende Entity
Objekt zurückzugeben, das dann den Aktionsnamen verwendet, um die richtige Funktion zu finden, und führt sie aus.
Um die Raumbeschreibung zu generieren, zeigt jedes Room
Objekt seine eigene Beschreibungszeichenfolge an und hängt dann die Beschreibungszeichenfolgen aller Objekte an Entity
. Die Entity
Beschreibung kann sich je nach Status ändern ("Die Tür ist offen", "Die Tür ist geschlossen", "Die Tür ist verschlossen" usw.).
Hier ist das Problem: Mit dieser Methode gerät die Anzahl der Beschreibungs- und Aktionsfunktionen, die ich implementieren muss, schnell außer Kontrolle. Allein mein Startraum hat ungefähr 20 Funktionen zwischen 5 Entitäten.
Ich kann alle Aktionen in einer einzigen Funktion kombinieren und if-else / durchschalten, aber das sind immer noch zwei Funktionen pro Entität. Ich kann auch bestimmte Entity
Unterklassen für allgemeine / generische Objekte wie Türen und Schlüssel erstellen , aber das bringt mich nur so weit.
EDIT 1: Auf Wunsch Pseudocode-Beispiele dieser Aktionsfunktionen.
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
Beschreibungsfunktionen verhalten sich ähnlich, überprüfen den Status und geben die entsprechende Zeichenfolge zurück.
EDIT 2: Meine Fragestellung überarbeitet. Angenommen, es gibt möglicherweise eine erhebliche Anzahl von Objekten im Spiel, die kein gemeinsames Verhalten (zustandsbasierte Antworten auf bestimmte Aktionen) mit anderen Objekten aufweisen. Gibt es eine Möglichkeit, diese einzigartigen Verhaltensweisen sauberer und wartbarer zu definieren, als eine benutzerdefinierte Funktion für jede entitätsspezifische Aktion zu schreiben?