Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 23-08-2004, 10:49   #1 (permalink)
Duftbäumchen
 
Benutzerbild von derDan
 
Registriert seit: Jan 2004
Beiträge: 213
A* fuer Packman

Nachdem meine Idee den Packman Monstern KI zu verpassen belaechelt wurde, hab ich einem von ihnen zumindest mal den A* spendiert. Der naechste Schritt waere dann jedem der Agenten eine unterschiedliche Zelle als moegliches Spielerziel zuzuweisen (die naechsten Weggabeln halt). Vielleicht mach ich das irgendwann auch mal, hab nur grad echt keine Zeit mehr .

Na ja hier zumindest mal meine A* Implementierung,
vielleicht kann ja jemand von euch damit was anfangen.

PHP-Code:
class Astar {
    private var 
mcAgent:MovieClip;
    private var 
mcTarget:MovieClip;
    
//
    //
    //
    
private var arrOpen:Array;
    private var 
arrClose:Array;
    private var 
arrPath:Array;
    
//
    //
    //
    
private var actualCell:Cell;
    
//
    //
    //
    
function Astar(mcAgentmcTarget) {
        
this.mcAgent mcAgent;
        
this.mcTarget mcTarget;
        
//
        //
        //
        
findNewTarget();
    }
    
//
    //
    //
    
function findNewTarget():Array {
        
this.mcTarget mcTarget;
        var 
tmpCell:Cell = new Cell(this.mcAgent._x/_root.cellWidththis.mcAgent._y/_root.cellWidth);
        
tmpCell.costG 0;
        
//
        //
        // underestimating H function
        
tmpCell.costH Math.floor(Math.sqrt(Math.pow((this.mcTarget._x/_root.cellWidth-tmpCell.coorX), 2)+Math.pow((this.mcTarget._y/_root.cellWidth-tmpCell.coorY), 2)));
        
tmpCell.costT tmpCell.costG+tmpCell.costH;
        
tmpCell.parent null;
        
//
        //
        //
        
this.arrOpen = new Array(tmpCell);
        
this.arrClose = new Array();
        
this.arrPath = new Array();
        
//
        //
        //
        
findPath();
        
//
        //
        //
        
return (this.arrPath);
    }
    
//
    //
    //
    
private function findPath():Void {
        var 
boolFound false;
        while (
this.arrOpen.length != 0) {
            if (
this.arrOpen[0].coorX == this.mcTarget._x/_root.cellWidth && this.arrOpen[0].coorY == this.mcTarget._y/_root.cellWidth) {
                
boolFound true;
                break;
            } else {
                
this.actualCell this.arrOpen[0];
                
this.arrClose[this.arrClose.length] = this.arrOpen.shift();
                
addStar();
            }
        }
        
//
        //
        //
        
if (boolFound) {
            
constructPath();
        }
    }
    
//
    //
    //
    
private function addStar() {
        
checkCoor(this.actualCell.coorXthis.actualCell.coorY-1);
        
checkCoor(this.actualCell.coorX+1this.actualCell.coorY);
        
checkCoor(this.actualCell.coorXthis.actualCell.coorY+1);
        
checkCoor(this.actualCell.coorX-1this.actualCell.coorY);
        
sortArrays();
    }
    
//
    //
    //
    
function checkCoor(coorX:NumbercoorY:Number) {
        
//
        //
        // ueberpruefen ob die Koordinate ueberhaupt auf der Karte liegt und ob wir nicht gerade daher kommen        
        
if (_root.map.hitTest(coorX*_root.cellWidth+_root.cellWidth/2coorY*_root.cellWidth+_root.cellWidth/2true) && !(coorX == this.actualCell.parent.coorX && coorY == this.actualCell.parent.coorY)) {
            
addNewCell(coorXcoorY);
        }
    }
    
//
    //
    //
    
private function addNewCell(coorX:NumbercoorY:Number) {
        
//
        //
        // 
        
var tmpCell:Cell = new Cell(coorXcoorY);
        
tmpCell.costG this.actualCell.costG+1;
        
tmpCell.costH Math.floor(Math.sqrt(Math.pow((this.mcTarget._x/_root.cellWidth-tmpCell.coorX), 2)+Math.pow((this.mcTarget._y/_root.cellWidth-tmpCell.coorY), 2)));
        
tmpCell.costT tmpCell.costG+tmpCell.costH;
        
tmpCell.parent this.actualCell;
        
//
        //
        // pruefen, ob die Zelle schon einmal vorkam und wenn ja, ob wir einen schnelleren Weg zu ihr gefunden haben
        
var boolFound:Boolean false;
        for (var 
0!= this.arrClose.lengthi++) {
            if (
this.arrClose[i].coorX == tmpCell.coorX && this.arrClose[i].coorY == tmpCell.coorY) {
                if (
this.arrClose[i].costG+this.arrClose[i].costH>tmpCell.costG+tmpCell.costH) {
                    
this.arrOpen[this.arrOpen.length] = tmpCell;
                    
this.arrClose.splice(i1);
                }
                
boolFound true;
            }
        }
        
//
        //
        // pruefen, ob Zelle schon in der Open Liste steht und wenn ja, ob wir einen schnelleren Weg zu ihr gefunden haben
        
if (!boolFound) {
            for (var 
0!= this.arrOpen.lengthi++) {
                if (
this.arrOpen[i].coorX == tmpCell.coorX && this.arrOpen[i].coorY == tmpCell.coorY) {
                    if (
this.arrOpen[i].costG+this.arrOpen[i].costH>tmpCell.costG+tmpCell.costH) {
                        
this.arrOpen[i] = tmpCell;
                    }
                    
boolFound true;
                }
            }
        }
        if (!
boolFound) {
            
this.arrOpen.unshift(tmpCell);
        }
    }
    
//
    //
    //
    
private function sortArrays() {
        
//
        //
        // kuerzesten Weg in Open Liste an den Anfang sortieren
        
this.arrOpen.sortOn("costT");
        
this.arrClose.sortOn("costT"2);
    }
    
//
    //
    //
    
private function constructPath() {
        var 
tmpCell:Cell this.arrOpen[0];
        
this.arrPath.unshift(tmpCell);
        
//
        //
        // Parent Zellen in richtiger Reihenfolge sammeln
        
while (tmpCell.parent != null) {
            
this.arrPath.unshift(tmpCell.parent);
            
tmpCell tmpCell.parent;
        }
    }

derDan
Angehängte Dateien
Dateityp: zip astarzip.zip (4,1 KB, 98x aufgerufen)

Geändert von derDan (23-08-2004 um 10:51 Uhr)
derDan ist offline   Mit Zitat antworten
Alt 23-08-2004, 11:00   #2 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
thanx for inspiration !!!

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 24-08-2004, 18:48   #3 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
andre hat auch schon den a* für flash bekömmlich gemacht
deine variante gefällt mir auch ganz gut.

hier der link zu andre
http://www.andre-michelle.com/files/...n/+pathfinder/
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 24-08-2004, 20:29   #4 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Das sieht gut aus.
Ich fände es trotzdem besser, wenn man dem Konstruktor keine MovieClips übergibt, sondern Tilekoordinatenpaare als Objekt, oder gleich als Viererkette.
Denn die Umrechnung in Tilekoordinaten hat meiner Meinung nach in der Klasse AStar nichts zu suchen.

Trotzdem gut!
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 24-08-2004, 20:51   #5 (permalink)
Duftbäumchen
 
Benutzerbild von derDan
 
Registriert seit: Jan 2004
Beiträge: 213
Macht Sinn. Frag mich warum ich das nicht schon so geloest hatte...
derDan ist offline   Mit Zitat antworten
Alt 25-08-2004, 10:27   #6 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Beim nächstenmal. Ich finde immer wieder, dass man seine Klassen in sinnvollere kleinere Komponenten zerlegen kann, damit es sauberer wird und wiederverwendbarer.

Übrigens, ein AStar im Pacman ist wie eine Atombombe zu zünden, um eine Nuss zu öffnen, oder ? :o)

Das geht auch in Echtzeit ganz gut:
runtime pathfinder
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 27-08-2004, 08:39   #7 (permalink)
Duftbäumchen
 
Benutzerbild von derDan
 
Registriert seit: Jan 2004
Beiträge: 213
Schon- aber kommt fett oder nicht?
derDan ist offline   Mit Zitat antworten
Alt 27-08-2004, 16:34   #8 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Voll fett, würde ich sagen !
Ich schmeisse alle Daumen in die Luft und wer einen fängt, darf ihn behalten

mfg .r
bokel ist offline   Mit Zitat antworten
Alt 27-08-2004, 17:06   #9 (permalink)
Duftbäumchen
 
Benutzerbild von derDan
 
Registriert seit: Jan 2004
Beiträge: 213
Ich meinte die Atombombe kommt fett. Eigenlob stinkt!
derDan ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele