Je me suis amusé récemment en programmant un simple jeu d'aventure basé sur du texte, et je suis coincé sur ce qui semble être un problème de conception très simple.
Pour donner un bref aperçu: le jeu se décompose en Roomobjets. Chacun Rooma une liste d' Entityobjets qui se trouvent dans cette pièce. Chacun Entitya un état d'événement, qui est une simple carte string-> booléenne, et une liste d'actions, qui est une map-> fonction map.
L'entrée utilisateur prend la forme [action] [entity]. Le Roomutilise le nom de l'entité pour renvoyer l' Entityobjet approprié , qui utilise ensuite le nom de l'action pour trouver la fonction correcte et l'exécute.
Pour générer la description de la pièce, chaque Roomobjet affiche sa propre chaîne de description, puis ajoute les chaînes de description de chaque Entity. La Entitydescription peut changer en fonction de son état ("La porte est ouverte", "La porte est fermée", "La porte est verrouillée", etc.).
Voici le problème: en utilisant cette méthode, le nombre de fonctions de description et d'action que je dois implémenter rapidement devient incontrôlable. Ma salle de départ à elle seule a environ 20 fonctions entre 5 entités.
Je peux combiner toutes les actions en une seule fonction et if-else / passer à travers, mais cela reste deux fonctions par entité. Je peux également créer des Entitysous-classes spécifiques pour des objets communs / génériques comme les portes et les clés, mais cela ne me permet que de me rendre compte jusqu'à présent.
EDIT 1: Comme demandé, des exemples de pseudo-code de ces fonctions d'action.
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
Les fonctions de description agissent à peu près de la même manière, vérifiant l'état et renvoyant la chaîne appropriée.
EDIT 2: Révision du libellé de ma question. Supposons qu'il puisse y avoir un nombre important d'objets en jeu qui ne partagent pas un comportement commun (réponses basées sur l'état à des actions spécifiques) avec d'autres objets. Existe-t-il un moyen de définir ces comportements uniques d'une manière plus propre et plus maintenable que d'écrire une fonction personnalisée pour chaque action spécifique à l'entité?