Wie würde ich einen zufälligen Startwert verwenden, um ein Spiellevel zu generieren? Das gleiche Saatgut sollte immer genau das gleiche Niveau erzeugen.
In diesem Beispiel wäre es ein Worms- Level. Jedes Level hätte also ein Thema (Grasland, Schnee usw.), Grundgelände, verschiedene Objekte wie Bäume.
Also, wo würde ich anfangen, diese Art von Level-Generator zu erstellen? Was wäre involviert? Welche Konzepte verwendet es?
Bonuspunkte für alle guten Links ( Bonusbonuspunkte für alles, was damit zu tun hat, wie es in Würmern oder ähnlichem gemacht wurde).
Vielen Dank.
algorithm
procedural-generation
random
Adam Harte
quelle
quelle
srand(int)
. Nachfolgende Aufrufe vonrand()
geben sequentielle Werte zurück, die immer in derselben Reihenfolge berechnet werden, basierend auf diesem Startwert. Sie setzen den Startwert einmal in Ihrem Programm. Wenn der Algorithmus nur von den Ergebnissen abhängtrand
, erhalten Sie jedes Mal das gleiche Ergebnis.Antworten:
Der Schlüssel dazu ist die Verwendung Ihres eigenen benutzerdefinierten Pseudozufallszahlengenerators, den Sie mit dem bekannten Startwert initialisieren. Der "Mersenne Twister" ist ein beliebter Algorithmus, hier ist der Wikipedia-Eintrag und eine Beispielquelle . Dieser und andere PRNG-Algorithmen erzeugen tatsächlich eine (sehr lange) feste Folge von Zahlen, für die der Startwert als Ausgangspunkt dient.
Solange Sie bei der Erstellung Ihrer Welt jedes Mal genau dasselbe Verfahren anwenden, repräsentiert jeder Wert eine einzigartige reproduzierbare Welt.
quelle
Hier ist ein in ActionScript implementierter PRNG (Pseudozufallszahlengenerator) (verfügbar in AS2 oder AS3). Es ist leicht und schnell, ideal für Spiele: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/
Die obige Implementierung basiert auf dem Park-Miller-Carta PRNG . Diese Seite gibt Ihnen einen Einblick in die Mathematik, die dahinter steckt.
Um einen wurmartigen Level zu erstellen, würde ich wahrscheinlich eine Perlin-Noise- Funktion verwenden. Wenn Sie ein Perlin-Rauschbild mit einer Höhe von 1px und einer Breite Ihrer Spielwelt erzeugen, erhalten Sie im Grunde eine einsatzbereite Höhenkarte. Perlin Noise-Funktionen erzeugen auch immer die gleiche Map mit dem gleichen Seed.
Sie können dann den oben erwähnten PRNG verwenden, um zu bestimmen, wo zufällige Objekte auf der Karte platziert werden sollen oder wo ein Loch im Boden erstellt werden soll. Bei Löchern könnte man auch wieder Perlin-Rauschen ausnutzen. Erstellen Sie einfach ein Perlin-Rausch-Bild mit der Größe Ihrer Karte (x, y) und erstellen Sie dann ein Loch in Ihrer Karte, in dem der Pixelwert unter einem bestimmten Schwellenwert liegt (z. B. 0,2).
quelle
Theoretisch, wenn Sie einen Pseudozufallszahlengenerator (wie Perlin-Noise oder Marsenne Twister) verwenden können, um Karten über freizugeben
Startnummern Dann können Sie auch benutzerdefinierte Maps erstellen und diese auf Startnummern reduzieren, um das Problem zu lösen, dass keine Startnummern erstellt werden können
Benutzerdefinierte Karten bei Verwendung von PRNGs. Dies beruht jedoch auf einigen Vermutungen. Das sind nämlich Pseudozufallszahlengeneratoren
ein reversibler Prozess und dass JEDE Daten, die rückwärts in ein PRNG eingegeben werden, einen gültigen Samen erzeugen, geschweige denn einen Samen überhaupt!
quelle