Ich suche nach einer Funktion zum Erzeugen einer zufälligen kachelbasierten Karte, wenn sich die visuellen Grenzen der Karte ändern (indem ich durch die Karte gehe). Ich möchte, dass die Karte unendlich groß ist und eine labyrinthartige Struktur hat.
Wenn die Welt jedoch unendlich ist, wirft es ein Problem auf, dorthin zurückzukehren, wo ein Spieler schon einmal war. Das Spiel muss sich daran erinnern, wie alles dort hinten tatsächlich aussah.
Also dachte ich: "Wie löst Minecraft dieses Problem?" und ich dachte mir, dass sie eine Art Zufallszahlenfunktion mit einem Startwert verwenden müssen, die sowohl vorwärts als auch rückwärts gehen kann und auf diese Weise alte Kacheln genauso wie sie waren, aber in neuen Fällen neu erzeugt.
Was denkst du darüber?
quelle
Antworten:
Was Sie bemerkt haben, ist der Unterschied zwischen einem Zufallszahlengenerator und einer Rauschfunktion . Ein Zufallsgenerator spuckt bei jedem Anruf eine andere Zahl aus. Eine Rauschfunktion verwendet einige Argumente - beispielsweise eine Map x und y - und gibt Zahlen mit zufallsähnlichen statistischen Eigenschaften aus , jedoch jedes Mal denselben Wert für dieselben Argumente , dh es handelt sich um eine geeignete mathematische Funktion.
Die beiden sind sehr eng miteinander verbunden. Eine Rauschfunktion kann einen Zufallszahlengenerator, simulieren , indem jedesmal in einem anderen Wert Passing - zB
noise(1)
,noise(2)
und so weiter. Und ein Zufallsgenerator, der in einen riesigen Tisch geworfen wird, kann als Rauschfunktion fungieren. In beiden Fällen verwenden Sie jedoch das falsche Werkzeug für den Job.Minecraft verwendet insbesondere Perlin-Rauschen , eine Art von Rauschen, das kostengünstig zu berechnen ist und die wünschenswerte Eigenschaft hat, in so vielen Dimensionen kontinuierlich zu sein, wie Sie benötigen. Wenn Sie grafisch darstellen
f(x)
,f(x + 1)
treten keine plötzlichen Sprünge auf. Dies macht es sehr nützlich für viele Dinge wie Texturmodulation, volumetrische Wolken und Gase und Geländegenerierung.Wenn Sie nach einer Implementierung suchen, mit der Sie gleich loslegen können, ist Ken Perlins verbesserter Perlin-Rauschgenerator eine der einfachsten Implementierungen.
quelle
Die Art und Weise, wie Minecraft seine Erzeugung steuert, besteht darin, einen Level-Startwert zu erstellen, mit dem die gesamte Zufallszahlenerzeugung für das Spiel festgelegt wird. Wenn ein Block auf der Festplatte nicht vorhanden ist, wenn er angefordert wird, wird er mithilfe der Notch- Generierungsfunktion basierend auf dem Startwert des Levels generiert . Es wird dann für später auf der Festplatte gespeichert .
Es hört sich so an, als ob Sie ein ähnliches Verhalten anstreben. Das ist also ein sicherer Weg.
quelle
Joe hat darauf hingewiesen, dass Sie nach einer Hash-Funktion suchen. Im Allgemeinen sind Zufallsfunktionen nur Hash-Funktionen, die mit der zuletzt zurückgegebenen Zahl erstellt wurden. Also , wenn
Random()
zurückgegebenHash(seed)=1234
, ein zweiter AnrufRandom()
zurückkehren würdeHash(1234)
, um so weiter.Wenn Sie nach einer einfachen Hash-Funktion für Pseudozufallszahlen suchen, schauen Sie sich MurMurHash an . Ich habe es in C # implementiert und kann es bei Interesse irgendwo posten. Ausführlichere Informationen zu Perlin Noise, das eine solche Hash-Funktion verwendet, finden Sie hier . Eine Implementierung in C # finden Sie hier .
All diese Informationen stammen aus einer Frage, die ich vor einem Jahr hier bei Stack Overflow gestellt habe. Was Sie sich ansehen, wird als prozedurale Inhaltsgenerierung bezeichnet. Wenn Sie also mehr Informationen benötigen, suchen Sie danach. Viel Spaß beim Erstellen von Terrains!
quelle