2.2接下来,为了能全面反映算法的具体执行过程,我又做了能显示出全部搜索过程的版本.
其实这个版本在思路上反而要比上面的好作,因为只需要预备三个队列,分别在需要记录走过结点的地方进行入队的操作就可以了。
在实现的时候,发现,假如完全按照算法来,在返回先前结点的时候,会出现“倒”走的现象,这很显然不合量,因此在程序在做了相应的调整.
另外,这个版本的fps亦可通过xml文件中的参数fps进行调节.
这个版本的代码:(注重红笔部分)
function pathSearch():Voidffice
ffice" />
{
var curX:Number=_root.gStartX;
var curY:Number=_root.gStartY;
var tmpX:Number=0;
var tmpY:Number=0;
var tmpDir:Number=0;
var flag:Number=1;
var stackX:eStack=new eStack();
var stackY:eStack=new eStack();
var stackDir:eStack=new eStack();
//animator ulti value.
var queueX:eQueue=new eQueue();
var queueY:eQueue=new eQueue();
var queueDir:eQueue=new eQueue();
//elimate the default queue data.
queueX.deQueue();
queueY.deQueue();
queueDir.deQueue();
trace(_root.gEndX);
trace(_root.gEndY);
if(curX==_root.gEndX&&curY==_root.gEndY)
{
stackX.push(curX);
stackY.push(curY);
stackDir.push(_root.gSearchNodeArr[curX][curY].mDir);
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(SearchNode.SOUTH);
}
else
{
while(!(curX==_root.gStartX&&curY==_root.gStartY&&!flag))
{
flag=0;
if(!_root.gSearchNodeArr[curX][curY].visited)
_root.gSearchNodeArr[curX][curY].visited=1;
while(_root.gSearchNodeArr[curX][curY].mDir 1!=SearchNode.SEARCHED)
{
_root.gSearchNodeArr[curX][curY].mDir ;//find next direction
//EAST,SOUTH,WEST,NORTH,SEARCHED
switch(_root.gSearchNodeArr[curX][curY].mDir)
{
case SearchNode.EAST:tmpX=0;tmpY=1;//printf("e ");
break;
case SearchNode.SOUTH:tmpX=1;tmpY=0;//printf("s ");
break;
case SearchNode.WEST:tmpX=0;tmpY=-1;//printf("w ");
break;
case SearchNode.NORTH:tmpX=-1;tmpY=0;//printf("n ");
break;
default:
trace3("error dir search ");
}
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(_root.gSearchNodeArr[curX][curY].mDir);
if(_root.gMapArr[curX tmpX][curY tmpY]==WALKABLE&&!_root.gSearchNodeArr[curX tmpX][curY tmpY].visited)
{
stackX.push(curX);
stackY.push(curY);
stackDir.push(_root.gSearchNodeArr[curX][curY].mDir);
trace("flag:" String(flag) "(" String(curX) "," String(curY) ")" "dir" _root.gSearchNodeArr[curX][curY].mDir);
curX =tmpX;
curY =tmpY;
flag=1;
break;
}
}
if(flag&&curX==_root.gEndX&&curY==_root.gEndY)
{
trace3("target founded ");
trace("target founded ");
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(SearchNode.SOUTH);//let the sprit’s last pos face to us.
break;
}
if(flag==0&&!(curX==_root.gStartX&&curY==_root.gStartY))
{
tmpX=curX-Number(stackX.top());
tmpY=curY-Number(stackY.top());
if(tmpY==1&&tmpX==0)//go back face adjusting.
tmpDir=SearchNode.WEST;
else if(tmpY==-1&&tmpX==0)
tmpDir=SearchNode.EAST;
else if(tmpX==1&&tmpY==0)
tmpDir=SearchNode.NORTH;
else if(tmpX==-1&&tmpY==0)
tmpDir=SearchNode.SOUTH;
else
trace3("error move in search ");
curX=Number(stackX.pop());
curY=Number(stackY.pop());
stackDir.pop();
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(tmpDir);
}
}
}
if(flag)
{
while(!stackX.isEmpty()&&!stackY.isEmpty())
{
tmpX=Number(stackX.pop());
tmpY=Number(stackY.pop());
tmpDir=Number(stackDir.pop());
_root.gAnsArr[tmpX][tmpY]=1;
}
_root.gAnsArr[_root.gEndX][_root.gEndY]=1;//because the target node was not push into the stacks.
for(var i:Number=0;i<_root.gRowNum;i )
{
var tmpStr:String=new String();
for(var j:Number=0;j<_root.gColNum;j )
if(_root.gAnsArr[j]==1)
{
tmpStr ="o ";
trace3("o ");
}
else
{
tmpStr ="* ";
trace3("* ");
}
trace3(" ");
trace(tmpStr);
}
}
else
{
trace3("no way lead to the target node ");
trace("no way lead to the target node ");
}
_root.attachMovie("mm","newMM",_root.getNextHighestDepth());
_root.newMM._x=-80;
_root.newMM._y=-80;
_root.gIntervalID=setInterval(showAnimator2,_root.gFps,queueX,queueY,queueDir);
}
function showAnimator2(inQueueX:eQueue,inQueueY:eQueue,inQueueDir:eQueue):Void
{
if(inQueueX.isEmpty()&&inQueueY.isEmpty()&&inQueueDir.isEmpty())clearInterval(_root.gIntervalID);
else
{
trace("xQueue" String(inQueueX.front()) "yQueue" String(inQueueY.front()));
eval("_root.newMM")._x=_root.gLeftX _root.gSquareLen*inQueueY.deQueue();//posx
eval("_root.newMM")._y=_root.gTop _root.gSquareLen*inQueueX.deQueue();//posy
//dir
switch(inQueueDir.deQueue())
{
case SearchNode.EAST:
eval("_root.newMM").gotoAndStop(2);
break;
case SearchNode.SOUTH:
eval("_root.newMM").gotoAndStop(1);
break;
case SearchNode.WEST:
eval("_root.newMM").gotoAndStop(4);
break;
case SearchNode.NORTH:
eval("_root.newMM").gotoAndStop(3);
break;
default:
trace3("error dir search ");
}
}
}
源码下载:
http://emilmatthew.51.net/downloads/WalkInTheMazeAS2.rar
http://emilmatthew.51.net/downloads/WalkInTheMazeAS2V2.rar
//假如上面这个链接无法响应下载(有可能是被网站给屏蔽掉了),则可使用下载工具(如迅雷等)下载。
上传至闪吧的下载
版本1[upload=rar]viewFile.asp?ID=275566[/upload]
版本2[upload=rar]viewFile.asp?ID=275567[/upload]
文章的DOC全文 [upload=rar]viewFile.asp?ID=275568[/upload]
欢迎提出批评与指正意见!
其实这个版本在思路上反而要比上面的好作,因为只需要预备三个队列,分别在需要记录走过结点的地方进行入队的操作就可以了。
在实现的时候,发现,假如完全按照算法来,在返回先前结点的时候,会出现“倒”走的现象,这很显然不合量,因此在程序在做了相应的调整.
另外,这个版本的fps亦可通过xml文件中的参数fps进行调节.
这个版本的代码:(注重红笔部分)
function pathSearch():Voidffice
ffice" />{
var curX:Number=_root.gStartX;
var curY:Number=_root.gStartY;
var tmpX:Number=0;
var tmpY:Number=0;
var tmpDir:Number=0;
var flag:Number=1;
var stackX:eStack=new eStack();
var stackY:eStack=new eStack();
var stackDir:eStack=new eStack();
//animator ulti value.
var queueX:eQueue=new eQueue();
var queueY:eQueue=new eQueue();
var queueDir:eQueue=new eQueue();
//elimate the default queue data.
queueX.deQueue();
queueY.deQueue();
queueDir.deQueue();
trace(_root.gEndX);
trace(_root.gEndY);
if(curX==_root.gEndX&&curY==_root.gEndY)
{
stackX.push(curX);
stackY.push(curY);
stackDir.push(_root.gSearchNodeArr[curX][curY].mDir);
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(SearchNode.SOUTH);
}
else
{
while(!(curX==_root.gStartX&&curY==_root.gStartY&&!flag))
{
flag=0;
if(!_root.gSearchNodeArr[curX][curY].visited)
_root.gSearchNodeArr[curX][curY].visited=1;
while(_root.gSearchNodeArr[curX][curY].mDir 1!=SearchNode.SEARCHED)
{
_root.gSearchNodeArr[curX][curY].mDir ;//find next direction
//EAST,SOUTH,WEST,NORTH,SEARCHED
switch(_root.gSearchNodeArr[curX][curY].mDir)
{
case SearchNode.EAST:tmpX=0;tmpY=1;//printf("e ");
break;
case SearchNode.SOUTH:tmpX=1;tmpY=0;//printf("s ");
break;
case SearchNode.WEST:tmpX=0;tmpY=-1;//printf("w ");
break;
case SearchNode.NORTH:tmpX=-1;tmpY=0;//printf("n ");
break;
default:
trace3("error dir search ");
}
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(_root.gSearchNodeArr[curX][curY].mDir);
if(_root.gMapArr[curX tmpX][curY tmpY]==WALKABLE&&!_root.gSearchNodeArr[curX tmpX][curY tmpY].visited)
{
stackX.push(curX);
stackY.push(curY);
stackDir.push(_root.gSearchNodeArr[curX][curY].mDir);
trace("flag:" String(flag) "(" String(curX) "," String(curY) ")" "dir" _root.gSearchNodeArr[curX][curY].mDir);
curX =tmpX;
curY =tmpY;
flag=1;
break;
}
}
if(flag&&curX==_root.gEndX&&curY==_root.gEndY)
{
trace3("target founded ");
trace("target founded ");
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(SearchNode.SOUTH);//let the sprit’s last pos face to us.
break;
}
if(flag==0&&!(curX==_root.gStartX&&curY==_root.gStartY))
{
tmpX=curX-Number(stackX.top());
tmpY=curY-Number(stackY.top());
if(tmpY==1&&tmpX==0)//go back face adjusting.
tmpDir=SearchNode.WEST;
else if(tmpY==-1&&tmpX==0)
tmpDir=SearchNode.EAST;
else if(tmpX==1&&tmpY==0)
tmpDir=SearchNode.NORTH;
else if(tmpX==-1&&tmpY==0)
tmpDir=SearchNode.SOUTH;
else
trace3("error move in search ");
curX=Number(stackX.pop());
curY=Number(stackY.pop());
stackDir.pop();
queueX.enQueue(curX);
queueY.enQueue(curY);
queueDir.enQueue(tmpDir);
}
}
}
if(flag)
{
while(!stackX.isEmpty()&&!stackY.isEmpty())
{
tmpX=Number(stackX.pop());
tmpY=Number(stackY.pop());
tmpDir=Number(stackDir.pop());
_root.gAnsArr[tmpX][tmpY]=1;
}
_root.gAnsArr[_root.gEndX][_root.gEndY]=1;//because the target node was not push into the stacks.
for(var i:Number=0;i<_root.gRowNum;i )
{
var tmpStr:String=new String();
for(var j:Number=0;j<_root.gColNum;j )
if(_root.gAnsArr[j]==1)
{
tmpStr ="o ";
trace3("o ");
}
else
{
tmpStr ="* ";
trace3("* ");
}
trace3(" ");
trace(tmpStr);
}
}
else
{
trace3("no way lead to the target node ");
trace("no way lead to the target node ");
}
_root.attachMovie("mm","newMM",_root.getNextHighestDepth());
_root.newMM._x=-80;
_root.newMM._y=-80;
_root.gIntervalID=setInterval(showAnimator2,_root.gFps,queueX,queueY,queueDir);
}
function showAnimator2(inQueueX:eQueue,inQueueY:eQueue,inQueueDir:eQueue):Void
{
if(inQueueX.isEmpty()&&inQueueY.isEmpty()&&inQueueDir.isEmpty())clearInterval(_root.gIntervalID);
else
{
trace("xQueue" String(inQueueX.front()) "yQueue" String(inQueueY.front()));
eval("_root.newMM")._x=_root.gLeftX _root.gSquareLen*inQueueY.deQueue();//posx
eval("_root.newMM")._y=_root.gTop _root.gSquareLen*inQueueX.deQueue();//posy
//dir
switch(inQueueDir.deQueue())
{
case SearchNode.EAST:
eval("_root.newMM").gotoAndStop(2);
break;
case SearchNode.SOUTH:
eval("_root.newMM").gotoAndStop(1);
break;
case SearchNode.WEST:
eval("_root.newMM").gotoAndStop(4);
break;
case SearchNode.NORTH:
eval("_root.newMM").gotoAndStop(3);
break;
default:
trace3("error dir search ");
}
}
}
源码下载:
http://emilmatthew.51.net/downloads/WalkInTheMazeAS2.rar
http://emilmatthew.51.net/downloads/WalkInTheMazeAS2V2.rar
//假如上面这个链接无法响应下载(有可能是被网站给屏蔽掉了),则可使用下载工具(如迅雷等)下载。
上传至闪吧的下载
版本1[upload=rar]viewFile.asp?ID=275566[/upload]
版本2[upload=rar]viewFile.asp?ID=275567[/upload]
文章的DOC全文 [upload=rar]viewFile.asp?ID=275568[/upload]
欢迎提出批评与指正意见!
诶……