?? 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 + -