Wegfindefunktion mit Hindernissen



  • Um auf die eigentliche Frage zurueckzukommen: Was fuer eine random-Funktion verwendest Du? Wenn ich 'man random' eingebe, gibt es random nur ohne Argumente, die einen int zurueckgibt. Auf der man-page von rand steht dann auch geschrieben, wie man sinnvoll Zufallszahlen zwischen 1 und 4 generiert:
    richtung = 1+ (int)(4.0*rand()/(RAND_MAX+1.0));

    Hast Du schonmal ausgeben lassen, welche Zufallszahlen bei Dir generiert werden?

    Noch ein Tip: Wenn Du die Richtungen als Makro definierst, kannst Du sie ja auch im Code einsetzen, oder?



  • ne so hab ich das noch nie gemacht ich habs so gemacht: richtung = random(3)+1;
    so krieg ich 1-4 raus.



  • Hast Du denn schonmal in dem Pacman code ausgeben lassen, ob die Aktionen mit den generierten Zahlen uebereinstimmen? Laesst sich doch recht leicht mit einem
    std::clog << richtung << '\n';
    Vor der switch-Anweisung rausfinden.



  • Da tritt nur n kleines Problem auf ich hab nähmlich nicht den hauch einer anhnung was das std::.... heissen soll



  • bauarbeiterjoe schrieb:

    Da tritt nur n kleines Problem auf ich hab nähmlich nicht den hauch einer anhnung was das std::.... heissen soll

    Tut mir leid, das ist C++. Habs Forum verwechselt.
    Also eher sowas wie
    printf("Richtung: %d\n", richtung);



  • Die Richtung stimmt aber ich brauch ne Funktion damit er einen Weg abfahren kann.



  • Deine switch-Anweisung sieht, zumindest, wenn man nur den CodeAusschnitt betrachtet, den Du uns geschickt hast, nicht korrekt aus, zum Beispiel:

    case 10 : if(Spielfeld[gy]  [gx-2] != 2) gx--; break;
    

    1. Punkt, Die Indizes fuer das Feld:
    Deiner 'random' Anweisung nach ist das aktuelle Feld gegeben durch
    Spielfeld[gy-1][gx-20]. Solltest Du dann nicht auch in den case's von diesen
    Koordinaten ausgehen, also in etwa

    case 10 : if(Spielfeld[gy-1]  [(gx-20)-1] != 2) gx--; break;
    

    2. Punkt: Wenn das Zielfeld eine Mauer ist, was passiert dann? Solltest Du dann nicht dafuer sorgen, dass eine andere Richtung eingeschlagen wird? Es wird aus dem Code nicht deutlich, dass dies geschieht.



  • Da hast du recht.

    Ich hab jetzt mal meine ganzen Grauen Zellen zusammengeworfen und folgendes kamm raus:

    Die Funktion sollte ausgehend von der position der KI das nächste Feld mit einer 4 drin ansteuern. d.h. Es müsste in alle vier Richtungen prüfen wie weit es bis dahin ist und dann zufällig eine Route wählen. die Koordinaten des genauen Weges sollen in ein 2 dim array stehen. Und dann soll er einfach immer zur nächsten Routenposition Gehen dort beginnt das ganze wieder von vorne. So hab ich kein problem mehr mit den Mauern.

    meine Idee sieht so aus:

    [code]
    bool berechnet=0;
    int Grich;
    int Weg, WegL, WegR, WegU, WegO;
    i=0;
    if(berechnet==0){
    while (true){
    if(Spielfeld[gy-1] [gx-20-i] != 4) WegL++;//Weg nach Links erhöhen
    if(Spielfeld[gy-1+i][gx-20] != 4) WegU++;//Weg nach Unten erhöhen
    if(Spielfeld[gy-1] [gx-20+i] != 4) WegR++;//Weg nach Rechts erhöhen
    if(Spielfeld[gy-1-i][gx-20] != 4) WegO++;//Weg nach Oben erhöhen
    i++;
    }//while
    berechnet=1;
    Grich = random(3)+1;
    switch(Grich){
    case 1 : Weg=WegL; break;
    case 2 : Weg=WegU; break;
    case 3 : Weg=WegR; break;
    case 4 : Weg=WegO; break;
    }//switch
    }//if(berechnet==0)

    Nur irgendwie hab ich keinen Plan wie ich die Route in meinen arry reinspeichere.



  • Du solltest in der switch(Grich)-Anweisung auf jeden Fall deine Position korrigieren (indem du gx und gy je nach Richtung um die Weg*-Werte erhöhst/veringerst):

    switch(Grich){ 
    case 1 : Weg=WegL; gx-=WegL; break; 
    case 2 : Weg=WegU; gy+=WegU; break; 
    case 3 : Weg=WegR; gx+=WegR; break; 
    case 4 : Weg=WegO; gy-=WegO; break; 
    }//switch
    

    (und um die Route mitzuschreiben, brauchst du ein entsprechend großes Array von (z.B.) "struct pos{int x,y;};", in das du in jedem Schritt die Zwischenpositionen einträgst)



  • Danke die Idee mit struct ist gut die werd ich gleich probieren.


Anmelden zum Antworten