Erhöhen der Wahrscheinlichkeit, dass ähnliche Kacheln nebeneinander erzeugt werden

9

Ich arbeite an einem Kachelkartensystem, das insofern so aussieht (Grün ist Gras, Luft ist Weiß, Stein ist Grau und Blau ist Wasser):

Fliesen

Es wird ein einfacher Zufallszahlengenerator verwendet, sodass eine Wahrscheinlichkeit von 45% besteht, dass die Fliese Gras ist, eine Wahrscheinlichkeit von 30%, dass sie Wasser ist, und eine Wahrscheinlichkeit von 25%, dass sie Stein ist.

Gibt es überhaupt eine Möglichkeit, die Tendenz zu erhöhen, dass Gras- / Steinblöcke zusammenklumpen, um Landmassen zu bilden, und Wasserblöcke Ozeane bilden (ähnlich wie in einem Spiel wie Minecraft)?

Flugzeugführer19
quelle

Antworten:

17

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.

Lachsmoose
quelle
+1 Da ich denke, dass der Sprung zum Rauschen im Allgemeinen dahin führt, wohin dies führen wird. Ich frage mich, ob das ein bisschen zu groß für einen Sprung sein könnte, also hat mich das anfängliche "Scannen und Ändern der Prozente" in die Abstimmung erleichtert :)
James
3

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.

Jason Morales
quelle
2

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.

Dhasenan
quelle
2

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.

Vite Falcon
quelle
0

Sie können dies mit dieser Methode tun:

  • Legen Sie alle Kacheln in eine nicht spezifizierte Liste
  • während es eine Kachel in der nicht spezifizierten Liste gibt
  • Start
  • Wähle eine Kachel aus dieser Liste
  • Überprüfen Sie die Nachbarn dieser Kachel und wählen Sie einen Typ aus, der von den Nachbarn abhängt
  • Entfernen Sie diese Kachel aus der nicht angegebenen Liste
  • Ende
Ali1S232
quelle