Generación de mazmorras de procedimiento: ¿Existe un algoritmo simple para asegurarse de que todas estas salas se conecten utilizando corredores mínimos?

9

¿Es posible obtener una estructura similar a una colmena, conectando todas las habitaciones sin tener demasiados pasillos? (Demasiados pasillos de 3-4+ provenientes de una sola habitación)

A continuación se muestra el resultado de cómo se ven mis habitaciones, básicamente ubicadas al azar.

salida de una cuadrícula de habitaciones, colocada al azar

Lo que espero obtener en cuanto al corredor.

http://i.imgur.com/9GUi6Yy.png

Mezclador
fuente
No creo que 3 o 4 sean "demasiados corredores". Especialmente si tienes 9 habitaciones en tu mazmorra. Además, no estoy seguro de lo que quieres decir con "estructura similar a una colmena", ¿podrías explicar qué aspecto estás buscando?
fnord
Tal vez incluya un mapa "completado" para mostrar lo que le interesa tener.
MichaelHouse
Ah sí, me refería a un máximo de 3 o 4 corredores procedentes de cada habitación.
Blenderer
He agregado una imagen de lo que estoy trabajando en cuanto a corredores.
Blenderer
2
Si no tiene 3 corredores de ninguna habitación, solo podrá hacer una unión lineal simple de las habitaciones y, por lo tanto, simplemente elija una y únala a sus dos vecinos más cercanos.
Nick

Respuestas:

6

Bueno, la forma más simple en que puedo pensar comienza con asegurarme de que todas las habitaciones estén conectadas por al menos 1 corredor:

  1. Comience con la última o primera habitación.
  2. Tome una habitación al azar dentro de 1 distancia, que aún no está conectada a alguna habitación (todas las habitaciones comienzan a desconectarse, por lo que hará un seguimiento de esto a medida que avanza).
  3. Si no hay tal habitación, vaya a la distancia +1. Si está bien hacer un túnel sobre / debajo de otra habitación, esto es más fácil, suponiendo que no desee conectar pasillos.
  4. Ábrete camino de forma pseudoaleatoria hasta que todas las habitaciones estén conectadas.

Ahora sabemos que puede llegar a todas las habitaciones, pero ahora, si desea algo más que este laberinto estrictamente lineal, puede simplemente recorrer sus habitaciones y hacer un nuevo camino al azar para conectar habitaciones, hasta un límite por habitación de 2-3, o hasta que un cierto porcentaje de habitaciones alcance las conexiones máximas, etc.

Como paso final, puede agregar reglas que alterarían sus resultados para adaptarse a diversas situaciones. Por ejemplo, puede observar que cualquier habitación con solo 1 corredor es, por definición, un callejón sin salida; Podría hacer más callejones sin salida, o podría eliminarlos todos asegurándose de que todo tenga al menos 2 conexiones. Podrías hacer que los callejones sin salida tengan un pasaje secreto. Podrías asegurarte de que una habitación de jefe sea un callejón sin salida. Puede asegurarse de que su sala de inicio sea un callejón sin salida, pero luego asegúrese de que la segunda sala tenga un mínimo de conexiones X. Indefinidamente.

Cada suposición y regla puede cambiar radicalmente la apariencia de sus niveles, ¡pero eso es parte de la diversión! Esto debería al menos hacer que comiencen las habitaciones tipo colmena / cueva.

BrianH
fuente
Esto está bastante cerca del algoritmo de árbol de expansión mínimo de Kruskal : esto modifica la condición en 2 de "no conectado a alguna habitación" a "no conectado al mismo clúster " que corrige un error en las reglas descritas anteriormente donde podría tener un situación en la que cada habitación está conectado a alguna sala de la mazmorra, pero en su conjunto sigue formando múltiples islas desconectadas. Kruskal's tiene garantizado encontrar un gráfico de conexión con la longitud mínima total del corredor.
DMGregory
3

Simplemente construya sus habitaciones ya conectadas. Comience con una habitación, luego construya 1-3 pasillos a otras habitaciones. Luego recurse hasta que haya agregado suficientes habitaciones.

Nicol Bolas
fuente
2

Dado que estas salas son vértices de gráficos incrustados en una llanura 2D, esto podría hacerse en teoría resolviendo el problema del vendedor ambulante (lo cual estaría bien con solo unas pocas salas). Obviamente, una simple heurística estaría bien y permitiría una escalabilidad razonable.

Calcula los bordes (longitudes de pasillo) entre todas las habitaciones. Los ordena por longitud. Agregue el corredor más corto a menos que cree un ciclo o aumente el grado del vértice (habitación) por encima del valor máximo deseado (3-4) (Repetir). Para verificar los ciclos, puede aplicar UnionFind o hacer un BFS rápido en datos pequeños.

AturSams
fuente
Esta respuesta es mejor que la respuesta aceptada. Una estrategia codiciosa de elegir primero los corredores de conexión más cortos debería funcionar. Para evitar ciclos, no haga conexiones a habitaciones que ya tienen un corredor conectado a ellas.
Jelle van Campen
@JellevanCampen Gracias. ;) Puede tener dos componentes conectados aislados. Por lo tanto, es probable que desee utilizar union find o verificar con BFS si los dos nodos están conectados.
AturSams
Ah sí, tienes razón en eso, mi mal.
Jelle van Campen