Como gerar nível aleatório a partir de uma semente? [fechadas]

46

Como eu usaria uma semente aleatória para gerar um nível de jogo? A mesma semente deve sempre gerar exatamente o mesmo nível.

Para este exemplo, seria um nível de estilo Worms . Portanto, cada nível teria um tema (campos, neve, etc.), terreno base, objetos diferentes, como árvores.

Então, onde eu começaria a criar esse tipo de gerador de nível? O que estaria envolvido? Quais conceitos ele usa?

Os pontos de bónus para qualquer qualquer boas ligações ( bônus de pontos de bônus para qualquer coisa relacionada à forma como ele foi feito em vermes ou similar).

Obrigado.

Adam Harte
fonte
A geração de nível aleatório também é conhecida como Geração de Conteúdo Procedural (PCG). E aqui está um wiki que trata exatamente disso. pcg.wikidot.com deve dar-lhe algumas ideias! : o)
Kaj
1
Chris Crawford tem um artigo que você pode achar interessante. Foi escrito no início dos anos 90, mas ainda é relevante. Como construir um mundo
Anthony
Se você usar qualquer forma ou algoritmo que usa o mesmo gerador de números aleatórios (com exceção de um que de alguma forma foge em uma invariante como hora do sistema), a mesma semente irá gerar o mesmo nível, não há realmente nenhuma maneira de contornar isso.
Kaj
1
Sim, mas acho que o truque é usar uma semente em primeiro lugar para gerar o nível. Eu criei geradores de nível aleatório antes, mas eles não usavam uma única semente. Muitas vezes eu escolhia pontos aleatórios, então, para cada ponto, escolhia um ativo aleatório para colocar lá. Fazendo dessa maneira, não existe UMA semente verdadeira que sempre gerará o mesmo nível, pois há várias coisas gerando seus próprios números aleatórios.
Adam Harte
10
Você tem certeza de que sabe o que significa "semente"? Este é o "vetor inicial" transmitido via, por exemplo srand(int),. As chamadas subseqüentes a rand()retornarão valores seqüenciais que são sempre calculados na mesma ordem, com base nessa semente. Você define a semente uma vez no seu programa. Depois disso, se o algoritmo depender apenas dos resultados rand, você obterá o mesmo resultado sempre.
Heath Hunnicutt

Respostas:

7

A chave para isso é usar seu próprio gerador de números pseudo-aleatórios personalizados que você inicializa com o valor inicial conhecido. O "Mersenne Twister" é um algoritmo popular, aqui está a entrada da Wikipedia e uma fonte de amostra . Esse e outros algoritmos PRNG realmente produzem uma série fixa (muito longa) de números para a qual o valor inicial serve como ponto de partida.

Desde que você siga exatamente o mesmo procedimento para gerar seu mundo todas as vezes, cada valor representará um mundo reproduzível único.

Jason Morales
fonte
4

Aqui está um PRNG (gerador de número pseudo-aleatório) implementado no ActionScript (disponível em AS2 ou AS3). É leve e rápido, ideal para jogos: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

A implementação acima é baseada no Park-Miller-Carta PRNG . Este site fornecerá mais informações sobre a matemática por trás de tudo isso.

Para criar um nível semelhante a worms, eu provavelmente usaria uma função Perlin-Noise . Se você gerar uma imagem de ruído permanente com a altura de 1px e a largura do seu mundo de jogo, basicamente obterá um mapa de altura, pronto para uso. As funções de ruído Perlin também sempre geram o mesmo mapa com a mesma semente.

Você pode usar o PRNG mencionado acima para determinar onde colocar objetos aleatórios no mapa ou onde criar um buraco no chão. Para furos, você também pode aproveitar o ruído permanente novamente. Basta criar uma imagem de ruído permanente com o tamanho do seu mapa (x, y) e depois criar um buraco no mapa onde o valor do pixel esteja abaixo de um determinado limite (por exemplo, 0,2).

bummzack
fonte
Eu usaria ruído perlin, mas um pouco diferente, use-o para criar um mapa de altura em 3D, colocar o mapa em uma inclinação e remover todos os pixels abaixo do seu limite. (Se pixel.height - (pixel.distanceToBottom * slopeFactor) <limiar) de pixel = transparente)
Niels
2

Teoricamente, se você pode usar um gerador de números pseudo-aleatórios (como Perlin-Noise ou Marsenne Twister) para compartilhar mapas via

números de sementes, você também pode criar mapas personalizados e reduzi-los a sementes, resolvendo o problema de não conseguir criar

mapas personalizados ao usar PRNGs. No entanto, isso se baseia em algumas suposições. Ou seja, que geradores de números pseudo-aleatórios são

um processo reversível e que QUALQUER dado alimentado de volta para um PRNG produzirá uma semente válida, sem falar em uma semente!


fonte