Um mapa simples, quatro biomas e como distribuí-los

16

Aqui está a idéia básica: eu tenho um jogo de Rogue-ish, talvez Dwarf Fortress-ish, com um mundo superior gerado aleatoriamente e várias entradas de masmorras espalhadas por ele. Eu já tenho as masmorras basicamente cobertas, mas estou presa em um aspecto do mundo superior.

O mundo superior, considerado como um mapa 2D de telas, deve ter uma distribuição talvez semelhante a uma bolha de quatro temas ou biomas diferentes - pradarias, deserto, neve e pântano, cada um com sua própria quantidade total de telas. Digamos que o mapa seja 8x8, o que fornece 64 telas únicas. Metade delas poderia ser pradarias, um quarto de deserto e pântano e neve ganham um quarto cada:

maquete de um possível mapa-múndi com cidades e localização inicial, mas nenhuma entrada de masmorra

Parece que a redução da paleta tornou a neve da mesma cor do pântano. Originalmente, havia oito telas de neve no canto inferior e uma área de pântano com oito telas no meio. Desculpe por isso e ignore os marcadores de localização.

O melhor que consegui foram algumas formas serpenteantes, e muitas vezes com combinações sem sentido, como o deserto serpenteando na neve (ou vice-versa). Pela minha vida, não consigo descobrir como obtê-la de maneira agradável e desonesta, sem falar em fazer sentido (?) Climático. Então, como eu gero um mapa de bioma como na maquete?

Ok, por solicitação: o mundo realmente não é muito maior que esse exemplo, e o que eu preciso é apenas uma maneira de espalhar algumas bolhas que determinam aparências temáticas, com a limitação extra de que a neve não pode tocar no deserto. As telas não rolam e, se uma tela estiver definida como "deserto", não haverá grama em nenhum lugar.

Kawa
fonte
Você está disposto a usar bibliotecas de terceiros ou deseja codificar sua própria solução?
William Mariager 4/12
Eu preferiria codificar meus próprios.
Kawa 4/11
Os tamanhos do bioma são fixos?
kaoD
Você poderia editar a postagem com uma lista de pontos das regras exatas que deseja que a geração do mapa siga? Seria mais fácil para nós lidar com o problema, sabendo exatamente o que estamos buscando.
William Mariager
Editado, e os tamanhos do bioma, bem, eu fui com aqueles por exemplo. Para um mundo 16x16, o Desert ainda pode ser um quarto da área e assim por diante, mas isso é principalmente para garantir que certas áreas estejam lá.
Kawa

Respostas:

8

Existem muitas maneiras de esfolar esse gato, mas uma das mais interessantes é usar autômatos celulares . Comece com sua grade vazia e adicione algumas células iniciais de sementes em locais aleatórios. Estes devem ser de alguns tipos básicos de biomas não misturados. Diga: Grama, Deserto, Neve, Oceano.

Com base nas regras de crescimento de seu próprio projeto, que podem apresentar alguma aleatoriedade (não me importo que isso tecnicamente interrompa a ideia de CA, certo?), Elas aumentam cada etapa do mapa. Regras adicionais podem ser tais que, se você for oceano e estiver próximo a grama ou pântano, poderá se transformar em pântano. Se você estiver próximo da neve, poderá se tornar gelo; se estiver perto do deserto, poderá secar e se tornar deserto também.

O mesmo pode ser verdade para outras misturas e, em teoria, até sub-misturas como pântano congelado, tundra ou selva que brota de grandes extensões de florestas que cresceram em grandes extensões de pastagem.

As possibilidades são infinitas e também podem ser contínuas. Como essas regras são simples, você pode implementar ambientes que mudam com o tempo. Combinado com informações de altura e regras que levam isso em consideração, você pode cultivar lagos e rios, bloquear o crescimento de florestas sobre montanhas e outras coisas sofisticadas.

Esse mapa de altura pode ser o resultado de ruído permanente, quadrado de diamante ou até mesmo de outros modelos CA. De fato, você pode modificar esse mapa com o passar do tempo modelando placas tectônicas, elevando montanhas, afundando em trincheiras e até deixando rios baixarem a paisagem, criando cânions.

Esta toca de coelho se estende para sempre.

DampeS8N
fonte
Voto a favor da sugestão da AC. Isso combina bem com o comentário de Valmond.
Kawa
Você ficaria surpreso com o quão simples uma solução CA pode ser para esse problema. Regras simples e um mapa inicial aleatório podem produzir paisagens de aparência notavelmente detalhada e 'realistas'.
DampeS8N
Fui com o princípio da CA. Ainda não está certo, pois a única coisa que mantém o deserto e a neve separados são algumas regras absolutas de posição, mas funciona bem por enquanto.
Kawa
1
Uma solução opcional para o problema da neve / deserto é a existência de uma regra para criar um tipo diferente de bioma onde a neve encontra o deserto. Diga pântano. Então o pântano pode continuar crescendo normalmente. Você ainda pode ter fronteiras de neve / deserto, mas na realidade isso é algo natural. De fato, a maior parte do deserto da Terra está coberta de neve. - em resumo, a neve pode ter a regra de modo que, se algum vizinho estiver deserto, ele se transformará em pântano.
DampeS8N
11

Resposta curta, mas você realmente deve consultar este artigo: www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/ Explica um algoritmo sobre a geração da geração aleatória de terra seca e biomas com base em zonas de umidade designadas e regiões de altitude. Mas, no seu caso, basta definir seus próprios valores para a distribuição que você deseja.

(grande edição) Tornarei isso muito mais claro para quais conceitos de geração de mapas você precisa aplicar. Use um sistema de coordenadas com 1 unidade por tela, em valores de ponto flutuante. Gere um pequeno conjunto aleatório de pontos dentro dessas coordenadas, como se você estivesse fazendo um diagrama de Voronoi, mas na verdade não criaremos as formas aleatórias. Em vez disso, o diagrama será implícito e aproximado pelo mapa após a definição dos biomas.

Cada ponto é o centro de cada área do bioma. Defina suas próprias regras para associar um ponto a um bioma. Por exemplo, se você deseja um deserto ao leste e não muito ao sul ou ao norte, todos os pontos maiores que um certo valor de X e dentro de um certo intervalo de Y terão um deserto ao seu redor.

Associe cada tela a um desses pontos, o que é feito pegando o centro da tela nas coordenadas XY (por exemplo, 4.5, 8.5) e retornando o ponto mais próximo ao centro da tela.

Aqui está um desenho aproximado de um diagrama de forma na grade de telas. Não estamos realmente preocupados com as linhas que cercam as formas, mas elas estão lá para ilustrar como as telas começam a aproximar as regiões da forma.

Voronoi-grid

Repita para cada tela, dando a cada um seu próprio bioma.

ChrisC
fonte
Eu já vi isso antes, e é um pouco bazuca-em-um-mosquito para o meu gosto.
Kawa
Bem, tudo bem, isso é o mínimo. É muito bazuca-em-um-mosquito. O exemplo 8x8 não era apenas um exemplo - o mundo realmente não será grande o suficiente para justificar essa solução.
Kawa 4/11
Ok, eu vejo agora. Você realmente não precisa diferenciar os biomas para cada bloco do mapa. Além disso, o conceito proposto do artigo parece feito sob medida para o autor, mas algumas partes podem ser selecionadas. Estou editando minha resposta para torná-la mais clara.
ChrisC
Uma solução ainda muito complexa. Não há altura ou umidade para usar aqui. Tudo o que eu preciso, tudo o que eu queria pedir era uma maneira de "espalhar" gotas de deserto, pântano e neve até as quantidades necessárias, seguindo algumas regras extras como "a neve não pode ficar muito perto do deserto" .
Kawa
@Kawa: Parece que você está pronto para cavar e escrever sua própria solução! Pelo que posso dizer, você tem tudo visualizado em sua mente, apenas FAÇA! :) Lembre-se de que ele não precisa ser o melhor gerador de mapas do mundo, contanto que pareça. ;)
Zolomon
1

Resposta 1:

crescer neve e deserto, quando isso for feito, procure as interseções (proibidas) e cresça (mais ou menos grande) pântano lá.

Rince e repita.

Resposta 2:

Para a parte 'blob', mudei meu comentário (conforme solicitado) para a postagem:

Se você crescer por iteração, ie. defina 1 ponto de deserto e depois cresça aleatoriamente em torno de qualquer ponto de deserto (cada vez que pegue aleatoriamente um dos pontos de deserto existentes e adicione 1 ponto em um de seus lados (onde ainda não há nada)), então você deverá obter um efeito desagradável ( sem longas filas, por exemplo).

Você também pode adicionar uma regra para não criar um ladrilho do deserto se houver neve em qualquer ladrilho próximo.

Valmond
fonte
Isso não ajuda exatamente com o aspecto embaraçoso do problema.
Kawa
2
se você crescer por iteração, ie. defina 1 ponto de deserto e depois cresça aleatoriamente em torno de qualquer ponto de deserto (cada vez que pegue aleatoriamente um dos pontos de deserto existentes e adicione 1 ponto em um de seus lados (onde ainda não há nada)), então você deverá obter um efeito desagradável ( sem longas filas, por exemplo).
Valmond
você também pode adicionar uma regra para não criar um bloco do deserto se houver neve em algum bloco próximo a ele.
Valle5
Valmond, coloque isso em uma resposta.
Kawa