KI Snake



  • Ich hab mir ein auf Kommandokonsole basierendes Snake geschrieben und dafür auch ne KI (bitte nicht fragen warum) und mein Problem ist wie bring ich der KI bei sich nicht selbst zu fressen also die richtung um 180°zu ändern sondern nur um 90° ich hab das Programm recht einfach mit gotoxy () geschrieben und bin noch anfänger also bitte eine "Idotensichere" Lösung wenn möglich



  • enum Move
    {
        STRAIGHT,
        LEFT,
        RIGHT
    };
    
    Move ki_calc_move ()
    {
        ...
    }
    

    So kann die KI jeden Zug nur entweder weiter in die bisherige Richtung fahren oder entweder nach links oder rechts abbiegen.

    Ansonsten: Es reicht auch einfach eine Überprüfung:

    if(richtung == UP && neueRichtung == DOWN)
        notallowed...
    

    MfG SideWinder



  • Am besten wäre einfach immer ein zufälliges Ziel auf dem Feld suchen und dann per Wegfindung auf einem freien Pfad dahin fahren. Gibt es was zum einsammeln, fährt man natürlich da hin.

    Bye, TGGC (Fakten)



  • TGGC schrieb:

    Am besten wäre einfach immer ein zufälliges Ziel auf dem Feld suchen und dann per Wegfindung auf einem freien Pfad dahin fahren. Gibt es was zum einsammeln, fährt man natürlich da hin.

    Bye, TGGC (Fakten)

    In Snake gibt es doch immer was zum einsammeln. Wenn man eins nimmt, kommt direkt das nächste.



  • xindon schrieb:

    TGGC schrieb:

    Am besten wäre einfach immer ein zufälliges Ziel auf dem Feld suchen und dann per Wegfindung auf einem freien Pfad dahin fahren. Gibt es was zum einsammeln, fährt man natürlich da hin.

    Bye, TGGC (Fakten)

    In Snake gibt es doch immer was zum einsammeln. Wenn man eins nimmt, kommt direkt das nächste.

    Ich denke er meint darüberhinaus die Boni, Kirsche und sowas... 😉



  • xindon schrieb:

    TGGC schrieb:

    Am besten wäre einfach immer ein zufälliges Ziel auf dem Feld suchen und dann per Wegfindung auf einem freien Pfad dahin fahren. Gibt es was zum einsammeln, fährt man natürlich da hin.

    Bye, TGGC (Fakten)

    In Snake gibt es doch immer was zum einsammeln. Wenn man eins nimmt, kommt direkt das nächste.

    Wo ist das Gesetz, das es ohne Einsammeln nicht Snake heissen darf?

    Bye, TGGC (Fakten)


  • Mod

    TGGC schrieb:

    Wo ist das Gesetz, das es ohne Einsammeln nicht Snake heissen darf?

    oder Quake5, also die dinger ohne einsammel nenn ich grundsätzlich Q5.



  • TGGC schrieb:

    Wo ist das Gesetz, das es ohne Einsammeln nicht Snake heissen darf?

    *DAS* ist das Gesetz!! 🤡 👍



  • Also eigentlich gibt es bi mir schon was zum aufsammeln aber wenn das nun genau hinter der schlange liegt dreht die bei wegfinder automatisch um 180 um.

    Ich hätte es besser erklären solln:

    Die KI schlange soll nichts fressen sondern nur als "mobile Wand" unterwegs sein die die schwierigkeit erhöht. Ich habe das Spiel mit meinem basiswissen der struktorierten Programmierung geschrieben (d.h. der erste Beitrag: Bahnhof) ich lenke die Schlange mit gotoxy über den screen und die KI sollte das auch so machen.
    Im moment Besteht meine Schlange aus zwei Arrays einer für die einer ür die y koords die in einer Schleife als xy für die gotoxy genommen werden. Das sieht dan so aus:

    //Zeichnen der Schlange
        for (l=0; l<=Laenge; l++){
          gotoxy (x[l], y[l]);
          cprintf("o\b");
          }
    

    Die KI müsste in die gleiche Schleife damit die synchron arbeiten.

    Die nicht KI Schlange hab ich so gesteuert:

    if (kbhit()){
          richtung = getch();
          if (richtung ==  97) ; else;
          if (richtung == 100) ; else;
          if (richtung == 115) ; else;
          if (richtung == 119) ; else;
          }
        else;
        if (richtung ==  97) rx--; else;
        if (richtung == 100) rx++; else;
        if (richtung == 115) ry++; else;
        if (richtung == 119) ry--; else;
    

    Das hab ich mal reingeschrieben um einen ungefähren einblick ins prog zu verschaffen. Ich hoffe jetzt ist mein Problem deutlich genug geschildert



  • Hab vergessen zu sagen das es eine KONSOLENANWENDUNG ist



  • Der_Einzige schrieb:

    Also eigentlich gibt es bi mir schon was zum aufsammeln aber wenn das nun genau hinter der schlange liegt dreht die bei wegfinder automatisch um 180 um.

    Wieso sollte er das tun? Dort ist doch ei Hindernis (die Schlange) und die Wegsuche ist grad dazu da, diese zu umgehen.

    Bye, TGGC (Fakten)



  • Der_Einzige schrieb:

    Also eigentlich gibt es bi mir schon was zum aufsammeln aber wenn das nun genau hinter der schlange liegt dreht die bei wegfinder automatisch um 180 um.

    Eigentlich kann man bei keinem Snake 180° wenden... 😕

    Das solltest Du schon abprüfen, sowohl beim Spieler, als auch bei der KI.

    Der_Einzige schrieb:

    if (kbhit()){
          richtung = getch();
          if (richtung ==  97) ; else;
          if (richtung == 100) ; else;
          if (richtung == 115) ; else;
          if (richtung == 119) ; else;
          }
        else;
        if (richtung ==  97) rx--; else;
        if (richtung == 100) rx++; else;
        if (richtung == 115) ry++; else;
        if (richtung == 119) ry--; else;
    

    Was sollen die ganzen leeren if-Abfragen?! 😕
    Wenn richtung == 97 Dann -> Mache nichts. Ansonsten -> Mache nichts. 😕

    Mache halt sowas:

    #define HOCH 1
    #define RUNTER 2
    #define LINKS 4
    #define RECHTS 8
    
    unsigned char aktuelleRichtung;
    unsigned char gewuenschteRichtung;
    unsigned char input;
    
    /* Eingabe holen und daraus die neue gewünschte Richtung interpretieren */
    if (kbhit()){
        input = getch();
        if (input ==  97) gewuenschteRichtung = LINKS;
        if (input == 100) gewuenschteRichtung = RECHTS;
        if (input == 115) gewuenschteRichtung = RUNTER;
        if (input == 119) gewuenschteRichtung = HOCH;
    }
    
    /* Die aktuelle Richtung nur ändern, wenn gewünschte Richtung nicht 180° zu aktuelle Richtung steht */
    if (gewuenschteRichtung == LINKS && aktuelleRichtung != RECHTS
        || gewuenschteRichtung == RECHTS && aktuelleRichtung != LINKS
        || gewuenschteRichtung == RUNTER && aktuelleRichtung != HOCH
        || gewuenschteRichtung == HOCH && aktuelleRichtung != RUNTER)
        aktuelleRichtung = gewuenschteRichtung;
    
    /* Die Position entsprechend der aktuellen Richtung updaten */
    switch (aktuelleRichtung){
        case LINKS  : rx--; break;
        case RECHTS : rx++; break;
        case RUNTER : ry++; break;
        case HOCH   : ry--; break;
    }
    


  • TGGC schrieb:

    Der_Einzige schrieb:

    Also eigentlich gibt es bi mir schon was zum aufsammeln aber wenn das nun genau hinter der schlange liegt dreht die bei wegfinder automatisch um 180 um.

    Wieso sollte er das tun? Dort ist doch ei Hindernis (die Schlange) und die Wegsuche ist grad dazu da, diese zu umgehen.

    Bye, TGGC (Fakten)

    mit einem 0815 Wegfindungsalgorithmus kommste aber nicht weit, da die Hindernisse sich ja bei jeder Bewegung verändern. D.h. dein gefundener "optimaler" Weg, ist nicht mehr optimal. Außerdem kann es passieren, dass er überhauptkeinen Weg findet, obwohl eine Möglich ist (da die Hindernisse eben nicht statisch sind)..



  • life schrieb:

    mit einem 0815 Wegfindungsalgorithmus kommste aber nicht weit, da die Hindernisse sich ja bei jeder Bewegung verändern.

    Ist ja auch so schwer, wenn der Weg blockiert wird ihn neu zu berechnen...

    Bye, TGGC (Fakten)



  • @Sgt. Nukem

    Ich werds mal probieren.

    Und noch n detail am Rande was ist ein Wegfindungsalgorithmus???



  • Der_Einzige schrieb:

    Und noch n detail am Rande was ist ein Wegfindungsalgorithmus???

    LOL 😃
    Was könnte der Name wohl bedeuten?



  • Also es hat prima geklapt das sie sich nicht selbst fressen kann nur mein problem ist eigentlich noch da denn ich wollte ja ne KI die selbstständig fährt, aber trotzdem Danke ich glaub den Rest krieg ich allein hin.

    mfg bauarbeiterjoe



  • ok ich hab mir hier die posts durchgelesen aber ich verstehe eins nicht: du hast ein snake konsolen spiel programmiert wobei die schlange gleichzeitig vom spieler und von der ki bewegt wird 😕



  • So ähnlich also:

    Ich steuere eine Schlange UND die KI steuert ire eigene Schlange also insgesamt 2 Schlangen die KI soll nur rumfahren und als Hinderniss dienen. Und was ein Wegfinde... Kann ich mir vortellen aber eigentlich meinte ich das ich nicht weiss wie ich so was schreibe (Befehle, QT)



  • // Gegeben:
    int snake_x; // X-Pos der KI-Schlange
    int snake_y; // Y
    int p_x; // Der gewünschte Ort (neues zum Einsammeln)
    int p_y;
    
    int diff_x = p_x - snake_x; // Der Abstand zwischen Punkt und Schlange ( >0 -> Punkt ist rechts, <0 -> Punkt ist links )
    int diff_y = p_y - snake_y; // ( >0 -> unten)
    
    if(abs(diff_x) > abs(diff_y)) // Der Abstand auf der X-Achse ist größer, also sollte die Schlange erstmal links/rechts fahren, nicht hoch/runter
       diff_x > 0 ? KI_gewuenschteRichtung = RECHTS : KI_gewuenschteRichtung = LINKS;
    else
       diff_y > 0 ? KI_gewuenschteRichtung = RUNTER : ,,,
    

Anmelden zum Antworten