Sie könnten einen Algorithmus verwenden, der in der Nähe von Blöcken prüft und die Wahrscheinlichkeit abhängig davon variiert, was vorhanden ist - aber ich denke, es ist größtenteils der falsche Ansatz.
Was Sie betrachten möchten, sind fraktale Rauscharten - in diesem Fall Perlin- oder Simplex-Rauschen. Wenn Sie Rauschen erzeugen, erhalten Sie Werte von -1 bis 1.
http://en.wikipedia.org/wiki/Perlin_noise
Sie können dann Ihren Wasserstand anpassen, indem Sie den Schwellenwert für die Wassermenge festlegen. Für die anderen Blöcke können Sie einen zweiten Satz Geräusche ausführen, um zwischen Fels und Gras zu wechseln. (Auf diese Weise können Sie große Wasserflecken, aber kleinere Steinklumpen haben).
getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
if(perlin_noise(x * scale,y * scale) > 0) {
return rock
} else {
return dirt
}
} else {
return water
}
Da ich der Meinung bin, dass die Scan- und Toss-Methode zu kompliziert und nicht zu robust skalierbar ist, schlage ich eine andere Methode vor, die mir gefallen hat:
Legen Sie ein Raster über Ihre Karte und teilen Sie die Karte in große Quadrate auf.
Generieren Sie an jeder Kreuzung eine Zufallszahl (zwischen 0 und 1 funktioniert für Ihre Prozentsätze).
Unterteilen Sie, indem Sie jedes Quadrat in 4 gerade Quadrate schneiden. Folgen Sie den alten Linien. Wenn Sie die Unterteilungslinien finden, generieren Sie eine Zufallszahl zwischen den beiden benachbarten Punkten. Generieren Sie für die Mitte des Kreuzes einen Punkt, der zwischen den höchsten liegt und niedrigste Werte.
Spülen und wiederholen. Sie erhalten die anfängliche Zufälligkeit aus dem ersten Durchgang, aber die letzten Durchgänge ergeben eine gewisse Einheitlichkeit. Entschuldigen Sie die Pseudozufallszahlen:
0-------5 0---3---5 0-1-3-4-5 011233455
| | | | | | | | | | 012344555
| | | | | 0-2-4-6-5 002445665
| | | | | | | | | | 123445666
| | 2---5---7 2-4-5-7-7 234455777
| | | | | | | | | | 233455688
| | | | | 2-3-5-5-9 223455589
| | | | | | | | | | 233455589
2-------9 2---4---9 2-4-4-5-9 234445579
Dies funktioniert noch besser für Dreiecke, da Sie beim Unterteilen nicht den verlorenen Querbalken haben.
Das absolut beste Ergebnis wird natürlich durch die Kombination dieser Methoden erzielt - Schicht für Schicht erhalten einige Techniken großartige Landmassen, andere fantastische Höhlen, andere arbeiten für Hügel und mehr für Wassersysteme.
Lärm ist eine gute Lösung, wie bereits erwähnt wurde. Eine andere Möglichkeit besteht darin, die Daten in einem zweiten Durchgang in Richtung des gewünschten Layouts zu verschieben. Gaußsche Unschärfe ist eine von vielen Möglichkeiten, wie Sie dies erreichen können. Wenn Sie einen Pass damit machen, erhalten Sie schöne "runde" Blobs von jedem Typ.
Unabhängig davon, mit welcher Methode Sie arbeiten, ist es wichtig, die Ergebnisse des Prozesses an einem neuen Ort zu speichern. Wenn Sie die Karte an Ort und Stelle ändern, wirken sich die bereits verarbeiteten Teile auf den Algorithmus aus und Sie erhalten einige seltsame Muster.
quelle
Ein relativ einfacher Weg, dies zu tun, wäre die Erzeugung einer Anzahl von Kernen an zufälligen Positionen. Zeichnen Sie das Voronoi-Diagramm dieser Punkte. Weisen Sie jedem Bereich des Ergebnisses ein Element zu.
Dies führt zu etwas ziemlich Hässlichem und Mechanischem. Wenn Sie die Ränder etwas matschig machen, sind Sie in guter Verfassung.
Wenn Sie für eine große Karte generieren, können Sie dies auf zwei Ebenen tun. Erstellen Sie Ihr erstes Voronoi-Diagramm mit beispielsweise 20 Kernen und nennen Sie jede resultierende Region eine Nation. Erstellen Sie ein weiteres Diagramm mit 400 Kernen und nennen Sie jede resultierende Region ein Pfarrhaus.
Alle Pfarrhäuser, die vollständig in einer Nation enthalten sind, haben das Element der Nation. Pfarrhäuser, die teilweise in zwei oder mehr Nationen enthalten sind, nehmen zufällig eines der Elemente ihrer umschließenden Nationen.
Dieser Beitrag verdient ein Bild, aber ich bin zu faul, um eines zur Verfügung zu stellen.
quelle
Der polygonale Kartengenerator ist eine gute Lektüre für die Erstellung von Karten mit verschiedenen 'Zonen', wodurch Sie auch besser geformte Karten erhalten. Es basiert auf Voronoi-Diagrammen, aber ich denke, dies wäre ein guter Anfang.
quelle
Sie können dies mit dieser Methode tun:
quelle