Problema a resolver: Gere um mapa aleatório de masmorra 2D para um jogo baseado em peças em que todas as salas estão conectadas.
Estou procurando soluções melhores do que as que tenho atualmente.
Minha solução atual é que eu corro dois algoritmos. O primeiro gera a masmorra com seus quartos. O segundo garante que todos os quartos estejam conectados. Estou curioso para saber que outras soluções podem existir. Mais rápido e / ou mais fácil etc. A velocidade não é realmente uma preocupação, mas se a velocidade puder ser obtida sem nenhum custo real, isso é uma coisa boa. Mais importante é que eu, e outros que lêmos, aprendamos maneiras diferentes de abordar e resolver o problema.
Abaixo estão minha implementação atual. Atualmente, os quartos não têm saídas ou saídas em 2, 3 ou 4 direções.
Gerando as salas de masmorra
Configuração: defina a sala atual para a sala superior esquerda.
- Obtenha um tipo de quarto válido para o quarto (onde o tipo de quarto válido é um tipo sem saídas para fora da masmorra e com saídas que correspondem às saídas da sala acima e da sala à esquerda. Só é necessário verificar acima e esquerda devido ao passo 2 abaixo).
- Abaixe a sala e avance a coordenada x uma etapa. Se a coordenada x exceder a largura da masmorra, defina a coordenada x como 0 e avance a coordenada y um passo. Se a coordenada y exceder a altura da masmorra, estamos prontos.
- Repita do item 1.
Em seguida, verifico se todas as salas estão conectadas. Se elas não estiverem todas conectadas, corro um segundo algoritmo que, de uma maneira não-sexy, mas definitivamente boa o suficiente em termos de layout da masmorra, percorre as salas e as altera para que tudo acabe. estar conectado.
Verificando se todos os quartos estão conectados
Instalação: Crie um mapa 2D de números inteiros representando caminhos e inicialize as entradas para um valor "não processado" (ainda não percorrido), -1. Defina um número inteiro do índice do caminho inicial que monitora o caminho atual como 1. Defina a sala atual para a sala superior esquerda, adicionando-a a uma pilha de salas para verificar.
- Se a pilha contiver salas a serem verificadas, coloque-a no índice de caminho da sala com o índice de caminho atual. Se a pilha não contiver nenhuma sala, aumente o índice do caminho e tente obter uma sala avançando coluna por coluna, linha por linha, até obtermos uma sala que ainda não foi processada. Se não for possível encontrar espaço, estamos prontos.
- Verifique se a sala tem uma saída para a esquerda. Se houver, adicione o espaço esquerdo à pilha, se ainda não estiver lá.
- Repita a etapa 2 para as direções inferior, direita e superior (pois estamos usando uma pilha que significa que as salas são atravessadas no sentido horário, começando pela direção superior).
- Repita da etapa 1.
- Se a contagem dos índices de caminho for maior que um, haverá salas desconectadas.
Se houver salas desconectadas, agrupo as salas pelo índice de caminho, obtenha o índice do caminho maior e conecte todas as outras salas a essas salas. Este é um trabalho em andamento, mas meu plano (atual, "brutal") é percorrer cada sala de um grupo de salas (exceto a primeira) para verificar se há um caminho horizontal ou vertical para o grupo de salas biggeset e Nesse caso, crie um caminho horizontal / vertical injetando / atualizando os quartos entre eles. Enxague e repita. Feio, sim, mas é algo que não será perceptível em termos de padrão visual, por isso funciona nesse sentido.