Estou fazendo um jogo com um mundo processualmente gerado, criado no início do jogo, composto por várias áreas representadas por grades (por exemplo, 8x8, 9x6, os tamanhos seriam idealmente arbitrários). Essas áreas devem estar conectadas entre si por meio de uma lista de dependências.
Existe uma conexão quando pelo menos três espaços dessa grade são expostos entre essas duas áreas. Na célula do meio dessa área de conexão de 3 espaços, está a porta entre as áreas:
Eu tenho tentado descobrir uma maneira de conectá-los, mas torna-se cada vez mais complexo quanto mais áreas você precisar considerar ao mesmo tempo.
Eu tentei fazer prototipagem de papel e, embora seja um processo muito simples ao visualizá-lo, não encontrei um bom conjunto de expressões matemáticas que me permitam colocar salas com a mesma eficiência por código.
Aqui está um exemplo "simples" com o qual estou lutando agora:
- A área 'a' precisa estar conectada a 'b' e 'c'
- A área 'b' precisa estar conectada a 'a' e 'd'
- A área 'c' precisa estar conectada a 'a' e 'd'
- A área 'd' precisa estar conectada a 'b' e 'c'
Considere, por simplicidade, que estamos colocando os quartos por ordem de aparência na lista (tentei outros). Então, estou abordando isso como seu algoritmo de geração de calabouço processual padrão.
Colocamos 'a' em qualquer lugar do quadro, pois é a primeira área. Em seguida, escolhemos uma parede aleatoriamente e, como nada está conectado a essa parede, podemos colocar 'b' lá:
Agora precisamos colocar 'c', mas 'a' já está no quadro e tem uma parede ocupada, por isso decidimos colocá-lo em outra parede. Mas nem todo canal serve, porque 'd' está chegando e precisa estar conectado a 'b' e 'c' também:
Tentei uma possível limitação de que 2 salas com o mesmo conjunto de dependências não podem estar em paredes opostas, mas mesmo isso não garante sucesso:
E em outros casos, onde as áreas têm tamanhos diferentes, estar em paredes opostas pode funcionar:
Além disso, não considerar uma parede usada é uma suposição falha, pois exclui soluções válidas:
Tentei pesquisar pesquisas sobre outros algoritmos de Geração de Procedimentos ou similares, como os algoritmos Optimal Rectangle Packing e Layout de gráfico, mas geralmente esses algoritmos não levam em conta todas as restrições desse problema e são difíceis de misturar.
Pensei em várias abordagens, incluindo colocar uma área e voltar até encontrar um local adequado, mas elas parecem muito dependentes de tentativa e erro e custam caro em termos de computação. Mas, dada a extensa pesquisa sobre os dois últimos problemas que mencionei, pode ser a única / melhor solução?
Eu só queria ver se alguém teve problemas semelhantes no passado ou está disposto a me ajudar a descobrir isso e me dar algumas dicas sobre onde eu deveria começar com o algoritmo. Ou, na sua falta, terei que afrouxar as restrições que estabeleci.