2010-10-22 16 views
8

Por lo tanto, estaba pensando en hacer un generador mundial aleatorio simple. Este generador crearía una "célula" inicial que tendría entre una y cuatro salidas al azar (en los puntos cardinales, algo así como un laberinto). Después de decidir esas salidas, generaría una nueva "celda" aleatoria en cada una de esas salidas, y repetiría cada vez que un jugador se acercara a una parte del mundo que aún no se había generado. Este concepto permitiría un tipo de mundo "infinito", todo generado al azar; sin embargo, no estoy seguro de cómo representar mejor esto internamente.Estructura de datos para un mundo aleatorio

Estoy usando C++ (lo que realmente no importa, podría implementar cualquier tipo de estructura de datos necesaria). Al principio pensé en usar una especie de gráfico dirigido en el que cada nodo tendría bordes dirigidos a cada celda que lo rodea, pero esto probablemente no funcionará bien si un usuario encuentra un lugar en el mundo, retrocede, y vuelve a eso lugar desde otra dirección. El mundo podría hacer cosas raras, como generar dos celdas en una ubicación.

¿Alguna idea sobre qué tipo de estructura de datos podría ser la más efectiva para tal situación? ¿O estoy haciendo algo realmente tonto con mi generación mundial aleatoria?

Cualquier ayuda sería muy apreciada. Gracias, Chris

Respuesta

4

A map< pair<int,int>, cell> probablemente funcionaría bien; el par representaría las coordenadas x, y. Si no hay una celda en el mapa en esas coordenadas, crea una nueva celda. Si quisiera hacerlo realmente infinito, podría reemplazar las entradas con una clase entera de longitud arbitraria que tendría que proporcionar (como un bigint)

+0

No puedo creer que no pienso en esto, es una solución tan simple y rápido. –

+1

Como se mencionó @Nathon para una celda nueva, asegúrese de verificar si existen celdas adyacentes y crear/prevenir puertas en esas celdas adyacentes, según corresponda. – jholl

2

¿No podría tener un hash (o conjunto de STL) almacenado? una colección de todas las coordenadas de cuadrícula que contienen celdas ocupadas?

Luego, cuando esté buscando crear una nueva celda, puede verificar rápidamente si la ubicación de la celda candidata ya está ocupada.

(si tuviera espacio limitado, podría usar una matriz 2d - Creo que vi esto en un artículo de la revista Byte en ~ 1980-ish, pero si lo entiendo correctamente, quiere un mundo que podría extenderse indefinidamente)

3

Si las celdas del mundo están dispuestas en una cuadrícula, puede darles fácilmente coordenadas cartesianas. Si mantiene una gran lista de celdas existentes, antes de determinar las salidas de una celda determinada, puede verificar esa lista para ver si ya existe alguno de sus vecinos. Si lo hacen, y usted no quiere tener puertas de 1 vía (¿gráfico dirigido?), Entonces tendrá que tener en cuenta sus salidas. Si no te importa tener rampas en tu juego, aún puedes elegir salidas al azar, solo asegúrate de vincularlas a las existentes si están allí.

Nota de optimización: comprobar una tabla hash para ver si contiene una clave en particular es O (1).

+0

El único problema sería que los tiempos de búsqueda comenzarían a ser malos una vez que el mundo creciera, ¿no? –

+1

No si usa una tabla hash. – nmichaels

+0

Buen punto acerca de la puerta de sentido único y la necesidad de un gráfico dirigido. –

5

Te recomiendo que leas sobre los gráficos. Esta es exactamente una aplicación de generación de gráficos aleatorios. En lugar de 'celda' y 'salida', está describiendo 'nodo' y 'borde'.

Además, entonces puede hacer cosas como el análisis de ruta más corta, la detección de ciclos y todo tipo de otras aplicaciones de teoría de gráficos útiles.

This le ayudará a entender acerca de los nodos y los bordes:

y here es una aplicación terminada de estos conceptos. Implementé esto de una manera OOP: cada nodo conocía sus bordes a otros nodos. Una alternativa popular es implementar esto usando un adjacency list.Creo que el concepto de lista de adyacencia es básicamente lo que user470379 describió con su respuesta. Sin embargo, su solución de mapa permite gráficos infinitos, mientras que una lista de adyacencia tradicional no lo hace. Me encanta la teoría de grafos, y esta es una aplicación perfecta de ella.

¡Buena suerte!

-Brian J. Stianr-

+0

Realmente quería usar gráficos, y tal vez lo haga, tendré que mirar un poco. Siento que un HashMap podría ser más eficiente. –

+0

Simplemente depende de lo que quiere hacer y de cómo quiere abordar el problema. Si está hablando de algo con lo que un jugador humano interactuará, creo que la claridad asociada con pensar en esto como un gráfico superará cualquier aumento de eficiencia que logre al usar un HashMap. ¿De verdad le importa si su programa toma un segundo para generar un gráfico aleatorio que es fácil de razonar, frente a 1/10 de segundo para generar un HashMap que es difícil de depurar o aplicar cualquiera de los numerosos algoritmos existentes para? –

Cuestiones relacionadas