?? march_n.cpp
字號:
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4-1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
else{
MARCH_GetCoord(MARCH_CurrentPoint,Tmp_Next,j);
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4-1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
else{
MARCH_GetCoord(MARCH_CurrentPoint,Tmp_Next,j);
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4-1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
else{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4-1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
if(MARCH_Aspect==MARCH_GO_BY_RIGHT)
{
Temp_Forward++;
if(Temp_Forward>=8){Temp_Forward=0;}
if(Temp_Forward==Forward){return(MARCH_ERROR_CAN_NOT_GO);}
MARCH_GetCoord(MARCH_CurrentPoint,Temp_Next,Temp_Forward);
Temp_Status=MARCH_CheckAroundPoint(Temp_Next[COORD_X],Temp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Temp_Next[COORD_X],Temp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
if((Temp_Forward==0)||(Temp_Forward==2)||(Temp_Forward==4)||(Temp_Forward==6))
{
i=Temp_Forward-1;
j=Temp_Forward+1;
if(i<0){i=7;}
if(j>=8){j=0;}
MARCH_GetCoord(MARCH_CurrentPoint,Tmp_Next,i);
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4+1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
else{
MARCH_GetCoord(MARCH_CurrentPoint,Tmp_Next,j);
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4+1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
else{
MARCH_GetCoord(MARCH_CurrentPoint,Tmp_Next,j);
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],0);
if((Temp_Status==MARCH_ERROR_COORD_Y)||(Temp_Status==MARCH_ERROR_COORD_X))
{return(MARCH_ERROR_COORD);}
if((Temp_Status==MARCH_PLAIN)||(Temp_Status==MARCH_RIVERBED))
{
Temp_Status=MARCH_CheckAroundPoint(Tmp_Next[COORD_X],Tmp_Next[COORD_Y],1);
if((Temp_Status==MARCH_EMPTY)||(Temp_Status==MARCH_PLAIN))
{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4+1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
else{
MARCH_NextPoint[COORD_X]=Temp_Next[COORD_X];
MARCH_NextPoint[COORD_Y]=Temp_Next[COORD_Y];
Last_Forward=Temp_Forward+4+1;
if(Last_Forward>7){Last_Forward=Last_Forward-8;}
return(MARCH_OK);
}
}
}
}
}
}
int MARCH_StepByStepForward(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY)
//當給出了起始點和目的地的地址,求出下一步的前進方向
//前進的方向是在返回值中傳給調(diào)用者的
{
int BetweenX,BetweenY;
int ForwardX,ForwardY;
int i,j;//,k;
BetweenX=MARCH_EndX-MARCH_BeginX;
BetweenY=MARCH_EndY-MARCH_BeginY;
if(BetweenX<0){ForwardX=-1;BetweenX=-BetweenX;}
else{ForwardX=1;}
if(BetweenY<0){ForwardY=-1;BetweenY=-BetweenY;}
else{ForwardY=1;}
if((BetweenX==0)&&(BetweenY==0)){return(MARCH_ERROR_STAY_HERE);}
if(BetweenX==0)
{
if(MARCH_BeginY&0x0001)
{
if((BetweenY==1)&&(ForwardY==-1))
{return(MARCH_LEFT_UP);}
if((BetweenY>1)&&(ForwardY==-1))
{return(MARCH_UP);}
if((BetweenY>1)&&(ForwardY==1))
{return(MARCH_DOWN);}
if((BetweenY==1)&&(ForwardY==1))
{return(MARCH_LEFT_DOWN);}
}
else{
if((BetweenY==1)&&(ForwardY==-1))
{return(MARCH_RIGHT_UP);}
if((BetweenY>1)&&(ForwardY==-1))
{return(MARCH_UP);}
if((BetweenY>1)&&(ForwardY==1))
{return(MARCH_DOWN);}
if((BetweenY==1)&&(ForwardY==1))
{return(MARCH_RIGHT_DOWN);}
}
}
if(BetweenY==0)
{
if(ForwardX==-1){return(MARCH_LEFT);}
if(ForwardX==1){return(MARCH_RIGHT);}
}
if(BetweenX==BetweenY)
{
if((ForwardX==1)&&(ForwardY==1)){return(MARCH_RIGHT_DOWN);}
if((ForwardX==1)&&(ForwardY==-1)){return(MARCH_RIGHT_UP);}
if((ForwardX==-1)&&(ForwardY==1)){return(MARCH_LEFT_DOWN);}
if((ForwardX==-1)&&(ForwardY==-1)){return(MARCH_LEFT_UP);}
}
if(BetweenY>(BetweenX+BetweenX))
{
i=BetweenY-BetweenX-BetweenX;
if(i>=(BetweenX+BetweenX))
{
if(ForwardY==-1){return(MARCH_UP);}
if(ForwardY==1){return(MARCH_DOWN);}
}
else{
if((ForwardX==1)&&(ForwardY==1)){return(MARCH_RIGHT_DOWN);}
if((ForwardX==1)&&(ForwardY==-1)){return(MARCH_RIGHT_UP);}
if((ForwardX==-1)&&(ForwardY==1)){return(MARCH_LEFT_DOWN);}
if((ForwardX==-1)&&(ForwardY==-1)){return(MARCH_LEFT_UP);}
}
}
else{
i=BetweenY>>1;
j=BetweenX-i;
if(j>=i)
{
if(ForwardX==-1){return(MARCH_LEFT);}
if(ForwardX==1){return(MARCH_RIGHT);}
}
else{
if((ForwardX==1)&&(ForwardY==1)){return(MARCH_RIGHT_DOWN);}
if((ForwardX==1)&&(ForwardY==-1)){return(MARCH_RIGHT_UP);}
if((ForwardX==-1)&&(ForwardY==1)){return(MARCH_LEFT_DOWN);}
if((ForwardX==-1)&&(ForwardY==-1)){return(MARCH_LEFT_UP);}
}
}
return(MARCH_ERROR_FORWARD);
}
int MARCH_OnePeopleFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2])
// 當給出了進入障礙物的進入點和離開障礙物的離開點后,求出一條繞過障礙物的比較優(yōu)化的路徑
{
int GoByLeft[NUMBER_OF_BEND][2];
int GoByRight[NUMBER_OF_BEND][2];
int GoByLeft_Num;
int GoByRight_Num;
short MARCH_NextPoint[2];
int MARCH_Aspect;
int Step_NO1[2];
short CurrentPoint[2];
int NextStatus;
int i;
int Between_1;
int Between_2;
memset((void *)GoByLeft,-1,sizeof(GoByLeft));
memset((void *)GoByRight,-1,sizeof(GoByRight));
MARCH_NextPoint[COORD_X]=-1;
MARCH_NextPoint[COORD_Y]=-1;
GoByLeft_Num=0;
GoByRight_Num=0;
GoByLeft[GoByLeft_Num][COORD_X]=(int)MARCH_FromPlain[COORD_X];
GoByLeft[GoByLeft_Num][COORD_Y]=(int)MARCH_FromPlain[COORD_Y];
GoByLeft_Num++;
if(GoByLeft_Num>(NUMBER_OF_BEND-2)){return(MARCH_CAN_NOT_RECEIVE);}
GoByRight[GoByRight_Num][COORD_X]=(int)MARCH_FromPlain[COORD_X];
GoByRight[GoByRight_Num][COORD_Y]=(int)MARCH_FromPlain[COORD_Y];
GoByRight_Num++;
if(GoByRight_Num>(NUMBER_OF_BEND-2)){return(MARCH_CAN_NOT_RECEIVE);}
CurrentPoint[COORD_X]=MARCH_FromPlain[COORD_X];
CurrentPoint[COORD_Y]=MARCH_FromPlain[COORD_Y];
MARCH_Aspect=MARCH_GO_BY_LEFT;
Step_NO1[COORD_X]=-1;
Step_NO1[COORD_Y]=-1;
while(1)
{
NextStatus=MARCH_OnePeopleWithCurrent(CurrentPoint,MARCH_NextPoint,MARCH_ToPlain,MARCH_Aspect);
if((NextStatus==MARCH_ERROR_CAN_NOT_GO)&&(MARCH_Aspect==MARCH_GO_BY_LEFT))
{
GoByLeft_Num=-1;
MARCH_Aspect=MARCH_GO_BY_RIGHT;
CurrentPoint[COORD_X]=MARCH_FromPlain[COORD_X];
CurrentPoint[COORD_Y]=MARCH_FromPlain[COORD_Y];
MARCH_NextPoint[COORD_X]=-1;
MARCH_NextPoint[COORD_Y]=-1;
Step_NO1[COORD_X]=-1;
Step_NO1[COORD_Y]=-1;
continue;
}
if((NextStatus==MARCH_ERROR_CAN_NOT_GO)&&(MARCH_Aspect==MARCH_GO_BY_RIGHT))
{
GoByRight_Num=-1;
break;
}
if((NextStatus==MARCH_ERROR_COORD)&&(MARCH_Aspect==MARCH_GO_BY_LEFT))
{
GoByLeft_Num=-1;
MARCH_Aspect=MARCH_GO_BY_RIGHT;
CurrentPoint[COORD_X]=MARCH_FromPlain[COORD_X];
CurrentPoint[COORD_Y]=MARCH_FromPlain[COORD_Y];
MARCH_NextPoint[COORD_X]=-1;
MARCH_NextPoint[COORD_Y]=-1;
Step_NO1[COORD_X]=-1;
Step_NO1[COORD_Y]=-1;
continue;
}
if((NextStatus==MARCH_ERROR_COORD)&&(MARCH_Aspect==MARCH_GO_BY_RIGHT))
{
if(GoByLeft_Num<0){return(MARCH_CAN_NOT_RECEIVE);}
else{
i=0;
while((GoByLeft[i][COORD_X]>0)&&(GoByLeft[i][COORD_Y]>0))
{
MARCH_Track[MARCH_StepNum][COORD_X]=GoByLeft[i][COORD_X];
MARCH_Track[MARCH_StepNum][COORD_Y]=GoByLeft[i][COORD_Y];
MARCH_Track[MARCH_StepNum][LEVEL_NUM]=0;
i++;
MARCH_StepNum++;
if(MARCH_StepNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
}
return(MARCH_CAN_RECEIVE);
}
}
if(MARCH_NextPoint[COORD_Y]&0x0001)
{
Between_1=MARCH_NextPoint[COORD_X]-MARCH_ToPlain[COORD_X];
Between_2=MARCH_NextPoint[COORD_Y]-MARCH_ToPlain[COORD_Y];
// if(Between_1<0){Between_1=-Between_1;}
if(Between_2<0){Between_2=-Between_2;}
if(((MARCH_NextPoint[COORD_X]==MARCH_ToPlain[C
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -