Estou procurando uma função para gerar um mapa aleatório baseado em blocos, à medida que os limites visuais do mapa mudam (percorrendo o mapa). Quero que o mapa seja infinitamente grande e tenha uma estrutura semelhante a um labirinto.
No entanto, se o mundo é infinito, voltar para onde um jogador já esteve antes levanta um problema. O jogo deve se lembrar de como tudo era lá atrás.
Então, eu estava pensando - "Como o Minecraft resolve esse problema?" e pensei comigo mesmo que eles deviam estar usando algum tipo de função de número aleatório com uma semente, que pode ir adiante, mas também para trás, e, dessa maneira, re-gerar azulejos antigos exatamente como estavam, mas em novas instâncias.
Quais são seus pensamentos sobre isso?
tiles
random
minecraft-modding
tilemap
Mathias Lykkegaard Lorenzen
fonte
fonte
Respostas:
O que você notou é a diferença entre um gerador de números aleatórios e uma função de ruído . Um gerador de números aleatórios cospe um número diferente cada vez que você o chama. Uma função de ruído usa alguns argumentos - digamos, um mapa x e y - e cospe números com propriedades estatísticas aleatórias , mas o mesmo valor para os mesmos argumentos todas as vezes , ou seja, é uma função matemática adequada.
Os dois estão muito relacionados. A função de ruído pode simular um gerador de números aleatórios, passando um valor diferente de cada vez - por exemplo
noise(1)
,noise(2)
e assim por diante. E um gerador de números aleatórios, jogado em uma mesa gigante, pode atuar como uma função de ruído. Nos dois casos, porém, você está usando a ferramenta errada para o trabalho.Minecraft em particular usos Perlin ruído , um tipo de ruído que é barato para computação, e tem uma propriedade desejável de ser contínua em tantas dimensões como você precisa - se você gráfico
f(x)
paraf(x + 1)
, não haverá nenhuma saltos repentinos. Isso o torna muito útil para muitas coisas, como modulação de textura, nuvens e gases volumétricos e geração de terreno.Se você está procurando uma implementação para começar a jogar, o gerador de ruído Perlin aprimorado de Ken Perlin é uma das implementações mais simples.
fonte
O modo como o Minecraft controla sua geração é criando uma semente de nível que é usada para propagar toda a geração de números aleatórios para o jogo. Se um pedaço não existir no disco quando for solicitado, ele será gerado usando a função de geração do Notch com base na semente do nível; é então salvo em disco para mais tarde.
Parece que você deseja obter um comportamento semelhante, então esse é um caminho seguro.
fonte
Como Joe apontou, você está procurando uma função de hash. Geralmente, funções aleatórias são apenas funções de hash semeadas com o último número retornado. Portanto, se
Random()
retornadoHash(seed)=1234
, uma segunda chamadaRandom()
retornaráHash(1234)
, etc.Se você está procurando uma função simples de hash para números pseudo-aleatórios, confira MurMurHash . Eu o implementei em C # e posso publicá-lo em algum lugar, se você estiver interessado. Informações mais detalhadas do Perlin Noise, que usa essa função de hash, podem ser encontradas aqui e uma implementação em C # está aqui .
Toda essa informação veio de uma pergunta que fiz há um ano aqui no Stack Overflow. O que você está procurando é chamado geração de conteúdo processual; portanto, se precisar de mais informações, faça uma pesquisa. Feliz geração de terreno!
fonte