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 Roomoggetti. Ognuno Roomha un elenco di Entityoggetti che si trovano in quella stanza. Ognuno Entityha 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 Roomutilizza il nome dell'entità di restituire l'appropriato Entityoggetto, che poi utilizza il nome dell'azione per trovare il corretto funzionamento, e lo esegue.
Per generare la descrizione della stanza, ogni Roomoggetto visualizza la propria stringa di descrizione, quindi aggiunge le stringhe di descrizione di ciascuna Entity. La Entitydescrizione 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 Entitysottoclassi 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à?