Je recherche une fonction pour générer une carte aléatoire basée sur des tuiles à mesure que les limites visuelles de la carte changent (en parcourant la carte). Je veux que la carte soit infiniment grande et ait une structure semblable à un labyrinthe.
Cependant, si le monde est infini, revenir à l'endroit où un joueur était déjà auparavant pose un problème. Le jeu doit se rappeler à quoi ressemblait tout à l'arrière.
Donc, je pensais - "Comment Minecraft résout-il ce problème?" et je me suis dit qu'ils devaient utiliser une sorte de fonction de nombre aléatoire avec une graine, qui peut à la fois avancer et reculer, et de cette façon, recréer les vieilles tuiles exactement comme elles étaient, mais dans de nouveaux cas.
Que pensez-vous de ceci?
la source
Réponses:
Ce que vous avez remarqué, c'est la différence entre un générateur de nombres aléatoires et une fonction de bruit . Un générateur de nombres aléatoires crache un numéro différent chaque fois que vous l'appelez. Une fonction de bruit prend quelques arguments - disons une carte x et y - et crache des nombres avec des propriétés statistiques de type aléatoire , mais à chaque fois la même valeur pour les mêmes arguments , c'est-à-dire que c'est une fonction mathématique appropriée.
Les deux sont étroitement liés. Une fonction de bruit peut simuler un générateur de nombres aléatoires, en faisant passer à une valeur différente à chaque fois - par exemple
noise(1)
,noise(2)
et ainsi de suite. Et un générateur de nombres aléatoires, jeté dans une table géante, peut agir comme une fonction de bruit. Dans les deux cas, vous utilisez le mauvais outil pour le travail.Minecraft en particulier les utilisations du bruit Perlin , un type de bruit qui ne coûte pas cher à calculer, et a une propriété souhaitable d'être continue en autant de dimensions que vous avez besoin - si vous représenter graphiquement
f(x)
àf(x + 1)
, il n'y aura pas de sauts brusques. Cela le rend très utile pour de nombreuses choses comme la modulation de texture, les nuages et les gaz volumétriques et la génération de terrain.Si vous cherchez une implémentation pour commencer à jouer, le générateur de bruit Perlin amélioré de Ken Perlin est l'une des implémentations les plus simples.
la source
La façon dont Minecraft contrôle sa génération est de créer une graine de niveau qui est utilisée pour ensemencer toute la génération de nombres aléatoires pour le jeu. Si un morceau n'existe pas sur le disque quand il est demandé, il sera généré en utilisant la fonction de génération de Notch basée sur la graine du niveau; il est ensuite enregistré sur le disque pour plus tard.
Il semble que vous cherchiez à obtenir un comportement similaire, c'est donc une façon sûre de procéder.
la source
Comme Joe l'a souligné, vous recherchez une fonction de hachage. En règle générale, les fonctions aléatoires ne sont que des fonctions de hachage prédéfinies avec le dernier nombre renvoyé. Donc, si
Random()
renvoyéHash(seed)=1234
, un deuxième appelRandom()
reviendraitHash(1234)
, etc.Si vous recherchez une fonction de hachage simple pour les nombres pseudo-aléatoires, consultez MurMurHash . Je l'ai implémenté en C # et je peux le publier quelque part si cela vous intéresse. Des informations plus détaillées sur Perlin Noise, qui utilise une telle fonction de hachage, peuvent être trouvées ici , et une implémentation de celui-ci en C # est ici .
Toutes ces informations proviennent d'une question que j'ai posée il y a un an ici sur Stack Overflow. Ce que vous examinez s'appelle la génération de contenu procédural, donc si vous avez besoin de plus d'informations, faites une recherche pour cela. Générateur de terrain heureux!
la source