Kartengenerator



  • Hi Leute

    ich suche für meine 2d WISIM einen Kartengenerator der "ansehnliche" Karten aus verschiedenen Feldtypen generiert ( z.b. Wasser, Fluss, Wiese, Wald, Berg ).
    Es geht hier um ganz normale gerasterte Maps. Nix wildes.

    Gibt es da fertige Bibliotheken oder auch einen Algorithmus?


  • Mod

    fangen wir mal an

    for(y...)
    for(x...)
     *feld++=rand()%TypenAnzahl;
    

    jetzt fehlt noch die definition von "ansehnliche" und wir fixen was dir nicht gefaellt.



  • Die Definition von "ansehnlich" ist der Kernpunkt.

    Es sollten irgendwie zusammenhängende Flächen gleichen Typs sein.

    Was ich nicht will, ist z.B. Wasser-Land-Wasser-Land-Wasser-Land.
    Rein zufallsgenerierte Maps fallen aus. Daher muss eine Art Logik rein, die das Gelände etwas realitätsnaher macht.

    Und genau das ist meine eigentliche Frage. Gibt es da Logiken? Wahrscheinlichkeitsbäume?

    Vermutlich macht es Sinn, eher systematisch vorzugehen.

    Quasi grundsätzlich alles mit Wasser zu initialisieren. Dann den z.B. Umriss der Landmasse ( Insel ) zu generieren, dann die Inselfläche mit Grünland zu verfüllen und dann als Special quase Wälder und Gebirge einzeln darauf zu generieren.

    Macht vermutlich mehr Sinn, als einfach über jedes Feld drüber zu laufen und anhand einer Logik den Typ des Feldes zu ermitteln, oder?



  • Die Idee find ich gut.
    Hier ein kleiner Verbesserungsvorschlag:

    1-Welt komplett mit Wasser füllen

    2-Anzahl und Positionen der Inseln generieren(Zahlen)

    3-Jede Insel bearbeiten:
    -Größe generieren(2 ZahLen,jeweils X-Achse und Y-Achse)
    -Für jedes betroffene Feld wird nun zufällig wahr oder falsch gespeichert
    -Mittleres Feld(Falls keine Mitte,dann zufälliges Feld der Mittleren) automatisch zu wahr
    -Falls Felder mit dem Wert falsch nicht mit dem Wasser verbunden sind(geht auch über andere Felder mit dem Wert falsch)werden sie zu wahr(dies verhindert Lücken)
    -Alle wahren Felder werden zu Inselteilen

    4-...

    So wie die Inseln generiert werden,könnten acuh die Berge,etc. generiert werden.

    Dies ist aber auch nur eine Möglichkeit von vielen,letztendlich hängt es ja von dir ab,wie du es machst.



  • It0101 schrieb:

    Gibt es da fertige Bibliotheken oder auch einen Algorithmus?

    Normalerweise macht man das mit irgendeiner Art von Noise funktionien. z.B. mit http://de.wikipedia.org/wiki/Perlin-Noise oder http://en.wikipedia.org/wiki/Simplex_noise geht das. Zumindest Spiele wie Minecraft nutzen sowas für den Großteil der Weltgenerierung.

    Ist halt eine sehr Situationsabhängiges Problem das es keine allgemeine Library dafür geben kann. So muss man immer etwas ausprobieren...

    Normalerweise legt man mehrere Noisefunktionen mit verschiedenen Frequenzen übereinander und versucht daraus etwas abzuleiten. z.B. könnte man eine für Höhe und eine für Fruchtbarkeit es Bodens wählen und kann legt dann abhängig von diesen Parametern die Landschaft fest. zB wo die Höhe < x ist, ist Meer; wo die Höhe zwischen x und y ist und die Bodenfruchbarkeit über z ist, ist Wald, über der Höhe y sind dann nur eisbedeckte Berggipfel.

    (Wirkt mit etwas finetunig besser als selbstgebaute Frickellösungen, die bei jedem Parameterwechsel explodieren und dann nur Land oder Wasser hinterlassen bis man 5 andere Parameter nachgefixt hat.)



  • Was auch recht nett funktioniert, um größere zusammenhängende Flecken zu erzeugen, ist dieses:

    1. Eine bestimmte Eigenschaft (wie z.B. Gras, Sand, etc) auswählen
    2. Ein zufälliges Feld auf der Karte wählen
    3. Das Feld wird mit der gewählten Eigenschaft markiert
    4. Für jedes gerade angrenzende Feld (links, rechts, oben, unten) einen Zufallswert von 0-X erzeugen (X ist ein Parameter, der selbst noch in einem Zufallsbereich ausgewürfelt werden kann)
    5. Wenn der Wert gleich 0 ist oder das entsprechende Feld bereits die gewählte Eigenschaft besitzt brichst du ab, ansonsten führst du für jedes gewählte Nachbarfeld alle Schritte ab 3 rekursiv durch.

    So lassen sich z.B. Dinge wie Wälder recht gut verteilen. Das Ergebnis ist ein unregelmäßiger Fleck mit Chance auf kleinere Lichtungen dazwischen.

    Das Beste Ergebnis bekommst du wahrscheinlich, indem du mehrere Ansätze kombinierst. Z.B. kannst du anfangen und über eine Noise-Funktion eine Height-Map generieren und alles unter einer Bestimmten Höhe unter Wasser setzen, und dann mit einer Funktion wie oben Wälder oder andere Flächen verteilen.

    Flüsse kann man versuchen zu Erzeugen, indem man anfängt eine Linie zu ziehen und mit jedem Schritt eine kleine Chance auswürfelst, die Richtung ein paar Grad zu verändern (z.B. über eine Gauss-Zufallszahl) oder den Fluss in 2 Läufe aufzuteilen. Kommt aber stark darauf an, wie der Rest deiner Karte aufgebaut ist. Diese Methode ist eigentlich am Besten wenn der Fluss von einem Kartenrand zu einem anderen läuft und keine Endpunkte mitten auf der Karte hat.



  • blard schrieb:

    (Wirkt mit etwas finetunig besser als selbstgebaute Frickellösungen, die bei jedem Parameterwechsel explodieren und dann nur Land oder Wasser hinterlassen bis man 5 andere Parameter nachgefixt hat.)

    Das beschreibt ungefähr das Ergebnis meiner ersten Versuche 😃

    Danke euch erstmal für eure Hinweise. Ich bin jetzt erstmal systematischer rangegangen. Die "Chaos-Random"-Variante betrachte ich vorerst als gescheitert 😃


  • Mod

    vielleicht die natur nachbauen. damit waere der erste schritt ein terrain zu z.b. http://danielbeard.wordpress.com/2010/08/07/terrain-generation-and-smoothing/
    dann legst du einen wasserpegel an, danach begruenst du flaechen die mehr nach oben als seitwaertz zeigen.

    andere ueberlegung ist, dass du eigentlich eine zusammenhaengende landmasse moechtest, diese von wasser umgeben, also schritt 1. kreis in der mitte und wasser drumherum. dann die umrisse vom kreis deformieren, z.b. mit einem zufallsgenerator ueber die ganze map gehen und anhand der umgebenden felder die wahrscheinlichkeit stzen mit dem dieses feld deren typ annimmt und dann den randomizer fragen, wenn also die 8nachbarn wasser sind ist die chance 8:0 dass eswasser wird, wenn 8 nachbarn land sind, 0:8 fuer land, wenn 5wasser und 3land sind: 5:3 fuer wasser und du fragst den randomizer dann RandFloat()*8<5?Wasser:Land;
    wenn du das ein paar mal machst, deformierst du den umriss, definierst aber dennoch grob das aussehen.



  • rapso schrieb:

    andere ueberlegung ist, dass du eigentlich eine zusammenhaengende landmasse moechtest, diese von wasser umgeben, also schritt 1. kreis in der mitte und wasser drumherum. dann die umrisse vom kreis deformieren

    Das entspricht im Prinzip meiner derzeitigen Herangehensweise.
    Mal schauen wie weit mich das führt. Bis jetzt sehen die Umrisse der Landmassen schon ganz gut aus.

    Nun werd ich Standardmäßig alles Land zwischen den Stränden begrünen und dann über Gebirge, Wüsten und Wälder nachdenken.

    Für die Flüsse werde ich eine ähnliche Herangehensweise verwenden, wie für die Umrisse des Landes. Start und Zielpunkt des Flusses ermitteln und die Gerade dazwischen modifzieren ( Sinus z.b. )


Anmelden zum Antworten