CPath::CPath( int bx, int by, int tx, int ty, int MapW, int MapH, stEvent* Block )
{
this->MapW = MapW;
this->MapH = MapH;
this->Block = Block;
Level = -1;
x = bx;
y = by;
TargetX = tx;
TargetY = ty;
Table = new int[MapH*MapW];
memset( Table, 0, sizeof(Table) );
AllComplete = 0;
LevelComplete = 0;
}
CPath::~CPath()
{
}
BOOL CPath::Test( )
{
if ((x==TargetX)&&(y==TargetY)) //已到目标
{
for (int i=0;i<=Level;i++)
{
switch( Act[i] )
{
case 1:
Act[i] = 2;
break;
case 2:
Act[i] = 0;
break;
case 3:
Act[i] = 1;
break;
case 4:
Act[i] = 3;
break;
}
}
int CPath::ActOK( )
{
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};
int tx=x+dx[Act[Level]-1]; //将到点的x坐标
int ty=y+dy[Act[Level]-1]; //将到点的y坐标
if (Act[Level]>MaxAct) //方向错误?
return 0;
if ((tx>=MapW)||(tx<0)) //x坐标出界?
return 0;
if ((ty>=MapH)||(ty<0)) //y坐标出界?
return 0;
if (Table[ty*MapW+tx]==1) //已到过?
return 0;
if (Block[ty*MapW+tx].Block==1) //有障碍?
return 0;
x=tx;
y=ty; //移动
Table[y*MapW+x]=1; //做已到过标记
return 1;
}
int CPath::GetNextAct( )
{
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};
int dis[4]; //按四个方向移动后离目标距离
int order[4]; //四个方向搜索次序
int t=32767;
int tt=2;
for (int i=0;i<4;i++)
dis[i]=abs(x+dx[i]-TargetX)+abs(y+dy[i]-TargetY);
for (i=0;i<4;i++)
if (dis[i]<t)
{
order[0]=i+1;
t=dis[i];
}
if (Act[Level]==0)
{
return order[0];
}
order[1]=-1;
for (i=0;i<4;i++)
{
if ((dis[i]==t)&&(i!=(order[0]-1)))
{
order[1]=i+1;
break;
}
}
if (order[1]!=-1)
{
for (i=0;i<4;i++)
{
if (dis[i]!=t)
{
order[tt]=i+1;
tt++;
}
}
}
else
{
for (i=0;i<4;i++)
{
if (dis[i]!=t)
{
order[tt-1]=i+1;
tt++;
}
}
}
if (Act[Level]==order[0])
return order[1];
if (Act[Level]==order[1])
return order[2];
if (Act[Level]==order[2])
return order[3];
if (Act[Level]==order[3])
return 5;
}