2012-03-11 15 views
6

Come compito per il mio modulo C++, devo creare un gioco di avventura testuale. Il problema che sto affrontando è concettuale; tutti dicono che dovrei usare una struttura dati ad albero per rappresentare il mio gioco. Quello che non ottengo è perché.Perché utilizzare una struttura dati ad albero per rappresentare i dati in un gioco di avventura testuale?

Diciamo che ho una casa di 4 stanze. Possiamo immaginarlo come un array 2x2. In ogni stanza ho due oggetti. Voglio visualizzare questi dati in modo tale da poter spostare facilmente il mio carattere da 0x0 a 0x1 in entrambi i modi (direttamente – 1 step o indirettamente da – 3 passaggi), mentre porto un oggetto con me.

Perché è meglio utilizzare un albero per contenere tutti i dati e in che modo il mio personaggio si sposta da un nodo all'altro? O il personaggio è anche un nodo? Il mio personaggio non dovrebbe essere un oggetto con un elenco come inventario?

Sono un po 'confuso su questo. Non sto cercando alcun codice, solo una migliore comprensione della rappresentazione e della manipolazione dei dati.

Il suggerimento era per le mappe. Ma poi non capisco come il mio personaggio "navigherà" su una mappa.

+6

Forse i tuoi colleghi pensano che stai costruendo una casa * albero *. –

+0

Scusa, non sono proprio sicuro di cosa stai cercando di dire – Adrian

+5

È normale quando impari nuovi concetti per provare ad applicarli a tutto. La struttura dei dati dell'albero è semplicemente uno strumento nella tua casella degli strumenti. A volte è un ottimo strumento per il lavoro, a volte no. –

risposta

8

Quello che stai cercando perché non è un albero, ma un grafico.

Il motivo per cui è preferibile è che una serie di "luoghi" non rappresenta necessariamente ciò che si desidera. Non c'è necessariamente una porta tra tutte le stanze adiacenti, quindi potresti non essere in grado di andare direttamente da una all'altra.Al momento, in un tipico tipo di gioco di avventura testuale, potresti avere alcuni corridoi (o qualsiasi altra cosa) che ti portano più o meno direttamente da una stanza all'altra che non è esattamente (o vicino) adiacente. Inoltre, potresti avere passaggi unidirezionali che ti porteranno da un posto all'altro, ma non puoi girarti e tornare indietro. Tutti questi sono facili da rappresentare con un grafico diretto, ma difficile da rappresentare con un array.

+0

Sono d'accordo con te nel dire che un grafico è più appropriato per un gioco di avventura testuale. Tuttavia, se riesco a crearne uno per rappresentare la mappa (il C++ non ne ha uno), non capisco come il mio personaggio si muova sul grafico. Anche questo non fa parte di questa struttura? – Adrian

+2

@Adrian: no - il tuo personaggio probabilmente ha un membro "luogo corrente" che è un puntatore a un nodo nel grafico. Se si tratta di un gioco per più giocatori, è anche possibile che ciascun nodo abbia un elenco di puntatori ai giocatori che occupano quel nodo (nel qual caso, i nodi che attraversano implicano in genere il giocatore che si registra con un nuovo nodo in entrata e che si disconnettono all'uscita). –

+0

Ora ha senso per la modalità. Grazie. – Adrian

0

Penso che un albero sia una scelta migliore, perché vuoi rappresentare possibili transizioni di stato tra le stanze oltre alle stanze stesse.

Pensatelo come un grafico: gli stati sono le stanze, ma particolari eventi provocheranno le transizioni da uno all'altro. Esprime il fatto che un utente non può solo casualmente da uno stato all'altro.

Pensate agli automi finiti e alle macchine a stati.

+2

Nota che alberi! = Grafici (infatti, gli alberi sono un tipo di grafico molto specifico e limitato). Per la maggior parte delle mappe, gli alberi sono insufficenti e serve un grafico più generale. – delnan

+1

concordato. Penso che un albero sia migliore dell'array 2x2 e che il grafico sia migliore dell'albero. – duffymo

9

Se la "casa" è una griglia e si può passare da una qualsiasi cella della griglia a qualsiasi altra cella della griglia, una matrice va bene. Sto indovinando che cosa stanno suggerendo i tuoi colleghi è che potresti non voler essere in grado di spostarti da una stanza a un'altra stanza adiacente (e anche NON essere in grado di spostarti da dire da 0,0 a 42,13).

Tuttavia, con una struttura ad albero, non è ancora possibile rappresentare un insieme arbitrario di transizioni tra le stanze.

Un approccio più flessibile sarebbe un Adjacency List, che è un tipo specializzato di graph. Pensa a ogni stanza come a un nodo e dai a ciascun nodo un elenco di altre stanze a cui è possibile passare. Con quella struttura, puoi anche consentire transizioni a senso unico (pensa a una porta a senso unico da molti giochi di avventura).

pseudocodice

class Room 
{ 
    string Name; 
    string Description 
    List<Room> ConnectedRooms; 
} 

Poi, quando rappresenta il carattere

class Character 
{ 
    string Name; 
    Room CurrentRoom; 
} 

Per vedere dove un dato personaggio è in grado di muoversi a:

List<Room> availableRooms = myCharacter.CurrentRoom.ConnectedRooms; 
+0

Sì, quello che ho cercato di spiegare era un [Adjacency List] (http://en.wikipedia.org/wiki/Adjacency_list), ma la tua risposta è più completa. +1! –

+0

Si noti che normalmente non si desidera un 'Elenco ', ma un 'Elenco ', o eventualmente 'Elenco >' (per alcune definizioni appropriate di 'SmartPtr'). Normalmente si desidera consentire a diversi nodi di origine di condurre in una determinata destinazione (ad es. Raggiungere la cucina dalla sala da pranzo o dal soggiorno). –

+0

Heh ... il codice è inteso come Pseudocodice. Lo renderò chiaro nella mia risposta (sono passati 10 anni da quando ho usato un linguaggio che si occupa direttamente di puntatori). –

Problemi correlati