Pac Man und die Geister

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

  • Pac Man und die Geister

    Hallo an ALLE :)

    Hab ein kleines KI-Problem.
    Hab für mich aus Spaß Pac_Man nachprogrammiert um besser mit dem GM um gehen zu können.
    Aber jetzt bleib ich hängen.
    Das Spiel läuft ja so ohne Problem, nur die Geister wollen nicht so wie ich gern das möchte.
    Hab zwar die Geister per Zufalls Richtung gecodet aber das ist mehr Recht als Schlecht. Sobald ich die Geister fresse und sie erscheinen wieder in der Mitte des Labyrinth, kommen sie einfach nicht mehr heraus. Sie fahren immer nur das Viereck ab.
    Habe es mit mp_grid_path versucht, aber da bleiben die Geister an den Wände stehen. Was ich nicht ganz nachvollziehen kann. Da ich es ja im Spiel schon verwende. Für die Auge der Geister. Sobald ich die Geister esse, erscheinen ihre Augen und sie suchen sich einen Weg um in die Mitte des Labyrinth zu kommen. Was auch sehr gut funzt. Jetzt wollte ich es noch für die Geister verwenden, aber das ging in die Hose.
    So jetzt hoffe ich das jemand einen Rat weis, wie ich die Geister am besten programmieren kann, damit sie Pac Man das Leben schwer machen können. ?(
    Ich hänge das Spiel mit dran, damit ihr es sehen könnt.

    P.S.
    Hab bevor ich hier geschrieben habe auch schon sie Suchfunktion verwendet, hab aber in dieser Richtung nicht brauchbares gefunden. Das Spiel funktioniert bis auf die Tatsache das die Geister in der Mitte bleiben sobald ich sie gegessen habe.

    Gruss euer Drachen
    Dateien
    • Pac-Man.rar

      (644,12 kB, 139 mal heruntergeladen, zuletzt: )
  • Ich kann da nur empfehlen, unter den Ausgang des Innenraumes ein kleines Marker-Objekt zu setzen. Wenn die Geister nun ein Geist mit diesem Objekt kollidiert, wird ein Zufallswert ermittelt. Wenn dieser nun kleiner ist als ein bestimmter Prozentsatz, setzt du die Richtung (direction) des Geistes auf 90 (oben).
    Also muss dieser Code im Collision-Event des Geistes mit dem Marker ausgeführt werden:
    (Das ceil kannst du natürlich auch weglassen )

    GML-Quellcode

    1. {
    2. prob = 10;
    3. if( ceil(random(100)) < prob ){
    4. direction = 90;
    5. }
    6. }


    Du kannst aber auch einen Zufallswert ermitteln und diesen bei einer Kolision um 1 dekrementieren (verringern). Wenn dieser Wert bei einer Kolision 0 erreicht, wird die direction auf 90 gesetzt. Aber ich denke mal, ich muss das nicht weiter erläutern ^^

    Sorry, wenn das nicht auf dein Spiel passt, ich hab leider keinen GM7... Aber ich denke mal, der Code lässt sich trotzdem verwenden ;)
  • Du könntest es mit path lösen.

    Du suchst per Zufall eine Zelle aus, in der keine Wand ist, und erstellst einen path von der aktuellen Monster-Position zu dieser Zufalls-Zelle.
    Wenn das Monster sein Zeil erreicht hat, wiederholt sich das ganze.

    Zusammengefasst:
    - Zufalls-Zelle
    - path zur Zufalls-Zelle von der aktuellen Position
    - wenn die Ziel-Zelle erreicht wurde, alles wieder holen

    cya,
    swffilms

    P.S.: Ich hoffe das ist verständlich ;)
  • Also ich versuche den Vorschlag von swffilms in die Tat um zu setzten.

    Habe mir folgende Routine aus gedacht:

    Irgendwo im Labyrinth wird ein Objekt gesetzt. Wenn dieser in einer Wand landet, soll dieses wieder gelöscht werden und frisch gesetzt werden. Dieses soll so lange ausgeführt werden, bis es keine Wand mehr trifft.
    Soweit die Theorie.
    Und hier der Code:

    GML-Quellcode

    1. /////////////////////////////////////////
    2. // Hilfspunkte für Geister setzen //
    3. /////////////////////////////////////////
    4. // argument 0 = Objekt zum setzen
    5. {
    6. var pos_x, pos_y, ins_ID;
    7. pos_x = random(room_width);
    8. pos_y = random(room_height);
    9. if (pos_x>32 || pos_x<room_width-64 && pos_y>64 || pos_y<room_height-(5*32)) // Labyrinthgrösse
    10. {
    11. ins_ID=instance_create(pos_x,pos_y,argument0);
    12. }
    13. // Schleife solang wiederhohlen bis keine Wand getroffen wird
    14. while (ins_ID.place_meeting(pos_x,pos_y,obj_Wand))
    15. {
    16. instance_destroy(ins_ID);
    17. pos_x = random(room_width);
    18. pos_y = random(room_height);
    19. if (pos_x>32 || pos_x<room_width-64 && pos_y>64 || pos_y<room_height-(5*32)) // Labyrinthgrösse
    20. {
    21. ins_ID=instance_create(xx,yy,argument0);
    22. }
    23. }
    24. return ins_ID // Rückgabewert
    25. }
    Alles anzeigen


    Wenn ich das Script testen lasse kommt folgende Fehlermeldung:
    Error at line 15 pos 20: Variable name expected

    Das wäre genau in der Kommentarzeile. ?(
    Jetzt habe ich schon einiges probiert um den Fehler heraus zu bekommen. Aber leider ohne Erfolg.
    Jetzt kann ich nur hoffen das mir hier einer Helfen kann.

    Gruss euer Drachen
    P.S.
    Hoffentlich ist es nicht wieder so ein Klammerfehler
  • Ich weiß jetzt nicht, ob das die Lösung des Problems ist, aber woher nimmst du die Variable xx,yy bei instance_create ?
    Müsste da nicht pos_x,pos_y hin?

    Außerdem darf das nicht so aussehen: instance_destroy(ins_ID)
    sondern so:
    with (ins_ID)
    {
    instance_destroy()
    }

    Außerdem funktioniert das while(ins_ID.place_meeting(pos_x,pos_y,obj_Wand)) so nicht... ich kann aber momentan keinen Lösungsvorschlag machen, weil ich am falschen PC dafür bin...

    Ich kann dir nur sagen, probier mal, das so zu machen, dass die while-Schleife sich in einem With-Statement befindet...
  • Hi Tobi

    Das mit der Variabel xx,yy bei Instance_create war ein verschreiber. Du hast natürlich recht es müsste pos_x, pos_y dort stehen.
    Werde es mal versuchen was du vorgeschlagen hast. Weis zwar nicht ob ich es hin bekokmme, da ich im Grunde ja eine Schleife brauche, die so lange ausgefürhrt werden soll, bis das Objekt einen freinen Platz hat. Aber heute werde ich das jetzt nicht mehr probieren.
    Kam erst ziemlich spät nach Hause. Aber im laufe des Tages werde ich mich dran setzten.

    Gruss Drachen :S
  • So jetzt habe ich es mal getestet mit with ....

    ums es gleich vor weg zu nehmen, er zeigt mir zwar jetzt keine Fehlermeldung mehr, aber die Instance wird trotzdem in Wand reingesetzt. Muss wohl noch einen groben Denkfehler in meinen Script haben.
    Hier der geänderte Code. Vielleicht weis ein Rat, wo der Denkfehler ist. :headtouch:

    GML-Quellcode

    1. // argument 0 = Objekt zum setzen
    2. {
    3. var pos_x, pos_y, ins_ID;
    4. pos_x = random(room_width);
    5. pos_y = random(room_height);
    6. if (pos_x>32 && pos_x<room_width-64 && pos_y>64 && pos_y<room_height-(5*32)) // Labyrinthgrösse
    7. {
    8. ins_ID=instance_create(pos_x,pos_y,argument0);
    9. }
    10. else // nur setzen wenn außerhalb vom Labyrinth
    11. {
    12. pos_x = 32;
    13. pos_y = 96;
    14. ins_ID=instance_create(pos_x,pos_y,argument0);
    15. }
    16. // Schleife solang wiederhohlen bis keine Wand getroffen wird
    17. with (ins_ID)
    18. {
    19. while (place_meeting(pos_x,pos_y,obj_Wand))
    20. {
    21. instance_destroy();
    22. pos_x = random(room_width);
    23. pos_y = random(room_height);
    24. if (pos_x>32 && pos_x<room_width-64 && pos_y>64 && pos_y<room_height-(5*32)) // Labyrinthgrösse
    25. {
    26. ins_ID=instance_create(pos_x,pos_y,argument0);
    27. }
    28. }
    29. }
    30. return ins_ID // Rückgabewert
    31. }
    Alles anzeigen


    Gruss euer Drachen
  • Hi ich bin es noch mal.

    Werde das Thema für mich jetzt abschließen. Habe glaube ich einen anderen Weg gefunden. Muß darüber aber noch ein paar Informationen sammel. Wenn ich was gefunden habe werde ich ein neues Thema erstellen.
    Bis dahin alles Gute und vielen Dank für euer Rat ;)

    Gruß Drachen