📄 march_n.cpp
字号:
#include "stdafx.h"
#include "march_n.h"
short MARCH_LineTrack[NUMBER_OF_TRACK+2][2];//此数组为用来存储直线轨迹的数组
short MARCH_Track[NUMBER_OF_TRACK+2][3];//此数组为用来存储最后的行军轨迹的数组
BYTE MARCH_TrackForward[NUMBER_OF_TRACK+2];//此数组为用来存储最后由行军轨迹求出的行军路线的方向变化
int MARCH_StepNum;//此变量为用来对最后的行军轨迹数组进行记数的
int MARCH_BeginX;//此变量为用来保存起始点的X坐标
int MARCH_BeginY;//此变量为用来保存起始点的Y坐标
int MARCH_Begin_X;//此变量为用来保存地面起始点的X坐标
int MARCH_Begin_Y;//此变量为用来保存地面起始点的Y坐标
int MARCH_TrackNum;//此变量用来对存储直线轨迹的数组进行记数
//#define DEBUG
//#define DEBUG_1
int MARCH_CheckAround(short MARCH_CurrentX,short MARCH_CurrentY,int Level)
{
DWORD i,j;
struct MAP_UNIT_CODE_STRUCT UnitDeCode;
struct MAP_GROUND_CODE_STRUCT GroundDeCode;
if((MARCH_CurrentY<=3)||(MARCH_CurrentY>=MAP_Lib.szNum.cy-3))
{return(MARCH_ERROR_COORD_Y);}
if((MARCH_CurrentX<=1)||(MARCH_CurrentX>=MAP_Lib.szNum.cx-1))
{return(MARCH_ERROR_COORD_X);}
i=MAP_GetUnitData(MARCH_CurrentX,MARCH_CurrentY);
if(i!=MAP_DATA_NONE)
{
MAP_UnitDeCode(i,&UnitDeCode);
if(UnitDeCode.nFile==50){return(MARCH_SHORT_STAIRCASE);}
if(UnitDeCode.nFile==51){return(MARCH_LONG_STAIRCASE);}
}
j=MAP_GetGroundData(Level,MARCH_CurrentX,MARCH_CurrentY);
if((j==MAP_DATA_NONE)&&(Level!=0)){return(MARCH_EMPTY);}
MAP_GroundDeCode((WORD)j,&GroundDeCode);
if((GroundDeCode.nFile==6)&&(GroundDeCode.nCol<=1)){return(MARCH_CAN_SHIN);}
if((GroundDeCode.nFile==7)&&(GroundDeCode.nCol<=7)){return(MARCH_CAN_SHIN);}
if((GroundDeCode.nFile==9)&&(GroundDeCode.nCol<=1)){return(MARCH_CAN_SHIN);}
if((GroundDeCode.nFile==10)&&(GroundDeCode.nCol<=7)){return(MARCH_CAN_SHIN);}
return(MARCH_CAN_NOT_SHIN);
}
int MARCH_GetCoord(short MARCH_CurrentPoint[2],int MARCH_NextPoint[2],int MARCH_Num)
{
int i;
i=MARCH_CurrentPoint[COORD_Y]&0x0001;
if(i!=0)
{
switch(MARCH_Num)
{
case 0:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-2;
break;
case 1:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]+1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-1;
break;
case 2:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]+1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y];
break;
case 3:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]+1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+1;
break;
case 4:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+2;
break;
case 5:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+1;
break;
case 6:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]-1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y];
break;
case 7:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-1;
break;
default :
#ifdef DEBUG
OutputDebugString("Verdict the bend error!\n");
#endif
return(MARCH_ERROR_FORWARD_IN_GET_COORD);
break;
}
}
else
{
switch(MARCH_Num)
{
case 0:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-2;
break;
case 1:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-1;
break;
case 2:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]+1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y];
break;
case 3:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+1;
break;
case 4:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X];
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+2;
break;
case 5:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]-1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]+1;
break;
case 6:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]-1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y];
break;
case 7:
MARCH_NextPoint[COORD_X]=MARCH_CurrentPoint[COORD_X]-1;
MARCH_NextPoint[COORD_Y]=MARCH_CurrentPoint[COORD_Y]-1;
break;
default :
#ifdef DEBUG
OutputDebugString("Verdict the bend error!\n");
#endif
return(MARCH_ERROR_FORWARD_IN_GET_COORD);
break;
}
}
return(MARCH_OK);
}
int MARCH_LookForLine(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY)
//此函数是寻找一条从出发点到目的地的直线轨迹;
//前两个形参是出发点的坐标,
//后两个形参是目的地的坐标;
{
int ForwardX=0;
int ForwardY=0;
int i,j,k;
int BetweenX=0;
int BetweenY=0;
int NowX=0,NowY=0;
int X_Num=0,Y_Num=0;
MARCH_TrackNum=0;
BetweenX=MARCH_EndX-MARCH_BeginX;
BetweenY=MARCH_EndY-MARCH_BeginY;
if((BetweenX==0)&&(BetweenY==0))
{
MARCH_LineTrack[0][COORD_X]=MARCH_BeginX;
MARCH_LineTrack[0][COORD_Y]=MARCH_BeginY;
MARCH_LineTrack[1][COORD_X]=MARCH_EndX;
MARCH_LineTrack[1][COORD_Y]=MARCH_EndY;
MARCH_LineTrack[2][COORD_X]=-1;
MARCH_LineTrack[2][COORD_Y]=-1;
return(MARCH_OK);
}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_BeginX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_BeginY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
if(BetweenX==0)
{
int ToY;
if(BetweenY<0){ToY=-1;BetweenY=-BetweenY;}
else{ToY=1;}
i=BetweenY>>1;
if(BetweenY!=(i+i))
{
for(j=0;j<i;j++)
{
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_BeginX;
if(ToY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+2;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-2;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_EndX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_EndY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_EndX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_EndY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=-1;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=-1;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
return(MARCH_OK);
}
else{
for(j=0;j<i;j++)
{
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_BeginX;
if(ToY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+2;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-2;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_EndX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_EndY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=-1;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=-1;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
return(MARCH_OK);
}
}
if(BetweenY==0)
{
int ToX;
if(BetweenX<0){ToX=-1;BetweenX=-BetweenX;}
else{ToX=1;}
for(i=0;i<BetweenX;i++)
{
if(ToX>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]+1;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]-1;}
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_BeginY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_EndX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_EndY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=-1;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=-1;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
return(MARCH_OK);
}
if(BetweenX<0){ForwardX=-1;BetweenX=-BetweenX;}
else{ForwardX=1;}
if(BetweenY<0){ForwardY=-1;BetweenY=-BetweenY;}
else{ForwardY=1;}
MARCH_TrackNum=0;
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_BeginX;
MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_BeginY;
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
if(BetweenY>=(BetweenX+BetweenX))
{
i=BetweenX+BetweenX;
j=BetweenY-i;
Y_Num=0;
while(j>0)
{
Y_Num++;
j=j-i;
}
Y_Num--;
i=0;
k=0;
while((i<=BetweenX)&&(k<=BetweenY))
{
for(j=1;j<=Y_Num;j++)
{
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X];
if(ForwardY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+2;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-2;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
if((MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]==MARCH_EndX)||(MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]==MARCH_EndY))
{break;}
k++;
k++;
}
if((MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]==MARCH_EndX)||(MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]==MARCH_EndY))
{break;}
if(MARCH_BeginY&0x0001)
{
if(ForwardX>0)
{
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]+1;
if(ForwardY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+1;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-1;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
if((MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]==MARCH_EndX)||(MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]==MARCH_EndY))
{break;}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X];
if(ForwardY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+1;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-1;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
i++;
k++;
k++;
if((MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]==MARCH_EndX)||(MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]==MARCH_EndY))
{break;}
}
else{
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X];
if(ForwardY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+1;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-1;}
MARCH_TrackNum++;
if(MARCH_TrackNum>NUMBER_OF_TRACK-2){return(MARCH_ERROR_GO_OUT_ARRAY);}
if((MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]==MARCH_EndX)||(MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]==MARCH_EndY))
{break;}
MARCH_LineTrack[MARCH_TrackNum][COORD_X]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_X]-1;
if(ForwardY>0)
{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]+1;}
else{MARCH_LineTrack[MARCH_TrackNum][COORD_Y]=MARCH_LineTrack[MARCH_TrackNum-1][COORD_Y]-1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -