Computer löst Irrgarten

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

    • Computer löst Irrgarten

      Hallo zusammen:)

      Ich habe mich auf dem Internet weiter informiert, wie man am besten ein Irrgarten löst( z.B. Rechte_Hand_Regel, Trémaux-Algorithmus etc.) jedoch wollte ich diese Theorie in die Praxis umsetzen, scheiterte jedoch bei den einfachsten Dingen. Meine Frage ist, was die "beste Art" ist, wie eine computergesteuerte Figur reagieren soll, wenn diese auf eine Abzweigung oder in eine Sackgasse gelangt. Ich habe es zuerst versucht, dass die Figur bei einer Abzweigung auf ein Objekt gelangt, und dann die Richtung wählen kann. Jedoch scheiterte ich auch hier, da ich recht unerfahren bin und mich auch auf Drag & Drop stütze (da es mir eher um den Inhalt, als um die Programmiersprache geht, wäre ich dankbar, falls mir jemand helfen könnte, dies in Drag & Drop zu lösen). Ich weiss nicht, was die einfachste Methode ist, wie diese Figur die Richtung wählen sollte. Ich habe es bis jetzt mit "Check Collision" und Check empty" versucht, jedoch wie schon erwähnt, erfolglos....

      Danke und bei Fragen einfach melden,ich bin mir sicher, dass mein Problem noch nicht wirklich ganz klar ist....Freakkong
    • Du wirst um eine effiziente Irrgarten Lösung zu kommen wasl aug code zurückgreifen müssen, weil du mit DnD keine Datenstrukturen erstellen kannst die dein Algorythmus zum lösen verwenden kann.
      Prinzipiell aber brauchst dein Objekt eine Variable die die 4 Richtungen hält und eine die angibt wieviele offene wege es gibt. Dann kann dein object jeden step in alle richtungen scannen und die variable hochzählen lassen die angibt wieviele wege es gibt. wenn es mehr als 2(vorwärts, rückwärts) gibt, dann kannst du dein object entscheiden lassen ob es abbiegt oder nicht. Wenn es nur 1 gibt(Sackgasse) dann muss du es umdrehen lassen.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • danke schon mal für die Antwort!:) Also heisst das, dass es mit DnD nicht möglich ist, ein einfaches Irrgartensystem zu lösen( mit einfach ist gemeint, dass die Figur nie im Kreis gehen wir, da es keine Säulen hat, welche nicht mit den anderen Wänden verbunden sind und der Ein- und Ausgang mit den Aussenwänden verbunden sind.)? Das Problem liegt eben noch tiefer, da ich nicht weiss, wie ich diese Wege nach deren Offenheit scannen kann....
    • hier vielleicht hilft dies noch zur Erklärung meines Problems. Dieser Lösungsansatz hat nicht mal ansatzweise funktioniert... Die Figur geht durch die Wand, obwohl die Collision zu dieser wand getestet wird.
      Bilder
      • programm irrgarten hilfe.PNG

        12,28 kB, 795×389, 346 mal angesehen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Freakkong ()

    • Du hast auch 2x else drinnen und das zweite else wäre theoretisch ja wieder das if "there is an object". Also jedenfalls kannst du für ein if nur ein else schreiben und nicht zwei.
      mit scannen meine ich aber genau so eine abfrage. Also das geht schon in DnD aber es ist sehr umständlich.

      Also wie oben beschrieben brauchst du ungefähr so etwas:
      :action_iffree: x+32, y
      :action_begin:
      :action_ifvariable: direction not 0
      :action_begin:
      :action_variable: wege += 1
      :action_end:
      :action_end:
      :action_iffree: x-32,y
      :action_begin:
      :action_ifvariable: direction not 180
      :action_begin:
      :action_begin:
      :action_variable: wege += 1
      :action_end:
      :action_end:
      etc in alle 4 richtungen
      direction muss die richtung in grad angeben, in der du grade unterwegs bist, wenn du also nach rechts(0) unterwegs bist, dann kann er die abfrage ignorieren ob dort der weg frei ist. Wenn dann wege größer als 2 ist dann gibt es mindestens eine abzweigung. direction kann also +90 oder -90 gerechnet werden und er soll dann in diese richtung gehen. Mit move free und direction als variable.
      :action_move2: direction

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • ich habe mal deine Idee näher angeschaut und so in der Art umgesetzt xD jedoch denk ich dass sich hier noch ein Banaler Fehler eingeschlichen hat und ich vergeblich danach gesucht habe:/
      einmal nach rechts und nach unten. Ich werde es schliesslich noch nach oben machen. Jedoch wenn diese zwei schon nicht funktionieren, lohnt es sich auch noch nicht, das "nach oben" zu machen.

      Bei dem ganz unten "if there is an object in position" habe ich NOT angekreuzt-. Bei jeder Dieser IF Abfragehabe ich das Objekt angegeben, mit dem es nicht kollidieren darf. Nach meinen Beobachtungen liegt der Fehler da, dass wenn der Charakter nach rechts geht, müsste er nach unten gehen. Jedoch setzt die "nach Unten" schleife schon ein und der Charakter geht wieder zurück. Ich habe also einen Fehler gemacht, dass der Computer diese nicht als zwei VERSCHIEDENE Schleifen annerkennt ich weiss leider nicht wie ich das lösen sollte:D (wie es aussieht ist die Idee ja hier aber irgend etwas banales aber trotzdem wichtiges fehlt;))
      Bilder
      • nach rechts.PNG

        12,5 kB, 316×602, 276 mal angesehen
      • nach unten.PNG

        13,55 kB, 501×599, 297 mal angesehen
    • COMMENT: nach rechts schauend
      if Richtung is not equal to 0
      exit this event
      else
      if Richtung is equal to 0
      if at position (x+10,y) there is object obj_Wand_Check
      set speed to 6 and direction to 270
      set variable Richtung to 1
      else
      if at position (x,y) there is object obj_Wand_Check
      set speed to 6 and direction to 90
      set variable Richtung to 2
      else
      if at position (x,y) there is not object obj_Wand
      exit this event
    • Ist jetzt zwar etwas Offtopic, aber in dem Tutorial von Heartbeast zeigt er wie es im GameMaker mit den In-Funktionen es auch möglich wäre, dass ein Objekt durch ein Labyrinth ein Ziel findet. Ich weiss zwar nicht ob es auch riesengrosse und stark verwinkelte Irrgarten lösen kann, aber ich werd's mal ausprobieren :)



      Was halt Doof ist, es ist ohne Drag&Drop.
      huhu
    • Wie wahr! höhö :troll:

      Btw : das Tutorial funktioniert super, egal wie riesig der Irrgarten ist, solange es einen Weg gibt, der findet es.
      Also Freakkong wenn du so was brauchst für dein Projekt, dass deine Figur immer den Ausgang findet, mit dem hast du es - und dazu echt einfach. ;)
      huhu

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Brodi ()

    • /// nach rechts schauend
      if direction is equal to 0
      set speed to 6 and direction to 90
      set variable direction to 90
      if position (x,y) is collision free for Only solid objects
      exit this event
      else
      set speed to 6 and direction to 270
      set variable direction to 270

      im Grunde funktioniert alles nur dass collision free Check nicht funktioniert und somit das else gar nie in Aktion tritt... Habe das Tutorial schon gesehen;) aber danke:). Ich weiss das programmieren einfacher wäre, jedoch fehlt mir die Zeit, dies auch noch zu erlernen. Und wurde eben son in das Programm eingeführt. Ich schreibe eine Arbeit, wo ich Computergegner untersuche, wobei dies mir helfen sollte Algorithmen zu verstehen erkläre jetzt hier nicht alles:D und nach dem was ich schon gesehen habe, fuktioniert Drag & drop recht gut ... natürlich greife ich auch ab und zu auf Codes zurück jedoch wenn es klappt, bevorzuge ich D&D:/ doch ich denke zuerst sollte ich wohl möglich den D& Drop genug verstehen können bevor ich mich an die Codes wage. und offensichtlich hbe ich gamemaker noch nicht ganz verstanden und hänge an diesem kleinen Fehler:/

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

    • wenn ich das jetzt so mal schnell überfliege, sehe ich, dass auf x,y wahrscheinlich nichts drauf, aber vor dem Objekt, welches das abfragt, ist.
      im Code kann man das so lösen:

      GML-Quellcode

      1. if(place_free(x+lengthdir_x(5,direction),y+lengthdir_y(5,direction)))
      2. exit;
      3. //...

      Ich empfehle dir natürlich Code zu verwenden ^^

      Umständlich, aber möglich, du lässt dein Objekt in direction laufen, machst collision check und läufst die pixel aber wieder zurück
      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
    • Jetzt habe ich das Problem auch bemerkt! der Charakter ist immer noch in Berührung mit der Wand und kann somit die nächste Aktion gar nicht durchführen. ich habe es mit Jump to Position versucht, damit er weg von der Collisionzone des Charakters kommt, jedoch hat dies auch nicht geklappt, da ich es nur schaffe, dass der Charakter relativ x+20,y+20, dabei bräuchte ich eigentlich y-20, x-20. Gibt es auch eine andere Methode?
    • Hast du schon versucht einfach negative Werte einzugeben?
      +- ergibt -
      also einfach -20 bei x und selbe bei y eingeben ;)
      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
    • Freakkong schrieb:


      Ich weiss das programmieren einfacher wäre, jedoch fehlt mir die Zeit, dies auch noch zu erlernen. Und wurde eben son in das Programm eingeführt. Ich schreibe eine Arbeit, wo ich Computergegner untersuche, wobei dies mir helfen sollte Algorithmen zu verstehen erkläre jetzt hier nicht alles:D und nach dem was ich schon gesehen habe, fuktioniert Drag & drop recht gut ... natürlich greife ich auch ab und zu auf Codes zurück jedoch wenn es klappt, bevorzuge ich D&D:/ doch ich denke zuerst sollte ich wohl möglich den D& Drop genug verstehen können bevor ich mich an die Codes wage. und offensichtlich hbe ich gamemaker noch nicht ganz verstanden und hänge an diesem kleinen Fehler:/


      Ich kann dich da absolut verstehen.
      Ich habe damals noch vor vielen Jahren meine erste Erfahrungen in der "Programmierung" mit dem RPG-Maker2k gemacht. Alles Drag&Drop und trotzdem konnte ich vieles verschiedenes erstellen, wie zum Beispiel ein actionreiches Zelda-Game mit all seinen coolen Gadgets. Der RPG-Maker war echt klasse für Spiele in diesem begrenzten rahmen, aber der Game-Maker hat da verdammt viel mehr zu bieten mit seiner übersichtlicher eigenen Programmiersprache (GML) - das ist meiner eigenen Meinung nach einer der einfachsten Weg in die Welt der Gamer-Programmiersprache zu wechseln. Darum rate ich Dir es zu versuchen! Ich lege Dir ganz fest ans Herz die Tutorials von Heartbeast einmal anzuschauen, du findest ihn auf Youtube sowie auf Udemy (sehr empfehlenswert!) - seine Kurse sind verdammt gut und werde sicherlich auch dir schmackhaft machen Blut in die GML-Programmierung zu lecken.
      huhu
    • ich habe mir ein paar Tutorials angeschaut und bin auf Codes umgestiegen:D
      jedoch habe ich immer noch das gleiche problem, wollte dies aber mit dem oben stehenden Code lösen

      GML-Quellcode

      1. if(place_free(x+lengthdir_x(5,direction),y+lengthdir_y(5,direction)))
      2. exit;

      kann mir jemand gennau den Code erklären:/?
      damit ich auch weiss, was dieser bedeutet und wo ich ihn anwenden kann.

      momentan siehts so aus aber das klappt auch nicht xD

      GML-Quellcode

      1. if direction = 0
      2. {
      3. if(place_free(y+lengthdir_y(5,direction),x(5,direction)))
      4. direction = 90
      5. speed = 6
      6. exit;
      7. }
      8. else
      9. {
      10. direction = 270
      11. speed = 6;
      12. }
      Alles anzeigen


      ich weiss das es falsch ist, jedoch will ich zeigen, dass ich nicht weiss, wo ich dies integrieren sollte....
    • der Code oben beendet das Event, wenn in der Richtung direction 5 Pixel weiter, kein Objekt mit der Eigenschaft solid ist.

      In deinem zweiten Code ist die 3. Zeile wahrscheinlich falsch:

      GML-Quellcode

      1. ​if(place_free(y+lengthdir_y(5,direction),x(5,direction)))

      sollte doch so sein:

      GML-Quellcode

      1. ​if(place_free(x+lengthdir_x(5,direction),y+lengthdir_y(5,direction)))

      ;)
      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
    • ay wollte eigentlich nur

      GML-Quellcode

      1. if(place_free(x,y-lengthdir_x(5,direction)))

      und bei y ist es minus, da es ja nach oben testen soll... oder macht das keinen unterschied?

      da es nur nach y testen sollte, ob dort etwas ist, da die Fugur ja schon nach x mit der Wand kollidiert ist.
      jedoch auch dann geht der Charakter nach oben und kollidiert mit der Wand, obwohl er nach unten müsste... die Fugur habe ich 59 pixel eingestellt und hat abstand zur Wand genau 4 pixel

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

    • ich versteh noch nicht genau die Denkweise, aber statt lengthdir_x sollte es doch eher lengthdir_y heißen ;)
      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