Wie kann man aus einem Samen ein zufälliges Level generieren? [geschlossen]

46

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.

Adam Harte
quelle
Die Zufallsgenerierung wird auch als Prozedurale Inhaltsgenerierung (PCG) bezeichnet. Und hier ist ein Wiki, das genau das behandelt. pcg.wikidot.com Sollte Ihnen einige Ideen geben! : o)
Kaj
1
Chris Crawford hat einen Artikel, den Sie vielleicht interessieren. Es wurde in den frühen 90ern geschrieben, ist aber immer noch relevant. Wie man eine Welt
Anthony
Wenn Sie irgendeine Form oder ein Algorithmus verwenden, die den gleichen Zufallszahlengenerator (mit einer Ausnahme , die irgendwie in einem invarianten wie Systemzeit schleicht) verwendet, das gleiche Saatgut wird das gleiche Niveau erzeugen, gibt es wirklich keinen Weg drum herum.
Kaj
1
Ja, aber ich denke, der Trick besteht darin, zunächst einen Startwert zu verwenden, aus dem das Level generiert wird. Ich habe vorher Zufallsgeneratoren gebaut, aber sie haben keinen einzigen Startwert verwendet. Oft wählte ich zufällige Punkte und wählte dann für jeden Punkt ein zufälliges Asset aus, das dort platziert werden sollte. Auf diese Weise gibt es keinen echten Startwert, der immer das gleiche Niveau erzeugt, da es eine Reihe von Dingen gibt, die dort eigene Zufallszahlen erzeugen.
Adam Harte
10
Sind Sie sicher, dass Sie wissen, was "Saatgut" bedeutet? Dies ist der "Anfangsvektor", der über zB übergeben wird srand(int). Nachfolgende Aufrufe von rand()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ängt rand, erhalten Sie jedes Mal das gleiche Ergebnis.
Heath Hunnicutt

Antworten:

7

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.

Jason Morales
quelle
4

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).

Blödmann
quelle
Ich würde Perlin-Rauschen verwenden, aber etwas anders. Verwenden Sie es, um eine 3D-Höhenkarte zu erstellen, die Karte an einem Hang zu platzieren und alle Pixel zu entfernen, die unter Ihrem Schwellenwert liegen. (wenn pixel.height - (pixel.distanceToBottom * slopeFactor) <Schwellenwert) pixel = transparent)
Niels
2

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