Estoy haciendo un juego con un mundo generado por procedimientos creado al comienzo del juego, que consta de varias áreas representadas por cuadrículas (por ejemplo, 8x8, 9x6, los tamaños serían idealmente arbitrarios). Se supone que estas áreas están conectadas entre sí a través de una lista de dependencias.
Existe una conexión cuando al menos 3 espacios de esa cuadrícula están expuestos entre esas dos áreas. En la celda central de esa área de conexión de 3 espacios está la puerta entre las áreas:
He estado tratando de encontrar una manera de conectarlos, pero se vuelve cada vez más complejo a medida que se necesitan más áreas al mismo tiempo.
Probé algunos prototipos de papel y, aunque es un proceso muy simple al hacerlo visualmente, no he encontrado un buen conjunto de expresiones matemáticas que me permita colocar habitaciones con la misma eficiencia por código.
Aquí hay un ejemplo "simple" con el que estoy luchando en este momento:
- El área 'a' necesita conectarse a 'b' y 'c'
- El área 'b' debe estar conectada a 'a' y 'd'
- El área 'c' debe conectarse a 'a' y 'd'
- El área 'd' necesita conectarse a 'b' y 'c'
Considere, por simplicidad, estamos colocando las habitaciones por su orden de aparición en la lista (he probado otras). Así que me estoy acercando a esto como su algoritmo de procedimiento estándar de Dungeon Generation.
Colocamos 'a' en cualquier lugar del tablero, ya que es la primera área. A continuación, elegimos un muro al azar y, dado que nada está conectado a ese muro, podemos colocar 'b' allí:
Ahora necesitamos colocar 'c', pero 'a' ya está en el tablero y tiene una pared ocupada, por lo que decidimos colocarlo en otra pared. Pero no todas las ubicaciones funcionarán, porque 'd' se acerca y también necesita conectarse a 'b' y 'c':
Intenté una posible limitación de que 2 habitaciones que tienen el mismo conjunto de dependencias no pueden estar en paredes opuestas, pero incluso eso no garantiza el éxito:
Y en otros casos, donde las áreas tienen diferentes tamaños, estar en paredes opuestas puede funcionar:
Además, no considerar una pared usada es una suposición defectuosa ya que descarta soluciones válidas:
He intentado buscar investigaciones sobre otros algoritmos de Generación de Procedimientos o similares, como los algoritmos Optimal Rectangle Packing y Graph Layout, pero generalmente esos algoritmos no tienen en cuenta todas las restricciones de este problema y son difíciles de mezclar.
Pensé en un montón de enfoques, incluida la colocación de un área y retroceso hasta encontrar una ubicación adecuada, pero parecen muy dependientes de la prueba y el error y son costosos en términos de cómputo. Pero, dada la extensa investigación sobre los dos últimos problemas que mencioné, ¿podría ser la única / mejor solución?
Solo quería ver si alguien ha tenido problemas similares en el pasado o si está dispuesto a ayudarme a resolver esto y darme algunos consejos sobre dónde debo comenzar con el algoritmo. O, en su defecto, tendré que buscar aflojar las restricciones que he establecido.