Ú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 Roomobjetos. Cada uno Roomtiene una lista de Entityobjetos que están en esa habitación. Cada uno Entitytiene 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 Roomutiliza el nombre de la entidad para devolver el apropiado Entityobjeto, 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 Roomobjeto muestra su propia cadena de descripción, luego agrega las cadenas de descripción de cada Entity. La Entitydescripció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 Entitysubclases 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?