Consegui obter níveis razoavelmente bonitos usando o seguinte algoritmo, com base em uma grade quadrada:
Primeiro, crie um conjunto de salas. Parâmetros aleatórios definirão o tamanho das salas e seus números. Um algoritmo adaptável pode até definir algumas zonas feitas de grandes corredores e outras de salas muito pequenas.
Então, você precisa garantir que todas as salas estejam conectadas umas às outras. Para isso, execute um pathfinder para cavar corredores (digamos, A *) entre cada par de salas, atribuindo um peso escolhido aleatoriamente aos espaços existentes (salas ou outros corredores) em comparação com o espaço ainda não esculpido (nas paredes). Se a diferença de peso for pequena, cavar novos corredores será razoavelmente barato, e o algoritmo criará muitos corredores entre as salas, com muitas possibilidades de ir de um lugar para outro. Se a diferença de peso for alta, o algoritmo preferirá passar por salas e corredores existentes, tornando os caminhos mais tortuosos e com menos opções para chegar a um determinado destino.
Isso permite que você, a partir de um pequeno número de parâmetros, crie níveis de aparência muito diferentes, de salas esparsas e enormes com pequenos corredores que os ligam a um labirinto de câmaras estreitamente interconectadas.
Aqui está um exemplo de um nível gerado.
Com base nesse algoritmo, você pode adicionar decoração de parede que depende da zona, diminuir ou aumentar os corredores, criar salas especiais e assim por diante.