minicrispie: Karten erstellen

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

--
Wo die Sprache aufhört, fängt die Musik an...
Selfcode:  sh:) fo:) ch:° rl:( br:^ n4:} ie:{ mo:} va:) js:| de:] zu:) fl:( ss:| ls:~
Go to this
  1. 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

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      --
      Wo die Sprache aufhört, fängt die Musik an...
      Selfcode:  sh:) fo:) ch:° rl:( br:^ n4:} ie:{ mo:} va:) js:| de:] zu:) fl:( ss:| ls:~
      Go to this
      1. Eine klassische Normalverteilung kann man programmatisch folgendermaßen realisieren (Pseudo-Code):

        karte = Array(felder_horizontal * felder_vertikal)
        feld = 0

        Alle 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
        }

        Gruß, LX

        --
        X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: Unusual
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          karte = Array(felder_horizontal * felder_vertikal)
          feld = 0

          Alle 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

          --
          Wo die Sprache aufhört, fängt die Musik an...
          Selfcode:  sh:) fo:) ch:° rl:( br:^ n4:} ie:{ mo:} va:) js:| de:] zu:) fl:( ss:| ls:~
          Go to this
  2. 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

    1. 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

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      1. 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

        1. Moin.

          1. 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

          1. Hallo,

            Super!
            Genau das hab ich gesucht! Danke!

            MfG. Christoph Ludwig

            --
            Wo die Sprache aufhört, fängt die Musik an...
            Selfcode:  sh:) fo:) ch:° rl:( br:^ n4:} ie:{ mo:} va:) js:| de:] zu:) fl:( ss:| ls:~
            Go to this
    2. 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.

      --
      "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
            - T. Pratchett