Últimamente me he entretenido programando un simple juego de aventuras basado en texto, y estoy atascado en lo que parece un problema de diseño muy simple.
Para dar una breve descripción: el juego se divide en Room
objetos. Cada uno Room
tiene una lista de Entity
objetos que están en esa habitación. Cada uno Entity
tiene un estado de evento, que es una cadena simple-> mapa booleano, y una lista de acciones, que es una cadena-> mapa de funciones.
La entrada del usuario toma la forma [action] [entity]
. El Room
utiliza el nombre de la entidad para devolver el apropiado Entity
objeto, que luego se utiliza el nombre de acción para encontrar la función correcta, y lo ejecuta.
Para generar la descripción de la sala, cada Room
objeto muestra su propia cadena de descripción, luego agrega las cadenas de descripción de cada Entity
. La Entity
descripción puede cambiar según su estado ("La puerta está abierta", "La puerta está cerrada", "La puerta está cerrada", etc.).
Aquí está el problema: al usar este método, la cantidad de funciones de descripción y acción que necesito implementar se sale de control rápidamente. Mi sala de inicio solo tiene alrededor de 20 funciones entre 5 entidades.
Puedo combinar todas las acciones en una sola función y if-else / cambiar a través de ellas, pero aún son dos funciones por entidad. También puedo crear Entity
subclases específicas para objetos comunes / genéricos como puertas y llaves, pero eso solo me lleva muy lejos.
EDITAR 1: según se solicite, ejemplos de pseudocódigo de estas funciones de acción.
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
Las funciones de descripción actúan casi de la misma manera, verifican el estado y devuelven la cadena apropiada.
EDIT 2: Revisé mi redacción de preguntas. Suponga que puede haber un número significativo de objetos en el juego que no comparten un comportamiento común (respuestas basadas en el estado a acciones específicas) con otros objetos. ¿Hay alguna manera de definir estos comportamientos únicos de una manera más limpia y fácil de mantener que escribiendo una función personalizada para cada acción específica de la entidad?