Ultimamente mi sono divertito programmando un semplice gioco di avventura basato su testo e sono bloccato su quello che sembra un problema di design molto semplice.
Per dare una breve panoramica: il gioco è suddiviso in Room
oggetti. Ognuno Room
ha un elenco di Entity
oggetti che si trovano in quella stanza. Ognuno Entity
ha uno stato di evento, che è una semplice mappa booleana stringa> e un elenco di azioni, che è una mappa stringa> funzione.
L'input dell'utente assume la forma [action] [entity]
. Il Room
utilizza il nome dell'entità di restituire l'appropriato Entity
oggetto, che poi utilizza il nome dell'azione per trovare il corretto funzionamento, e lo esegue.
Per generare la descrizione della stanza, ogni Room
oggetto visualizza la propria stringa di descrizione, quindi aggiunge le stringhe di descrizione di ciascuna Entity
. La Entity
descrizione può cambiare in base al suo stato ("La porta è aperta", "La porta è chiusa", "La porta è chiusa", ecc.).
Ecco il problema: usando questo metodo, il numero di descrizioni e funzioni di azione che devo implementare rapidamente sfugge di mano. La mia stanza di partenza da sola ha circa 20 funzioni tra 5 entità.
Posso combinare tutte le azioni in un'unica funzione e if-else / passare da una all'altra, ma sono comunque due funzioni per entità. Posso anche creare Entity
sottoclassi specifiche per oggetti comuni / generici come porte e chiavi, ma questo mi porta solo così lontano.
EDIT 1: Come richiesto, esempi di pseudo-codice di queste funzioni di azione.
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
Le funzioni di descrizione agiscono praticamente allo stesso modo, controllando lo stato e restituendo la stringa appropriata.
EDIT 2: rivisto il mio testo delle domande. Supponiamo che ci possa essere un numero significativo di oggetti in-game che non condividono comportamenti comuni (risposte basate sullo stato ad azioni specifiche) con altri oggetti. Esiste un modo per definire questi comportamenti unici in un modo più pulito e più gestibile che scrivere una funzione personalizzata per ogni azione specifica dell'entità?