2012-03-11 18 views
6

Como asignación para mi módulo C++, tengo que crear un juego de texto y aventuras. El problema que estoy enfrentando es conceptual; todos dicen que debería usar una estructura de datos de árbol para representar mi juego. Lo que no entiendo es por qué.¿Por qué utilizar una estructura de datos de árbol para representar datos en un juego de aventuras de texto?

Digamos que tengo una casa de 4 habitaciones. Podemos imaginar esto como una matriz de 2x2. En cada habitación tengo dos objetos. Quiero mostrar estos datos de manera que pueda mover fácilmente mi personaje de 0x0 a 0x1 de cualquier manera (directamente – 1 paso, o indirectamente – 3 pasos), mientras llevo un objeto conmigo.

¿Por qué es mejor usar un árbol para contener todos los datos y cómo se moverá mi personaje de un nodo a otro? ¿O el personaje es un nodo también? ¿No debería mi personaje ser un objeto con una lista como su inventario?

Estoy un poco confundido acerca de esto. No busco ningún código, solo una mejor comprensión de la representación y manipulación de datos.

La sugerencia era para mapas. Pero tampoco entiendo cómo mi personaje "navegará" un mapa.

+6

Quizás tus compañeros piensen que estás construyendo una * tree * house. –

+0

Lo siento, no estoy seguro de lo que intenta decir – Adrian

+5

Es normal cuando aprende nuevos conceptos para tratar de aplicarlos a todo. La estructura de datos de árbol es simplemente una herramienta en su caja de herramientas. A veces es una buena herramienta para el trabajo, a veces no lo es. –

Respuesta

8

Lo que estás buscando porque no es un árbol, sino un gráfico.

La razón por la que es preferible es que una serie de "lugares" no represente necesariamente lo que desea. No hay necesariamente una puerta entre todas las habitaciones contiguas, por lo que es posible que no pueda ir directamente de una a otra.En ese momento, en un tipo de juego típico de aventura de texto, puede tener algunos pasillos (o lo que sea) que lo lleven más o menos directamente de una habitación a otra que no esté exactamente (o incluso cerca) adyacente. Además, puede tener pasajes unidireccionales que lo llevarán de un lugar a otro, pero no puede dar la vuelta y regresar. Todos estos son fáciles de representar con un gráfico dirigido, pero son difíciles de representar con una matriz.

+0

Estoy de acuerdo contigo al decir que un gráfico es más apropiado para un juego de texto y aventuras. Sin embargo, si logro crear uno para representar el mapa (C++ no tiene uno), no entiendo cómo se mueve mi personaje en el gráfico. ¿No es parte de esta estructura también? – Adrian

+2

@Adrian: no, su personaje probablemente tenga un miembro de "lugar actual" que sea un puntero a un nodo en el gráfico. Si se trata de un juego multijugador, también puede desear que cada nodo tenga una lista de punteros a los jugadores que ocupan ese nodo (en cuyo caso, los nodos que atraviesan generalmente implican que el jugador se registre con un nuevo nodo al ingresar y se anule el registro en la salida). –

+0

Ahora tiene sentido de modo. Gracias. – Adrian

0

Creo que un árbol es una mejor opción, porque desea representar las posibles transiciones de estado entre las habitaciones además de las propias salas.

Piense en ello como un gráfico: los estados son las habitaciones, pero los eventos particulares desencadenarán las transiciones de uno a otro. Expresa el hecho de que un usuario no puede simplemente al azar de un estado a otro.

Piensa en autómatas finitos y máquinas de estado.

+2

Tenga en cuenta que trees! = Gráficos (de hecho, los árboles son un tipo de gráfico muy específico y limitado). Para la mayoría de los mapas, los árboles son insuficientes y se necesita un gráfico más general. – delnan

+1

De acuerdo. Creo que un árbol es mejor que el arreglo de 2x2, y el gráfico es mejor que el árbol. – duffymo

9

Si su "casa" es una cuadrícula y puede moverse desde cualquier celda de cuadrícula a cualquier otra celda de cuadrícula, una matriz está bien. Supongo que lo que tus compañeros insinuaron es que no querrás moverte de una habitación a otra contigua (y tampoco podrás pasar de decir 0,0 a 42,13).

Sin embargo, con una estructura en árbol, todavía no puede representar un conjunto arbitrario de transiciones entre salas.

Un enfoque más flexible sería un Adjacency List, que es un tipo especializado de graph. Piense en cada sala como un nodo y proporcione a cada nodo una lista de otras salas a las que se pueda hacer la transición. Con esa estructura, incluso puedes permitir transiciones de una vía (piensa en la puerta de un solo sentido de muchos juegos de aventuras).

pseudocódigo

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

Luego, cuando representa el carácter

class Character 
{ 
    string Name; 
    Room CurrentRoom; 
} 

para ver donde un carácter determinado es capaz de moverse a:

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

Sí, lo que intenté explicar fue una [Lista de adyacencia] (http://en.wikipedia.org/wiki/Adjacency_list), aunque tu respuesta es más completa. +1! –

+0

Tenga en cuenta que normalmente no desea una 'Lista ', sino una 'Lista ', o posiblemente 'Lista >' (para una definición adecuada de 'SmartPtr'). Normalmente, desea permitir que varios nodos de origen diferentes conduzcan a un destino determinado (por ejemplo, llegar a la cocina desde el comedor o la sala de estar). –

+0

Heh ... código se entiende como Pseudocódigo. Lo dejaré en claro en mi respuesta (hace 10 años que utilicé un lenguaje que trata directamente con los indicadores). –

Cuestiones relacionadas