Geração de calabouço processual: Existe um algoritmo simples para garantir que todas essas salas sejam conectadas usando corredores mínimos?

9

É possível obter uma estrutura semelhante a uma colméia, conectando todas as salas sem ter muitos corredores? (Muitos são 3-4 + corredores vindos de um quarto individual)

Abaixo está a saída de como meus quartos ficam, basicamente eles são colocados aleatoriamente.

saída das salas de uma grade, colocadas aleatoriamente

O que eu espero obter no corredor.

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

Liquidificador
fonte
Eu não acho que 3 ou 4 são "muitos corredores". Especialmente se você tiver 9 quartos em sua masmorra. Além disso, não sei bem o que você quer dizer com "estrutura semelhante a uma colméia", você poderia elaborar qual o visual que está tentando usar?
Fnord 6/08/13
Talvez inclua um mapa "concluído" para mostrar o que você está interessado em ter.
Michaelhouse
Ah, sim, eu quis dizer um máximo de 3 ou 4 corredores vindos de cada quarto.
Blenderer
Eu adicionei uma imagem do que estou trabalhando em relação aos corredores.
Blenderer
2
Se você não tiver três corredores de nenhuma sala, poderá fazer uma junção linear simples das salas e, portanto, simplesmente escolha uma e junte-a aos dois vizinhos não ligados mais próximos.
6133 Nick

Respostas:

6

Bem, a maneira mais simples de pensar começa por garantir que todos os quartos estejam conectados por pelo menos 1 corredor:

  1. Comece com o último ou o primeiro quarto.
  2. Pegue uma sala aleatória a uma distância, que ainda não está conectada a alguma sala (todas as salas começam desconectadas, portanto você acompanhará isso à medida que avança).
  3. Se não houver espaço, vá para a distância +1. Se não há problema em passar por cima / embaixo de outra sala, isso é mais fácil, supondo que você não queira conectar corredores.
  4. Faça o seu caminho pseudo-aleatoriamente até que todos os quartos estejam conectados.

Agora sabemos que você pode chegar a todos os quartos, mas agora, se quiser mais do que este labirinto estritamente linear, basta percorrer os quartos e criar aleatoriamente um novo caminho para conectar os quartos, até um limite por quarto de 2 a 3, ou até que uma certa porcentagem de quartos atinja o máximo de conexões - etc.

Como etapa final, você pode adicionar regras que alterariam seus resultados para acomodar várias situações. Por exemplo, você pode observar que qualquer sala com apenas 1 corredor é, por definição, um beco sem saída; Você pode criar mais becos sem saída ou eliminá-los, garantindo que tudo tenha pelo menos 2 conexões. Você pode fazer com que becos sem saída tenham uma passagem secreta. Você pode garantir que a sala dos chefes seja um beco sem saída. Você pode garantir que sua sala inicial seja um beco sem saída, mas verifique se a segunda sala possui um mínimo de X conexões. Ao infinito.

Cada suposição e regra pode mudar radicalmente a aparência dos seus níveis, mas isso faz parte da diversão! Isso deve pelo menos levar você a uma colméia / caverna para começar.

BrianH
fonte
Isso está bastante próximo do algoritmo Minimum Spanning Tree de Kruskal - isso modifica a condição em 2 de "ainda não está conectado a alguma sala" para "ainda não está conectado ao mesmo cluster ", que corrige um erro nas regras descritas acima, nas quais você pode ter um situação em que cada quarto está conectado a algum quarto, mas a masmorra como um todo ainda forma várias ilhas desconectadas. É garantido que a Kruskal's encontre um gráfico de conexão com o comprimento total mínimo do corredor.
DMGregory
3

Basta construir seus quartos já conectados. Comece com uma sala e depois construa 1 a 3 corredores para outras salas. Depois, recorra até adicionar quartos suficientes.

Nicol Bolas
fonte
2

Como essas salas são vértices de gráfico incorporados em uma planície 2D, isso poderia, em teoria, ser resolvido resolvendo o problema do vendedor ambulante (o que seria bom com apenas algumas salas). Obviamente, uma heurística simples seria adequada e permitiria uma escalabilidade razoável.

Você calcula as arestas (comprimentos do corredor) entre todos os quartos. Você os classifica por comprimento. Você adiciona o corredor mais curto, a menos que ele crie um ciclo ou aumente o grau do vértice (sala) acima do valor máximo desejado (3-4) (Repetir). Para verificar os ciclos, você pode aplicar o UnionFind ou fazer um BFS rápido em pequenos dados.

AturSams
fonte
Essa resposta é melhor que a resposta aceita. Uma estratégia gananciosa de escolher os corredores de conexão mais curtos primeiro deve funcionar. Para evitar ciclos, não faça conexões com salas que já tenham um corredor conectado a elas.
Jelle van Campen
@JellevanCampen Thanks. ;) Você pode ter dois componentes conectados isolados. Portanto, você provavelmente desejaria usar a união find ou verificar com o BFS se os dois nós estiverem conectados.
AturSams
Ah sim, você está certo sobre isso, meu mal.
Jelle van Campen