10. Cavernas com autômato celular

Chuvisco que vira caverna em cinco passos.

Ruído dá colinas. Caverna é outra forma: salas irregulares ligadas por túneis, com paredes grossas. O jeito clássico de gerar isso é um autômato celular: comece com uma grade cheia de parede e chão sorteados, e aplique repetidas vezes uma regra simples de vizinhança. O chuvisco se organiza em manchas, as manchas viram salas.

Os cinco passos

1. Preencher. Cada célula vira parede com probabilidade p (45% costuma funcionar), usando um gerador com semente. A borda é sempre parede.
2. Suavizar. Para cada célula, conte quantas das 8 vizinhas são parede. Mais de 4: vira parede. Menos de 4: vira chão. Exatamente 4: fica como está. Repita 4 ou 5 vezes. Cada passada apaga os pontinhos isolados e engrossa as manchas.
3. Achar as salas. Flood fill: a partir de uma célula de chão, visite todas as vizinhas de chão, e marque tudo com o mesmo número de região. Repita para cada célula ainda sem número.
4. Limpar. Regiões de chão com menos de N células viram parede (buraquinhos). Regiões de parede pequenas dentro de uma sala viram chão (pilares soltos), se quiser.
5. Conectar. Para cada sala, ache a sala mais próxima e cave um túnel entre as duas células de borda mais próximas. Repita até tudo ficar numa região só. Sem isso o jogador pode nascer numa sala sem saída.
// passo 2, uma passada
para cada célula (x, y) que não é borda:
  n = paredes_vizinhas(x, y)         // conta as 8 ao redor (vizinhança de Moore)
  se n > 4:  novo[x, y] = PAREDE
  senão se n < 4:  novo[x, y] = CHÃO
  senão:  novo[x, y] = grade[x, y]
grade = novo                          // trocar só no fim: a passada lê a grade velha e escreve na nova
NomeO que é
p (preenchimento)chance inicial de parede. Abaixo de 40% vira um salão aberto; acima de 50% vira quase tudo parede.
paredes_vizinhasconta as 8 células ao redor. Fora da grade conta como parede: é isso que fecha a borda.
4 (limiar)a regra "maioria vira parede". Mudar para 5 dá cavernas mais abertas.
iterações4 ou 5. Mais que isso não muda quase nada.
regiãonúmero que o flood fill dá a cada bolsão de chão. Salas são regiões de chão.
N (tamanho mínimo)regiões menores que isso são apagadas. 30 a 50 células.
novoa grade seguinte. Escrever na mesma grade que se está lendo faz a regra "ver" células já alteradas e dá viés para um lado.

Da grade para o jogo

Alternativa: ruído 3D com limiar. Em vez de autômato, calcule perlin3(x, y, z) para cada bloco e diga: acima do limiar é pedra, abaixo é ar. Dá cavernas contínuas e orgânicas (as cavernas "queijo" do Minecraft), sem passos de flood fill, e já em 3D. A desvantagem é menos controle sobre salas e conexão. Para a atividade as duas são aceitas; o autômato é o padrão porque é mais fácil de ver funcionando.