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 Room
objets. Chacun Room
a une liste d' Entity
objets qui se trouvent dans cette pièce. Chacun Entity
a 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 Room
utilise le nom de l'entité pour renvoyer l' Entity
objet 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 Room
objet affiche sa propre chaîne de description, puis ajoute les chaînes de description de chaque Entity
. La Entity
description 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 Entity
sous-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é?