Karten erstellen
minicrispie
- programmiertechnik
0 LX0 minicrispie0 LX
1 Christoph
Hallo,
Ich bin grad dabei, ein Spiel zu programmieren(C, Allegro).
Als "Ersatzlösung", da ich bis jetzt nocht nicht die Lust hatte, ordentliche Karten zu erstellen, habe ich rand() benutzt, um die Elemente auf der Karte zu platzieren.
Diese Karten sahen natürlich sehr Durcheinander aus, was mich bis jetzt noch nicht störte, da ich ein anderes Problem derweile gelöst hab. Nun ist es denk ich an der Zeit, mal endlich schöne Karten zu erstellen:
Der User soll, nachdem er auf "Neues Spiel" geklickt hat, folgendes Einstellen können:
-Breite der Karte
-Höhe der Karte
-Faktor der Karte
Der Faktor soll aussagen, wie "voll" die Karte zugestellt werden soll.
Als Elemente der Karte dienen Laubbaum, Nadelbaum, Wiese, Stein, Höhle, Wasser. Alle Elemente sind Felder von 40x40 Pixeln größe.
Nun meine Frage: Wie kann man am besten eine Karte erstellen, die einen Wald, See, ... enthält mit den obigen Faktoren?
Mir will spontan nix einfallen, wie ich so eine Karte erstellen kann.
Später soll noch ein Karteneditor dazukommen, aber der User soll auch eine Möglichkeit haben, ohne diesen, schöne Karten zu spielen.
Könnt ihr mir da helfen?
MfG. Christoph Ludwig
Am Besten ist eine klassische Normalverteilung der Objekte mit einer kleinen Anpassung: Seen (und vielleicht auch Wälder) sollten nachträglich mit einem einfachen Median-Filter geglättet werden, um realistischer zu wirken.
Gruß, LX
Hallo,
Am Besten ist eine klassische Normalverteilung der Objekte mit einer kleinen Anpassung: Seen (und vielleicht auch Wälder) sollten nachträglich mit einem einfachen Median-Filter geglättet werden, um realistischer zu wirken.
Ich versteh dich nicht ganz. Was verstehst du unter "klassischer Normalverteilung?"?
Meine Frage ist, mich welchem Algorithmus, also wie ich eine Karte erstelle unter den gegebenen Faktoren. Und dazu will mir nix einfallen :/
MfG. Christoph Ludwig
Eine klassische Normalverteilung kann man programmatisch folgendermaßen realisieren (Pseudo-Code):
karte = Array(felder_horizontal * felder_vertikal)
feld = 0
for element in elemente {
karte[feld] = element
felt++
}
x = karte.length
while (--x >= 0) {
y = randomize(x+1)
tmp = karte[x]
karte[x] = karte[y]
karte[y] = tmp
}
Gruß, LX
Hallo,
karte = Array(felder_horizontal * felder_vertikal)
feld = 0Alle Elemente direkt hintereinander schreiben:
for element in elemente {
karte[feld] = element
felt++
}Kräftig schütteln (bei Bedarf wiederholen):
x = karte.length
while (--x >= 0) {
y = randomize(x+1)
tmp = karte[x]
karte[x] = karte[y]
karte[y] = tmp
}
hey danke!
Ich werds mal probieren.
MfG. Christoph Ludwig
Moin.
Eine einfache Möglichkeit wäre die Folgende:
Anstatt jedes Feld unabhängig voneinander zufällig zu befüllen, befülle eine ganze Gruppe von Feldern (z.B. 3x3 Cluster). Diese erste Befüllung könntest du bereits Parametrisieren - je nachdem, wie steinig oder waldreich deine Karte werden soll.
Nachdem das erledigt ist, betrachtest du die (acht) Randfelder jedes Clusters und wandelst diese erneut mit einer typenabhängigen Wahrscheinlichkeit in den angrenzenden Feldtypus um. Z.B. sollten Wälder eine höhere Wahrscheinlichkeit haben, zu 'wachsen', als Steine.
Als letzen Schritt verteilst du Sonderfelder wie Höhlen. Die Wahrscheinlichkeit, dass ein Stein-Feld zu einer Höhle wird, ist höher, als die Wahrscheinlichkeit, dass ein Wiesen-Feld dies tut. Wasser kann hingegen nie zu einer Höhle werden.
Christoph
Yerf!
Wasser kann hingegen nie zu einer Höhle werden.
Unterwasserhölen? ;-)
Aber der Ansatz die Karte nicht in einem Durchlauf zu erstellen, sondern "wachsen" zu lassen klingt interessant. Hat etwas vom "Game of Life" oder eben auch der Erdgeschichte, die Alpen sind auch nicht an einem Tag entstanden.
Gruß,
Harlequin
Moin.
Hat etwas vom "Game of Life" oder eben auch der Erdgeschichte, die Alpen sind auch nicht an einem Tag entstanden.
Jup. Der Algorithmus lässt viele Variationsmöglichkeiten. Die folgende ist vermutlich besser zu implementieren:
1. Fülle die Karte mit dem Basis-Typus
2. Verteile von jedem Typus eine vorher festgelegte Zahl von Samen
3. Lege eine Kopie der Karte an
4. Für jedes Feld des Basis-Typus in der Kopie, addiere für jeden Typus (auch den Basis-Typus!) die Gewichtungs-Parameter aller umgebenden Felder der Original-Karte; der Typus mit höchster Summe gewinnt, d.h. das entsprechende Feld wird in selbigen umgewandelt
5. Lege für jeden Feld-Typus die Zahl von Sonder-Typen (Höhlen, Artefakte, Brunnen, Flaggen, Minen - Heroes of Might and Magic lässt grüßen ;)) fest, die verteilt werden sollen, und verteile diese zufällig auf den Feldern entsprechende Typs
Christoph
Moin.
- Für jedes Feld des Basis-Typus in der Kopie, addiere für jeden Typus (auch den Basis-Typus!) die Gewichtungs-Parameter aller umgebenden Felder der Original-Karte; der Typus mit höchster Summe gewinnt, d.h. das entsprechende Feld wird in selbigen umgewandelt
Vermutlich ist es sinnvoll, hier noch eine Zufalls-Komponente einzubauen: Ist die Zahl der Samen gering gegenüber der Kartengröße, entstehen sonst unschöne identische Blöcke.
Christoph
Hallo,
Super!
Genau das hab ich gesucht! Danke!
MfG. Christoph Ludwig
Hi!
Das ist noch ne Stufe besser, als das was ich vorschlagen wollte. Das mit der 3x3 Matrix ist wirklich gut. Die Idee Elemente 'wachsen' zu lassen ist genau das, was ermoeglicht, brauchbare Landschaften mit Waeldern oder Seen zu erschaffen. Die Parameter legt der User dann fest, bevor die Karte generiert wird.