He estado mirando algunos algoritmos y artículos sobre la generación procesal de una mazmorra. El problema es que estoy tratando de generar una casa con habitaciones, y no parecen cumplir con mis requisitos.
Por un lado, las mazmorras tienen pasillos, donde las casas tienen pasillos. Y aunque inicialmente pueden parecer lo mismo, un pasillo no es más que el área que no es una habitación, mientras que un corredor está específicamente diseñado para conectar un área con otra.
Otra diferencia importante con una casa es que tiene un ancho y una altura específicos, y tiene que llenar todo con habitaciones y pasillos, mientras que con una mazmorra, hay espacio vacío.
Creo que los pasillos en una casa es algo entre un corredor de mazmorra (te lleva a otras habitaciones) y un espacio vacío en la mazmorra (no está explícitamente definido en el código).
Más específicamente, los requisitos son:
- Hay un conjunto de habitaciones predefinidas
que no puedo crear paredes y puertas sobre la marcha. - Las habitaciones se pueden rotar pero no cambiar su tamaño.
Nuevamente, debido a que tengo un conjunto predefinido de habitaciones, solo puedo rotarlas, no redimensionarlas. - Las dimensiones de la casa están establecidas y deben estar completamente llenas de habitaciones (o salas). Es
decir, quiero llenar una casa de 14x20 con las habitaciones disponibles, asegurándome de que no haya espacio vacío.
Aquí hay algunas imágenes para aclarar esto un poco:
Como puede ver, en la casa, el "espacio vacío" todavía es transitable y lo lleva de una habitación a otra.
Entonces, habiendo dicho todo esto, tal vez una casa es solo una mazmorra realmente muy apretada con pasillos. O es algo más fácil que una mazmorra. Tal vez hay algo por ahí y no lo he encontrado porque realmente no sé qué buscar.
Aquí es donde me gustaría su ayuda: ¿ podría darme consejos sobre cómo diseñar este algoritmo? ¿Alguna idea sobre qué pasos tomará? Si has creado un generador de mazmorras, ¿cómo lo modificarías para que se ajuste a mis requisitos? Puedes ser tan específico o genérico como quieras. Estoy buscando elegir tu cerebro, de verdad.
Respuestas:
Creo que este es un buen caso para usar la partición de espacio binario o ternario.
En el primer pase, divida el espacio de la casa en pasillos y {bloques de habitaciones}. Obtenga el próximo fragmento grande, divídalo en {hall and chunk} o {2 trozos y hall entre ellos}. En cada paso, gire la dirección de corte en 90 grados. Deténgase cuando {no queden más trozos grandes} o {el área total de la sala alcance el límite}.
En el segundo pase, divide los trozos restantes en habitaciones. Obtenga el próximo gran trozo y divídalo. Omita dividir algunos fragmentos no tan grandes al azar, para tener algunas habitaciones grandes.
Si alguna sala está orientada hacia una sala mucho más antigua, coloque la pared (o pared con puerta) allí.
Conecte habitaciones con pasillos directamente o a través de otras habitaciones ya conectadas.
Por ejemplo, puede ver mi resultado creado manualmente o C ++, como un pseudocódigo parcialmente hecho . Disparo final:
fuente
L-system
.Puede aprovechar el hecho de que su diseño deseado agrupa las habitaciones en habitaciones rectangulares rodeadas de pasillos. Con eso en mente, haría esto:
Llenar los grandes espacios con habitaciones se puede hacer fácilmente si comienza con las habitaciones en los bordes: tienen limitaciones específicas, por ejemplo, las habitaciones que dan a un pasillo pueden tener una puerta en esa pared, pero las habitaciones que dan a las "paredes exteriores" no puede (podrían tener ventanas, tal vez). Las habitaciones "dentro" de los grandes bloques de habitaciones necesitarán al menos una entrada.
fuente
Entonces, así es como resolví este problema. Pero primero, me gustaría agradecer a @Shadows In Rain y @egarcia por sus respuestas. Me dieron una buena dirección que me ayudó a obtener algunos resultados.
Utilicé la partición espacial de Shadows In Rain para generar una casa básica y luego seguí los consejos de egarcia para llenar el área con habitaciones.
La partición del espacio fue bastante sencilla ya que el 90% del código fue realizado por Shadows. La parte de "llenar las habitaciones" fue un poco más desafiante. Decidí usar un pseudo sistema de planificación de IA que usa A * para colocar las habitaciones de manera adecuada. Lo bueno de usar la planificación en lugar de solo A * es que las condiciones previas ayudan a reducir significativamente el espacio de búsqueda.
Aquí hay algunas capturas de pantalla con los resultados:
Fase de generación de planta
Fase de colocación de sala
¡Ahora con puertas comunicantes!
fuente
Dahl y Rinde tienen un documento de tesis sobre Generación procesal de ambientes interiores que utiliza un enfoque de esqueleto y regiones para llenar los interiores de los edificios con habitaciones y pasillos. El documento incluye diagramas de clase para su prototipo. También hay algunas buenas referencias en su bibliografía, incluido el A Pattern Language antes mencionado .
Su trabajo fue diseñado en torno a los siguientes supuestos simplificadores:
Aquí hay una breve descripción de su proceso:
Finalmente, los apartamentos se dividen en habitaciones utilizando un diagrama ponderado tipo Voronoi como base de la siguiente manera:
fuente