Problema a resolver: genera un mapa de mazmorra 2D aleatorio para un juego basado en fichas donde todas las habitaciones están conectadas.
Estoy buscando mejores soluciones que las que tengo actualmente.
Mi solución actual es que ejecuto dos algoritmos. El primero genera la mazmorra con sus habitaciones. El segundo asegúrese de que todas las habitaciones estén conectadas. Tengo curiosidad por saber qué otras soluciones pueden existir. Más rápido y / o más fácil, etc. La velocidad no es realmente una preocupación, pero si la velocidad se puede obtener sin costo real, bueno, eso es algo bueno. Más importante es que yo, y otros que leen, pueden aprender diferentes formas de abordar y resolver el problema.
A continuación están mi implementación actual. Las habitaciones actualmente no tienen salidas o salidas en ninguna de las 2, 3 o 4 direcciones.
Generando las salas de mazmorras
Configuración: establece la sala actual en la sala superior izquierda.
- Obtenga un tipo de habitación válido para la habitación (donde el tipo de habitación válido es un tipo sin salidas de la mazmorra y que tiene salidas que coinciden con las salidas de la habitación de arriba y la habitación de la izquierda. Solo necesita marcar arriba y izquierda debido al paso 2 a continuación).
- Baja la habitación y avanza la coordenada x un paso. Si la coordenada x excede el ancho de la mazmorra, establece la coordenada x en 0 y avanza la coordenada y un paso. Si la coordenada y excede la altura de la mazmorra, hemos terminado.
- Repita desde el n. ° 1.
Luego verifico para ver si todas las habitaciones están conectadas. Si no están todas conectadas, ejecuto un segundo algoritmo que, de una manera no sexy pero definitivamente lo suficientemente buena en términos de diseño de mazmorras, recorre las habitaciones y las cambia para que todo termine estar conectado
Verificando si todas las habitaciones están conectadas
Configuración: cree un mapa 2D de enteros que representen rutas e inicialice las entradas a un valor "no procesado" (aún no atravesado), -1. Establezca un entero de índice de ruta de inicio que haga un seguimiento de la ruta actual en 1. Establezca la habitación actual en la habitación superior izquierda agregándola a una pila de habitaciones para verificar.
- Si la pila contiene habitaciones para verificar, al abrirla establezca el índice de ruta de la habitación en el índice de ruta actual. Si la pila no contiene ninguna habitación, aumente el índice de ruta e intente obtener una habitación avanzando columna por columna, fila por fila, hasta obtener una habitación que aún no se haya procesado. Si no se puede encontrar espacio, hemos terminado.
- Verifique si la habitación tiene una salida a la izquierda. Si ha agregado el espacio izquierdo a la pila si aún no está allí.
- Repita el paso 2 para las direcciones hacia abajo, hacia la derecha y hacia arriba (ya que estamos usando una pila que significa que las habitaciones están atravesadas en el sentido de las agujas del reloj, comenzando con la dirección hacia arriba).
- Repita desde el paso 1.
- Si el recuento de índices de ruta es mayor que uno, hay habitaciones desconectadas.
Si hay habitaciones desconectadas, las agrupo por su índice de ruta, obtengo el índice de la ruta más grande y conecto todas las demás habitaciones a esas habitaciones. Este es un trabajo en progreso, pero mi plan (actual, "brutal") es revisar cada habitación en un grupo de habitaciones (excepto la primera) para ver si hay una ruta horizontal o vertical hacia el grupo de habitaciones biggeset, y si es así, cree una ruta horizontal / vertical inyectando / actualizando las habitaciones intermedias. Enjuague y repita. Feo, sí, pero es algo que no será notable en términos de patrón visual, por lo que funciona en ese sentido.