Um kurz Ihre Hauptfrage beantworten erster, die wichtigsten Vorteile sind eine prozedural generierten Spielwelt , dass:
Die Welt kann riesig sein , viel größer als jede manuell gestaltete Spielwelt.
Die Welt (oder zumindest Teile davon) kann für jedes Spiel neu generiert werden, was möglicherweise den Wiederholungswert erhöht, da der Spieler immer etwas Neues zu entdecken hat.
Umgekehrt sind die Hauptnachteile der prozeduralen Generierung folgende:
Abhängig von den verwendeten Generationsmethoden kann es schwierig sein, sicherzustellen, dass die Welt immer spielbar ist, dh, dass der Spieler nicht mehr weiterkommt, nur weil er mit der Weltgeneration Pech hat.
Selbst wenn Sie es vermeiden können, völlig unspielbare Welten zu generieren, kann die zufällige Generierung von Welten zu einem sehr unterschiedlichen Schwierigkeitsgrad führen: Manchmal findet der Spieler alles, was er benötigt, nur in einer günstigen Reihenfolge, manchmal dauert es lange, bis er nichts Nützliches findet .
Über lange Zeiträume tendieren solche zufälligen Schwankungen dazu, sich zu normalisieren, aber wenn die Schwierigkeit des Spiels z. B. stark von vorne belastet ist (typisch für Überlebensspiele), könnte ein schlechter Start ein Spiel ruinieren, während ein sehr glücklicher Start es aller Herausforderungen berauben könnte.
Eine schlecht durchgeführte prozedurale Generierung kann die Welt eintönig und langweilig machen: Nachdem Sie ein Dutzend zufällig generierte Labyrinthe gesehen haben, sehen sie alle gleich aus, auch wenn sie sich in Details unterscheiden.
Wenn die Spielwelt für jedes Spiel komplett neu generiert wird, gibt es keine festen Orte oder Funktionen, die der Spieler aus früheren Spielen erkennen könnte. Solch eine mangelnde Vertrautheit könnte es dem Spieler erschweren, sich emotional auf das Spiel einzulassen oder Erfahrungen mit anderen Spielern auszutauschen.
Es gibt auch eine Sache, die Sie in jeder Liste zählen können: In einem Spiel, in dem die Welt für jedes Spiel zufällig neu generiert wird, kann es keine "Komplettlösung" geben, da jedes Durchspielen anders sein wird.
(Diese Unwiederholbarkeit könnte auch ein Problem beim Testen und Debuggen sein, obwohl dies zumindest teilweise vermieden werden kann, indem der RNG-Startwert zumindest im Debug-Modus angegeben und / oder ein "Cheat" -Befehl bereitgestellt wird, der verwendet werden kann Vorspulen auf verschiedenen Stufen.)
Wenn Sie sich jedoch die Liste der Nachteile ansehen, werden Sie feststellen, dass sie hauptsächlich die Nachteile einer reinen prozeduralen Generierung beschreibt. Viele davon können vermieden werden, indem manuell und prozessual erzeugte Inhalte gemischt werden .
Zum Beispiel könnte der Spieler immer in einer festen, manuell gestalteten Stadt beginnen, die möglicherweise von einer größeren, mehr oder weniger festen Heimatregion umgeben ist, aber Orte, die weiter von der Stadt entfernt sind, könnten zufällig generiert werden, um dem Spieler immer unbekannte Regionen zum Erkunden bereitzustellen.
Es könnte auch andere manuell gestaltete Städte oder andere Orte geben, die (mehr oder weniger) zufällig auf der Welt platziert werden, sodass der Spieler sie finden muss, aber weiß, was ihn erwartet, wenn er dort ankommt. Umgekehrt könnten markante Merkmale wie Berge manuell platziert werden (zumindest in der Nähe des festen Startorts), aber die Details ihres Geländes könnten zufällig ausgewählt werden.
Zufällige Platzierungen, die zu Deadlocks und Schwankungen führen, können behoben werden, indem verschiedene Konsistenz- und Gleichgewichtsprüfungen zusätzlich zu Ihrem Algorithmus für die prozedurale Welterzeugung implementiert werden. Wenn der Spieler beispielsweise einen bestimmten Gegenstand benötigt, um Wasser überqueren zu können, können Sie einen Code einfügen, der sicherstellt, dass mindestens ein solcher Gegenstand so platziert ist, dass der Spieler ihn erreichen kann, ohne Wasser zu überqueren.
In ähnlicher Weise möchten Sie möglicherweise auch Ihre Regeln für die Platzierung von Gegenständen so anpassen , dass keine Zauberstäbe mit ausgleichender Wirkung platziert werden, bevor der Spieler Stufe x erreicht hat , und möglicherweise sicherstellen, dass mindestens einer an einem festen Ort platziert wird, den der Spieler erreichen kann es, bevor sie auf die Bühne kommen, wo sie es brauchen werden, um zu überleben.
Übrigens: Eine übliche Methode, um prozedurale und manuell generierte Inhalte mehr oder weniger nahtlos miteinander zu verknüpfen, besteht darin, den manuellen Generierungsprozess mithilfe des prozeduralen Weltengenerators zu starten (möglicherweise in geeigneter Weise angepasst, um z. B. ein Dorf oder einen Berg zu generieren, wo Sie es möchten ), um die Region zu initialisieren, die Sie entwerfen, und sie dann manuell zu optimieren, um die gewünschten Details hinzuzufügen und anzupassen. (Dies kann auch eine sehr kompakte Niveauspeicherung ermöglichen, indem nur die manuellen Änderungen und die verwendeten Generatorsamen und -parameter gespeichert werden.)
Sie können manuelle und prozedurale Inhalte auch kombinieren, indem Sie in Ihren manuell erstellten Ebenen leere Stellen lassen, die durch zufällige Inhalte ausgefüllt werden (z. B. kann eine Burg ein zufällig generiertes Labyrinth in den Dungeons enthalten, bei dem nur die Umrisse und die Ausgänge festgelegt sind) Das manuelle Design kann nur den allgemeinen Umriss einiger Teile der Ebene (z. B. die Platzierung von Häusern in einer Stadt) festlegen und die Details (wie das genaue Erscheinungsbild jedes Hauses) nach dem Zufallsprinzip auswählen.
Tatsächlich verwenden sogar viele Spiele, deren Spielwelt vollständig festgelegt ist, eine Form der prozeduralen Generierung als Teil ihres Level-Design-Prozesses, da es einige Aspekte der Welterzeugung gibt (wie das Erzeugen von natürlich aussehendem Gelände oder das Platzieren einzelner Bäume in einem Wald). Das ist schwierig und / oder mühsam von Hand zu tun, aber relativ einfach zu automatisieren.
Umgekehrt verwenden die meisten prozeduralen Weltengeneratoren mindestens einige manuell entworfene Objekte und Elemente, um die Welt aufzubauen. Man könnte sogar leicht mehrere Ebenen verschachtelter zufälliger / manueller Erzeugung haben: Beispielsweise könnte eine prozedural erzeugte Welt eine manuell erzeugte Stadt umfassen, die von prozedural erzeugten Wäldern mit einem manuell gezeichneten Umriss umgeben ist, wobei prozedural erzeugte Bäume manuell entworfene Blätter tragen.
Beachten Sie auch, dass die Erstellung von prozeduralen Inhalten nicht unbedingt mit einer festen Welt inkompatibel ist: Sie können einfach einen festen RNG-Startwert auswählen und ihn zur Erstellung Ihrer Welt verwenden. Dies kann nützlich sein, wenn Sie möchten, dass die Spieler eine riesige Welt erkunden, diese aber für jedes Spiel und jeden Spieler gleich bleibt.
Beachten Sie, dass Sie in diesem Fall (oder auch wenn Sie dies nicht tun) Ihren Weltgenerator wirklich so gestalten sollten, dass er hierarchisch mit mehreren RNG-Instanzen arbeitet, sodass z. B. der gesamte Kartengenerator eine einzige RNG-Instanz enthält Dies würde verwendet, um Unterregionen zu generieren, wobei jeder Unterregion ein anderer Startwert zugewiesen würde, den der Regionsgenerator dann verwenden würde, um eine separate RNG-Instanz zu generieren, die er zum Generieren der Region verwenden würde, und so weiter. Auf diese Weise soll der "Schmetterlingseffekt" vermieden werden, bei dem selbst kleinste Details des kleinsten Teils der Karte den RNG nicht mehr synchronisieren und alles andere auf der Welt völlig anders aussehen lassen können.
Ein weiterer wichtiger Weg, um den Schmetterlingseffekt zu vermeiden, insbesondere wenn Sie die Welt "on the fly" erzeugen, während der Spieler sie erforscht, besteht darin, normale RNGs gänzlich zu vermeiden (mit Ausnahme von Prozessen, die aus Sicht des Spielers "augenblicklich" ablaufen, wie das Erzeugen ein neues Level, wenn der Spieler es betritt) und stattdessen Zufallszahlengenerierungsmethoden verwenden, die keinen internen Status speichern. Wenn der Spieler zum Beispiel den Startpunkt für eine Subregion auswählt, die gerade betreten wird, könnte der Generator für die gesamte Welt die Koordinaten der Subregion (und seinen eigenen Startpunkt) nehmen und sie einer Hash-Funktion zuführen , um den Startpunkt für die Subregion zu generieren. Auf diese Weise sieht jede Region immer gleich aus, unabhängig von der Reihenfolge, in der der Spieler sie eingibt.
Ps. Lassen Sie mich nach all dem Exkurs noch kurz auf Ihre letzte Frage zum eigentlichen Code eingehen, der für die prozedurale Generierung verwendet wird. Leider denke ich nicht, dass es wirklich in einem sinnvollen Sinn zu beantworten ist, ohne viel detaillierter zu sein, als Sie angegeben haben, da es buchstäblich so viele verschiedene Möglichkeiten gibt, eine prozedurale Welterzeugung durchzuführen, wie es Spiele gibt, die sie verwenden.
Zum Beispiel ist der Urgroßvater aller prozedural erzeugten Erkundungsspiele wahrscheinlich Rogue , dessen Algorithmus zur Levelgenerierung einfach darin bestand, eine Reihe rechteckiger Räume zufällig in einem größeren rechteckigen Level anzuordnen und diese Räume mit Durchgängen zu verbinden (und eine Treppe zu platzieren) das nächste Level in einem von ihnen). Die verschiedenen Nachfolger , von Nethack bis zur Diablo- Serie, haben dieses System in vielerlei Hinsicht weiterentwickelt, aber die meisten haben die Grundidee unterschiedlicher Ebenen beibehalten, die aus Räumen, Dungeons und Labyrinthen bestehen, die mehr oder weniger zufällig auf einer Gitterkarte angeordnet sind.
Umgekehrt möchten Sie bei Spielen mit offenen Außeneinstellungen wahrscheinlich mit einer Art Algorithmus für die Erstellung fraktaler Geländedaten beginnen und darüber hinaus weitere Funktionen (Flüsse, Wälder, Städte usw.) erstellen. Oder Sie können etwas Ähnliches wie Minecraft tun und eine zufällige prozedurale 3D- Textur generieren , die bestimmt, welche Teile Ihrer Landschaft Boden bzw. Luft sind (skaliert und vorgespannt, sodass niedrigere Blöcke mit höherer Wahrscheinlichkeit Boden sind), und dann Features wie Wasser überlagern , Erde / Gestein, Vegetation usw. darauf.
Natürlich keine der oben genannten gilt , wenn Sie, sagen wir, ein Spiel zu schreiben Raumexploration , in welchem Fall Sie brauchen nur ein paar zufällig platzierten Sternsystemen zu erzeugen , nach einem gewissen Dichtefunktion, und dann eine zufällige erzeugen Set von Sternen und Planeten in jedem von ihnen. Oder Sie bereiten Ihre Spieler darauf vor, eine nichteuklidische Landschaft zu erkunden. In diesem Fall stehen Sie vor einer völlig anderen Reihe von Herausforderungen (z. B. der Tatsache, dass das Volumen innerhalb eines bestimmten Radius eher exponentiell als polynomiell zunimmt und dadurch zugenommen hat) wirklich schwer, eine große Karte im Gedächtnis zu behalten).