Zufälliges Labyrinth erzeugen lassen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zufälliges Labyrinth erzeugen lassen

    Guten Morgen liebe Leut,

    bin ganz frisch hier und habe gleich eine Frage zu einem Problem, eine Kopfnuss für mich :) Mein jüngstes Game-Projekt (siehe Screenshot) steckt noch in der Anfangsphase, doch bin ich an dem Punkt, bei dem ich zufällige Level erzeugen lassen möchte. Die Instanzen meines Wand-Objekts sollen wie ein Labyrinth im Raum erstellt werden. Irgendwo soll es einen Ausgang geben und es sollte Stellen, mit viel Platz geben. Tja, also wie mache ich das am Besten? Ringsrum habe ich schon Wände mittels For-Schleife und instance_create erstellen lassen, kein Problem. Aber ein Labyrint?! Wer hat eine Idee?

    Ich danke schon mal im Vorraus.

    Möge die macht mit euch sein,

    Morpheus


  • bin mir nicht ganz sicher ist das ein jump and run?
    sieht so aus aber bin mir nicht sicher, weil das ja ein Labyrint werden soll.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Es wird eine Art von Shoot Em Up. Der Spieler kann fliegen. Darum ist es egal, wie groß die Abstände zwischen den Wänden/Böden sein werden.

    Ich hab schon eine Idee, wie es gehen könnte. Und zwar lasse ich erst den kompletten Raum per For-Schleifen mit den Wandobjekten füllen. Dann lasse ich ein Objekt mit einem Labyrinth zeichnen. So groß wie der Raum ist. Überall da, wo das Sprite transparent ist, werden die Wandobjekte gelassen und da wo Linien sind, werden sie per Kollisionsabfrage gelöscht. Da das sprite mehrere Images, mit unterschiedlich gezeichneten Labyrinthsystemen hat und diese auch noch zufällig rotiert werden, entsteht zumindest der Eindruck, es handle sich um ein zufällig generiertes Labyrinth. Werde das jetzt mal ausprobieren.

    Ich hatte auch schon eine andere Lösung, doch bei der gab es zu viele Sackgassen und abgeschlossene, kleine Räume.

    Hat jemand eine andere Idee?
  • Mein erster Ansatz: (Der ist aber bestimmt nicht gut :thumbsup: )
    Du könntest verschieden Zonen deinem Spiel verleihen. Sprich es gibt 20 Zonen, welche alle links, rechts, oben und unten immer gleich start bzw. enden. Dann machst du einen Raum der von dieses 20 verschiedenen Zonen 100 Zonen beinhalten können. Du nimmst dann eine Zone von den 20 Zonen und schmeißt sie in den Raum. Das machst du dann 100x. Dann hast du dein zufall aufgebauten Raum. Natürlich kannst du Zonen dann auf der Seite mit blöcken zu mauern, dass es schwerer wird. Du müsstest dann halt nur mehr überprüfen ob es einen Weg zum Ende gibt. vllt. mittels mp_grid oder so. Wenn ein Weg nicht existiert dann machst du das Labirinth neu.

    Zweiter:
    Du kannst dir das mal anschauen. Hilft dir bestimmt weiter: wiki.
    Ich glaub der Algorithmus läuft auf diesen hinaus: Wiki2

    Edit:
    Hier ist es noch besser beschrieben:
    mazeworks.com/mazegen/mazetut/index.htm

    Edit:
    Ich hab mal ein Labyrinth versucht. Anbei das was rauskam. Vielleicht hilft es dir ja was.

    P.s.:
    Ist man in deinem Spiel eine Birne mit einem mänschlichen Kopf? :thumbsup:

    MfG
    Dateien
    • test.gmk

      (10,75 kB, 239 mal heruntergeladen, zuletzt: )
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Rodrog ()

  • Vielen, vielen Dank für deine Mühen Rodrog. Dein kleines Example ist wirklich großartig. Auf diesen Code wäre ich im Leben nicht gekommen. Leider versteh ich diesen noch nicht so weit, um ihn für meine Zwecke abzuändern. Denn bei deinem coolen Beispiel enstehen mehrere Ausgänge und viele verschlossene Wege. Meine Spielfigur fängt immer in der oberen, linken Ecke an. Und es muss immer möglich sein zum Ausgang zu gelangen.

    Mein, im letzten Beitrag, genannter Lösungsweg funktioniert. Ich habe mehrere kleine Labyrinthe aus roten Linien gezeichnet. 100 Pixel groß. Wenn der Raum startet wird ein Objekt erstellt, dass zufällig eines dieser Labyrinthe zeichnet. Und zufällig um 0, 90, 180 oder 270 Grad rotiert. Das Sprite wird auf Raumgröße skaliert. Dann überprüfen die Wand-Instanzen, die den ganzen Raum ausfüllen, wo sie mit roten Linien kollidieren und zerstören sich dann. Dadurch enstehen dann Gänge.

    Leider scheint meine Variante, im Gegensatz zu deiner, sehr rechenintensiv. Die fps geht bis auf Null runter und ich muss bis jetzt einen Lade-Screen zeichnen lassen. Es dauert ca. zehn Sekunden bis das Level generiert ist. Ich weiß nicht, ob es daran liegt, dass das kleine Sprite auf die Room-Größe von 10000 skaliert wird oder an den hunderten von Wandobjekten. Irgendwie muss ich das noch optimiert bekommen.

    Aber ja... in meinem Spiel ist man eine Birne mit menschlichen Kopf............... mit Regenschirme aufn Buckel als Flügel :D


    NACHTRAG: Ich hab jetzt die Idee! Deine Variante: Vorteil: immer schön zufällig und sieht cool aus. Nachteil: Viele Sackgassen, abgeschlossene Teilstücke. Meine Variante: Vorteil: Es gibt immer einen Ausgang, einen Weg. Nachteil: Äußerst rechenintensiv und nicht wirklich random. Konsequenz: Eine Mischung aus BEIDEN Varianten! Ich werde es gleich mal ausprobieren! :)

    Danke noch mal Rodrog, wenn das Spiel fertig ist, werde ich dich in den Credits erwähnen.


    Edit zum 2. Mal: "Du bist nicht berechtigt innerhalb von 4 320 Minute(n) mehrere Antworten direkt hintereinander auf ein Thema abzugeben. Bitte bearbeite deinen vorherigen Beitrag." - Sehr lustig. Doppelposts sind hier wohl echt sehr unerwünscht.

    Auf jeden Fall: Rodrog, du bist eine Genie. Wie ich gesagt hab, deine und meine Variante zusammen funktionieren wunderbar. Es schaut echt gut aus:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Morpheus ()

  • Ein wenig spät aber doch.

    Morpheus schrieb:

    Vielen, vielen Dank für deine Mühen Rodrog. Dein kleines Example ist wirklich großartig. Auf diesen Code wäre ich im Leben nicht gekommen. Leider versteh ich diesen noch nicht so weit, um ihn für meine Zwecke abzuändern. Denn bei deinem coolen Beispiel enstehen mehrere Ausgänge und viele verschlossene Wege. Meine Spielfigur fängt immer in der oberen, linken Ecke an. Und es muss immer möglich sein zum Ausgang zu gelangen.

    Naja, das würd ich jetzt nicht unbedingt behaupten. Ich hab ja nur den Pseudecode von der einen Webseite, in GML geschrieben. Leider hatte ich da einen Fehler den ich nicht so ganz wegbekommen konnte und der auch immer noch existiert.

    Morpheus schrieb:

    Danke noch mal Rodrog, wenn das Spiel fertig ist, werde ich dich in den Credits erwähnen.

    Haha :) Da fühl ich mich jetzt aber geehrt. :D Muss aber nicht sein. Dafür ist doch das Forum da :gmlove:

    Morpheus schrieb:

    Edit zum 2. Mal: "Du bist nicht berechtigt innerhalb von 4 320 Minute(n) mehrere Antworten direkt hintereinander auf ein Thema abzugeben. Bitte bearbeite deinen vorherigen Beitrag." - Sehr lustig. Doppelposts sind hier wohl echt sehr unerwünscht.

    Auf jeden Fall: Rodrog, du bist eine Genie. Wie ich gesagt hab, deine und meine Variante zusammen funktionieren wunderbar. Es schaut echt gut aus:


    Finde es sehr gut, wie du beide Varianten verknüpft hast. Hast du in zufälligen Gebieten noch die Mauern entfernt? Und "Genie" ist wohl ein "wenig" übertrieben. Wie gesagt hab ich nur Pseudocode in GML verwandelt.

    LG
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ok, ein Genie magst du deswegen vielleicht nicht sein aber als ich das schrieb war ich halt richtig froh darüber, dass es funtioniert und wollte dich loben. :) Und ja, ich hab es so gemacht, dass manche Mauern verschwinden damit zufällige Plätze entstehen. In meinem Spiel wuseln jetzt mittlerweile auch Gegner herum. Da soll der Spieler auch mal Platz haben um ausweichen zukönnen.
  • Ich habe auch mal die von Rodrog beschriebene Variante in einem Projekt verwendet (das nie fertig wurde...) und finde, dass das in solchen Fällen eine sehr gute Wahl ist. Habe viel mit Zufallsgenerierung herumexperimentiert, bis ich dann letztendlich bei den zufällig ausgewählten Teilstücken gelandet bin. Das Problem bei komplett zufallsgenerierten Karten ist auch, dass es meist ziemlich doof aussieht. Dann sind auch mehrere Durchläufe nötig um Sackgassen zu entfernen und noch etwas Dekoration zu verteilen. So jedenfalls bei einem meiner ersten Versuche. Damals noch mit XNA.

    Deine Variante finde ich aber ziemlich interessant :D. Was ich aber erwähnen wollte: Es ist normal, dass sowas letztendlich etwas rechenintensiver wird. Und solang das nur beim generieren der Karte der Fall ist, ist das meiner Meinung nach auch kein Problem. Sicher kann man da immer noch was optimieren aber letztendlich ist eine Zufallsgenerierte Karte immer mit viel Aufwand verbunden und spürbare Ladezeiten wird man da wohl nicht vermeiden können.