A星算法,flash 演示版 package { import flash.display.Sprite; import flash.events.MouseEvent; [SWF(width="550",height="550",backgroundColor="#999999")] public class astart extends Sprite { // 常数定义 private static const size:int = 50; private var points:Array = new Array(); private var bg:Sprite = new Sprite(); private var person:Sprite = null; private var line:Sprite = new Sprite(); public function astart() { var i:int = 0; // 填充颜色 bg.x = bg.y = 25; bg.graphics.beginFill(0xff0000,1); bg.graphics.drawRect(0,0,500,500); bg.graphics.endFill(); // 画格子线 bg.graphics.lineStyle(1,0); for ( i=0;i<=size;i++ ) { bg.graphics.moveTo(0,500/size*i); bg.graphics.lineTo(500,500/size*i); bg.graphics.moveTo(500/size*i,0); bg.graphics.lineTo(500/size*i,500); } // 初始化格子 for ( i = 0;i<size;i++ ) { var _points:Array = new Array(); for ( var j:int=0;j<size;j++ ) { if ( Math.floor(Math.random()*5) == 0 ) { // 五分之一的格式是障碍 _points.push(1); bg.graphics.beginFill(0,1); bg.graphics.drawRect(500/size*i,500/size*j,500/size,500/size); bg.graphics.endFill(); } else _points.push(0); } points.push(_points); } //放置起点 while ( true ) { var ix:int = Math.floor(Math.random()*size); var iy:int = Math.floor(Math.random()*size); if ( points[ix][iy] == 0 ) { person = new Sprite(); person.graphics.beginFill(0xff00,1); person.graphics.drawRect(0,0,500/size,500/size); person.graphics.endFill(); person.x = ix * 500/size + 25; person.y = iy * 500/size + 25; person.mouseEnabled = false; person.mouseChildren = false; break; } } bg.addEventListener(MouseEvent.CLICK,onClick); addChild(bg); line.x = line.y = 25; addChild(line); addChild(person); } public function onClick(event:MouseEvent):void { var targetX:int = Math.floor(event.localX*size/500); var targetY:int = Math.floor(event.localY*size/500); var personX:int = Math.floor((person.x-25)*size/500); var personY:int = Math.floor((person.y-25)*size/500); if ( targetX == personX && targetY == personY ) return; if ( points[targetX][targetY] == 1 ) return; var locks:Object = new Object(); var unlocks:Array = new Array(); var i:int = 0; var j:int = 0; line.graphics.clear(); bg.mouseEnabled = false; var startObj:Object = { x:personX,y:personY,f:0,g:0,h:0,parent:null } unlocks.push(startObj); unlocks[personX+"-"+personY] = startObj; var endObj:Object = null; while ( true ) { var point:Object = unlocks.shift(); for ( i=-1;i<=1;i++ ) for ( j=-1;j<=1;j++ ) { if ( i == 0 && j == 0 ) continue; var px:int = point.x +i; var py:int = point.y +j; if ( px >= size || px < 0 || py >= size || py < 0 ) continue; if ( points[px][py] == 1 ) continue; if ( locks[px + "-" + py] ) continue; if ( unlocks[px + "-" +py] ) continue; if ( i * j != 0 ) { if ( points[point.x][py] == 1 || points[px][point.y] == 1 ) continue; } var obj:Object = { x:px,y:py,parent:point }; obj.h = Math.abs(targetX - px)+Math.abs(targetY - py); obj.g = point.g+(i*j==0?10:14); obj.f = obj.h + obj.g; unlocks.push(obj); unlocks[px+"-"+py] = obj; locks[px+"-"+py] = obj; if ( px == targetX && py == targetY ) { endObj = obj; break; } } if ( endObj != null || unlocks.length == 0 ) break; unlocks.sortOn("f", Array.NUMERIC); } if ( endObj != null ) { var pre:Object = endObj.parent; line.graphics.lineStyle(2,0xffffff); line.graphics.moveTo((endObj.x+0.5)*500/size,(endObj.y+0.5)*500/size); while ( pre != null ) { line.graphics.lineTo((pre.x+0.5)*500/size,(pre.y+0.5)*500/size); pre = pre.parent; } person.x = targetX*500/size + 25; person.y = targetY*500/size + 25; } bg.mouseEnabled = true; } } }