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.
algorithm
procedural-generation
random
Adam Harte
fonte
fonte
srand(int)
,. As chamadas subseqüentes arand()
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 resultadosrand
, você obterá o mesmo resultado sempre.Respostas:
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.
fonte
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).
fonte
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