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
| Nome | O que é |
|---|---|
p (preenchimento) | chance inicial de parede. Abaixo de 40% vira um salão aberto; acima de 50% vira quase tudo parede. |
paredes_vizinhas | conta 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ções | 4 ou 5. Mais que isso não muda quase nada. |
região | nú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. |
novo | a 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
- 2D top-down ou plataforma: cada célula é um tile. Pronto.
- 3D: cada célula de parede vira um cubo, ou, mais bonito, a fronteira parede/chão vira uma malha por marching squares (Sebastian Lague tem a série completa). Extrudar essa malha dá as paredes; o chão e o teto são planos.
- Encaixe no terreno: a caverna fica abaixo da superfície, com uma entrada onde a altura do terreno cai numa faixa escolhida (por exemplo, rocha). A semente da caverna deriva da semente do mundo e da coordenada do chunk, para ser determinística como o resto.
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.