In diesem Tutorial werde ich über zwei Begriffe sprechen, mit denen ich prozedurale Generatoren beschreibe: einen
generativen Raum und einen
Möglichkeitsraum . Wir werden diese beiden Begriffe definieren und dann interaktive Beispiele betrachten, um den Unterschied zwischen ihnen zu verstehen. Diese Begriffe sind wirklich nützlich, um einen prozeduralen Generator zu beschreiben und um den Unterschied zwischen zwei Generatoren zu verstehen. Fangen wir an!
Stellen Sie sich ein riesiges Buch vor, das einen Screenshot jeder einzelnen Minecraft-Welt enthält. Jeder Screenshot ist mit einem
zufälligen Startwert markiert, einer eindeutigen Nummer, die Sie in Minecraft eingeben und diese Welt generieren können. Die erste Seite zeigt die Welt, die aus Seed = 0 generiert wurde, die nächste Seite zeigt die Welt aus Seed = 1 und so weiter. Im Allgemeinen enthält der Minecraft-Weltgenerator 2
64 zufällige Generierungswerte, und dies ist eine riesige Zahl: Das Spiel kann 18 446 744 073 709 551 616 Welten generieren. Jedes Mal, wenn Sie auf "Neue Welt" klicken, wird eine Welt basierend auf einem dieser Samen erstellt. Die Zahl 2
64 ist die Größe
des Minecraft-
Generationsraums , viel von allem, was das Spiel erzeugen kann.
Stellen Sie sich nun vor, dass die Minecraft-Welt nur aus gewöhnlichem Gras besteht, das sich endlos in alle Richtungen ausbreitet. Darunter gibt es keine Höhlen, keinen Stein, keine Bäume und Hügel, keine Tiere. Nur eine Schicht Grasfliesen. Eine solche Welt
ist nicht nur sehr langweilig, sondern wird in Minecraft niemals erzeugt (es sei denn, Modding wird verwendet). Wir können es uns vorstellen, wir können es beschreiben, sogar Minecraft öffnen und es manuell erstellen - aber Minecraft kann es nicht generieren.
Woher wissen wir das? Sie können dies auf viele verschiedene Arten beweisen, aber der einfachste Weg, sich an Minecraft-Biome zu erinnern, ist in Gebieten wie Wüste oder Dschungel, die auf der ganzen Welt verstreut sind. In unserem Beispiel mit der Graswelt sind sie nicht, daher wissen wir, dass es nicht mit einem Standardgenerator erstellt werden kann.
Die Graswelt befindet sich im sogenannten Minecraft Worlds
Opportunity Space - der Menge aller möglichen Minecraft-Welten, die wir uns vorstellen, vorstellen oder beschreiben können. Die Graswelt befindet sich jedoch
nicht im
Raum der Minecraft-
Generation , da sie nicht vom prozeduralen Generator des Spiels erstellt werden kann. Wir können uns die Minecraft-Welt mit einer exakten maßstabsgetreuen Nachbildung von Persepolis oder die Welt in Form Ihrer Steinskulptur vorstellen, die diesen Artikel sitzt und liest - dies sind alles
mögliche Minecraft-Welten, aber sie werden vom Spiel nicht erzeugt.
Das oben gezeigte Diagramm gibt uns eine Vorstellung davon, wie alles aussieht. Alles, was sich im Raum der Minecraft-Generation befindet, muss sich auch in seinem Raum der Möglichkeiten befinden, denn wenn Minecraft etwas erzeugen kann, sollte es möglich sein, es in Minecraft zu erstellen! Aber nicht der gesamte Raum der Möglichkeiten befindet sich im Raum der Generation, einschließlich unseres Beispiels mit einer Welt aus Gras. Die Skala wird in diesem Schema jedoch nicht eingehalten. Tatsächlich ist der Minecraft-Raum der Möglichkeiten viel,
viel größer als sein Generationsraum.
Um zu verstehen, wie groß es ist, berechnen wir die Größe einer einzelnen Minecraft-Welt. Volumen ist die Breite multipliziert mit der Höhe, multipliziert mit der Tiefe. Standardmäßig sind Minecraft-Welten 256 Kacheln hoch und teilen sich vom Startpunkt aus in ungefähr 30.000.000 Kacheln in alle Richtungen auf, dh das ungefähre Volumen der Welt beträgt:
256 x 60 000 000 x 60 000 000 = 921 600 000 000 000 000
Jeder dieser Blöcke kann ein beliebiges Element sein: Stein, Gras, Wasser, Luft. Für unsere Einschätzung werden wir großzügig sein und nur "Blöcke der Welt" verwenden, die laut Minecraft-Wiki
64 Typen sind . Dies bedeutet, dass jeder Block in der Minecraft-Welt 64 mögliche Zustände hat. Die Formel zur Berechnung der Anzahl möglicher Welten entspricht der Anzahl der Statusoptionen für jeden Block, die auf die Potenz der Anzahl der Blöcke angehoben werden:
64 921 600 000 000 000 000 Minecraft
Diese Zahl ist so groß, dass ich im Internet keinen Taschenrechner finden konnte, der sie berechnen könnte.
Um noch tiefer in die Räume der Erzeugung und der Möglichkeiten einzudringen, brauchen wir ein Beispiel, das wir besser in unseren Kopf setzen können. Daher werden wir uns im Rest des Tutorials die Level eines 2D-Plattformspiels für Spiele wie
Super Mario Bros. ansehen
. oder
Spelunky . Wir werden uns mehrere Ebenengeneratoren für 2D-Plattformer ansehen. Im Originalartikel sind sie alle interaktiv, sodass Sie Ihre eigenen Ebenen erstellen können. Während des Studiums werden wir Fragen zu ihrem Generationsraum stellen.
Alle Beispiele sind auf unserem GitHub als Open-Source-Skizze verfügbar, die in Processing geschrieben wurde .
Während des Studiums werde ich fett gedruckte Fragen stellen, zum Beispiel:
Wie groß ist der Raum der Möglichkeiten für diese Plattformebenen? Sie können sie sicher überspringen, wenn Sie nur den Artikel lesen und mit Beispielen spielen möchten. Manchmal füge ich auch Tipps hinzu, um Fragen zu beantworten, zum Beispiel:
Tipp: Levels haben eine Breite von 40 Plättchen und eine Höhe von 10 Plättchen. Jedes Plättchen kann eines von drei Elementen sein: eine Leere, ein Boden oder ein Bonusblock.Sie können an der Eingabeaufforderung pausieren und nicht auf der Seite nach unten scrollen, wenn Sie die fertige Antwort nicht lesen möchten. Schauen wir uns also unseren ersten Generator an.
Algorithmus 1: Zufälligkeit
Unser Generator der ersten Ebene ist sehr einfach - er ist völlig zufällig. Jede Karte hat ein linkes Startplättchen und ein rechtes Ausgangsplättchen. Alle anderen Kartenplättchen haben eine 33% ige Chance, leer zu sein, 33% beschäftigt zu sein und 33% ein Bonusblock zu sein.
Sie haben wahrscheinlich bemerkt, dass dies kein sehr guter Pegelgenerator ist. Tatsächlich sind die meisten dieser Levels sogar unmöglich zu spielen, ganz zu schweigen von ihrem Interesse. Generieren Sie ein paar weitere Ebenen und denken Sie über die Frage nach:
Wie groß ist der Generierungsraum eines solchen Generators im Vergleich zum Raum der Möglichkeiten?Hinweis: Können Sie eine Ebene finden, die sich im Raum der Möglichkeiten befindet, aber nicht im Raum der Generation? Können Sie ein Level finden, das dieser Generator nicht erstellen kann?Die richtige Antwort lautet, dass der Erzeugungsraum dieses Generators dem Raum der Möglichkeiten entspricht. Jede Kachel auf der Karte kann einen beliebigen Wert annehmen, sodass sich jede Ebene, die wir uns vorstellen können, im Generierungsraum befindet. Die faszinierendsten und interessantesten Levels befinden sich in diesem Generationsraum, sogar die Karte, auf der SUPER MARIO FANTASTISCH ist, ist in Bonusblöcken geschrieben. Leider ist der Erzeugungsraum so groß, dass es äußerst unwahrscheinlich ist, ein gutes Niveau zu finden. Wie Sie durch Klicken auf den Generator sehen können, sind die meisten Ebenen nur Müll.
Algorithmus 2: Zeichnen zufälliger Formen
Unser nächster Algorithmus ist etwas komplizierter und erstellt Levels, die eher dem entsprechen, was Sie im Spiel anwenden können. Ausgehend von einem leeren Level wählt er irgendwo einen zufälligen Punkt aus und zeichnet dann eine Linie oder ein Quadrat aus Blöcken mit Boni oder Land. Er führt diese Operation 20 Mal aus und erstellt mehrere Formen, die zufällig auf der Ebene gezeichnet werden. Wie zuvor können Sie auf das Beispiel im Originalartikel klicken, um den Algorithmus erneut zu starten und eine neue Ebene zu generieren.
Dies ähnelt bereits einem Level für den Plattformer, oder? Stellen Sie sich beim Generieren von Levels mental vor, wie Sie sie spielen (seien Sie bei Bedarf großzügig - fügen Sie bei Bedarf die Möglichkeit zum Doppelsprung oder die Fähigkeit zum Springen außerhalb der Kartenobergrenze hinzu).
Wie viele Ebenen müssen generiert werden, bevor Sie mindestens eine finden, die Sie durchlaufen können?Streben Sie nicht nach absoluter Genauigkeit bei Ihren mentalen Durchläufen, sondern machen Sie nur eine grobe Schätzung.
Wenn ich diese Übung mit dem Publikum mache, dauert es normalerweise ungefähr 10 Versuche, um das Level im Durchschnitt zu finden. Wie viel hast du gebraucht? Merken Sie sich diese Nummer und sehen Sie sich nun die unten gezeigte Variante desselben Generators an. Der Generator ist der gleiche, den wir gerade gesehen haben, aber jetzt zeichnet er auf dem Niveau von nicht 20, sondern 10 Ziffern. Zählen Sie jetzt noch einmal:
Wie viele Ebenen müssen Sie generieren, bevor Sie die finden, die Sie durchlaufen können?Sie haben wahrscheinlich weniger Zeit gebraucht, um ein spielbares Level zu finden. Lassen Sie uns eine Minute innehalten und über die Unterschiede zwischen den beiden Generatoren nachdenken, die bis auf einen geringfügigen Unterschied in den Parametern nahezu identisch sind.
Welcher Generator hat einen größeren Generationsraum - ein Generator mit 20 Zahlen oder mit 10?Hinweis: Denken Sie an das Level, das ein Generator mit 10 Figuren erzeugt - kann ein Generator mit 20 Figuren es erzeugen? Und dann denken Sie an das umgekehrte Beispiel.Die richtige Antwort ist, dass ein Generator mit 20 Ziffern einen größeren Generationsraum hat; Tatsächlich enthält es den gesamten Erzeugungsraum des Generators mit 10 Ziffern. Um dies zu zeigen, stellen Sie sich einen beliebigen Pegel eines Generators mit 10 Ziffern vor. Unser Generator mit 20 Figuren kann es erstellen, indem er versehentlich dieselben zehn Figuren rendert und sie dann versehentlich ein zweites Mal übereinander zeichnet. Mit einem Generator mit 10 Figuren kann jedoch keine Ebene mit zwanzig separaten Figuren gezeichnet werden.
Dies bedeutet, dass der Generator mit 20 Ziffern mehr Ebenen hat, einschließlich interessanter Ebenen. Es sei jedoch daran erinnert, dass es mit einem Generator mit 10 Figuren viel einfacher war, ein spielbares Level zu finden.
Wenn Sie einen Generator für Ihr Videospiel auswählen müssten, welchen würden Sie verwenden? Es gibt keine richtigen Antworten, aber dies ist eine sehr wichtige Entscheidung, die häufig bei der Arbeit mit prozeduralen Generatoren getroffen werden muss. Ein Generator kann mehr Variabilität erzeugen und hat mehr Überraschungen, der andere ist zuverlässiger und weniger stressig für den Spieler.
Algorithmus 3: Ebenenfragmente
Dieser Algorithmus basiert auf dem in Spelunky verwendeten Pegelgenerator. Hier können Sie mehr darüber lesen. Der Levelgenerator wählt zufällig ein Fragment eines Levels aus, das von einer Person (mir) erstellt wurde, und fügt es in ein Level ein. Dann wählt er ein anderes zufälliges Fragment des Levels aus und fügt es nebeneinander ein, bis das Level abgeschlossen ist. Hier ist der Generator, der Hintergrund ist abgedunkelt, so dass die Ränder der Fragmente deutlich sichtbar sind:
Wie viel Zeit wird jetzt benötigt, um ein spielbares Level zu generieren? Sie werden feststellen, dass fast jedes Level spielbar ist. Wir wissen genau, was sich in jedem Fragment befindet, das heißt, wir können garantieren, dass es auf dem Level interessante Objekte gibt, auf die Sie springen können, und Hindernisse, die Sie vermeiden müssen. Gleichzeitig ist es dynamischer als die statische Ebene - wir wissen nicht, welche Fragmente in welcher Reihenfolge darin erscheinen werden. Der Spelunky-Algorithmus ist noch umfangreicher, berücksichtigt vertikale Bewegungen und fügt jedem Fragment zufällige Variationen hinzu. Darius Casemi hat den fantastischen interaktiven Level-Generator Spelunky erstellt, den Sie
hier finden .
Solche Generatoren sind ein guter Kompromiss zwischen angenehmen Überraschungen und der Fähigkeit zur Steuerung. Wenn ein Generator eine Auswahl aus einem Katalog von Elementen trifft und diese miteinander verbindet (manchmal nach speziellen Regeln, wie in Spelunky), nennen wir ihn
einen grammatikalischen Generator . Mit der Grammatik können wir entscheiden, welche Bausteine ein prozeduraler Generator verwenden soll, aber weniger streng, wie sie verbunden werden sollen. Aber diese Kontrolle und Sicherheit haben ihren Preis. Schauen Sie sich den Generator noch einmal an und denken Sie dann an die vorherigen Beispiele.
Wie oft wird uns ein solcher Pegelgenerator überraschen?Der Generator steckt zunächst voller Überraschungen, denn wir treffen jedes Fragment zum ersten Mal. Wenn Sie jedoch mehr spielen, bemerken Sie schnell, wo eines endet und ein anderes Fragment beginnt. Selbst wenn dieser Generator Hunderte von Fragmentkombinationen enthält, fühlen Sie sich in nur wenigen Ebenen so, als hätten Sie alle gesehen. Die Einfachheit und Leichtigkeit, die Grammatik von Fragmenten zu verstehen, ist für Entwickler großartig, kann aber für die Spieler ein Nachteil in Bezug auf den Spaß sein.
Algorithmus 4: Human Design
Als letztes Beispiel werden wir keinen Algorithmus betrachten, sondern einen ganz anderen kreativen Prozess: die Arbeit von Menschen im Level-Design. Klicken Sie auf den Generator im Originalartikel und Sie erhalten eine der ersten beiden Ebenen von Super Mario Bros. (genauer gesagt, ihr Anfang).
Ausgehend vom absoluten Zufall haben wir eines der bekanntesten Beispiele für 2D-Plattformer-Design in der Geschichte gefunden. Natürlich ist dies kein Generator, aber in gewissem Sinne können diese Ebenen als Generatoren wahrgenommen werden, die nur eine Ebene mit hoher Qualität erzeugen. Der maximale Kompromiss zwischen Kontrolle und Qualität. Denken Sie auf dieser Ebene an alle Generatoren, die wir heute untersucht haben, und an die Frage:
Welche dieser Generatoren enthalten diese berühmten Ebenen in ihrem Generationsraum? .
- Zufällige Generierung
- Erzeugung von 20 Formen
- 10 Formengenerierung
- Level-Fragmente
Nur der erste Generator kann solche Ebenen erstellen. Formgeneratoren könnten sie erstellen, wenn wir die Anzahl der möglichen zu zeichnenden Formen erhöhen würden, aber es würde auch die Anzahl der schlechten oder seltsamen Ebenen erheblich erhöhen. Ein Level-Fragment-Generator könnte dies tun, wenn wir ihm einen anderen Satz von Fragmenten geben würden, aber wären alle anderen Kombinationen dieser Fragmente spielbar?
Dies zeigt uns, wie schwierig es ist, einen prozeduralen Generator zu erstellen. Wir möchten uns unsere Generatoren als den üblichen Inhalt des Spiels vorstellen und uns vorstellen, wie der Spieler ein bestimmtes Level durchläuft und es genießt. Aber als Designer der Generation sollten wir über den gesamten Raum der Generation nachdenken und nicht nur über ein einziges Beispiel davon. Wie groß ist der Raum? Wie reich ist es an Überraschungen? Wie oft schafft es etwas Langweiliges oder Schlechtes? Können wir diese Fälle erkennen und filtern oder müssen wir nach einer Problemumgehung suchen? Dies sind nur einige der Punkte, die Sie berücksichtigen müssen, wenn Sie etwas für die Generierung erstellen.
Zusammenfassend
Heute haben wir folgende Konzepte kennengelernt:
Generationsraum
Der Generierungsraum des prozeduralen Inhaltsgenerators (z. B. des Minecraft-Weltgenerators) ist die Menge aller Ergebnisse, die er generieren kann. Wenn wir den Algorithmus ändern oder einen anderen Wert für die Variable festlegen, ändert sich der Generierungsraum.
Raum der Gelegenheit
Der Raum der Möglichkeiten für eine bestimmte
Art von Inhalten (zum Beispiel die Minecraft-Welt) ist die Menge aller Beispiele für solche Inhalte, die wir präsentieren oder beschreiben können. Normalerweise, aber nicht immer, ist es viel größer als der Generierungsraum eines prozeduralen Generators.
Mehr ist nicht immer besser
Ein Generator mit einem großen Generationsraum hat normalerweise mehr guten Inhalt, unerwarteteren Inhalt und vielfältigeren Inhalt. Aber normalerweise hat er mehr Junk-Inhalte, langweiligere Inhalte und unangemessenere Inhalte.
Ein Generator mit weniger Generationsraum ist einfacher zu steuern, leichter zu testen und leichter zu verstehen. Dies kann es jedoch vorhersehbarer und weniger überraschend machen.
Es ist die Kunst, Software für die Generierung zu entwickeln, um die Stärken und Schwächen dieser beiden Gegensätze auszugleichen.
Zusätzliche Lektüre und danke
Damit ist mein Tutorial abgeschlossen! Danke fürs Lesen.
Unter den interessanten Materialien zu dem Thema, das wir untersucht haben, empfehle ich Folgendes: