📄 march_n.h
字号:
/////////////////
// March_new.h : 《赤壁》行军策略算法的数据结构
// March_new.h :
//
// 版本0010 : 1997年1月24日
//
// 编写 : 董海
// written by : Dong Hai
//
// 编译器 : Visual C++ 4.0
// Compiler : Visual C++ 4.0
//
// 版权 : 北京前导软件有限公司 1996-1997
// Copyright : WayAhead Software Co.Ltd. 1996-1997
/////////////////
// 此文件包括对行军中部队绕过各种障碍物的算法
#ifndef CB_MARCH
#define CB_MARCH
//#include <math.h>
//#include <string.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
//#include <conio.h>
//#include <stdlib.h>
//#include <dos.h>
#include "CBMap.h"
extern struct MAP_LIB_STRUCT MAP_Lib;
//表示前进方向的宏定义
#define MARCH_GO_BY_LEFT 9000
#define MARCH_GO_BY_RIGHT 9001
//用来定义在整个行军的模块中,所使用的数组的大小
#define NUMBER_OF_TRACK 512
#define NUMBER_OF_BEND 512
//用来定义轨迹数组中的第二维的值是轨迹的X还是Y坐标,或者是层数
#define COORD_X 0
#define COORD_Y 1
#define LEVEL_NUM 2
//在行军策略中定义的各种部队和地形的宏定义
#define MARCH_UNIT 8000
#define MARCH_PLAIN 8001
#define MARCH_WATER 8002
#define MARCH_HILL 8003
#define MARCH_SPECIAL 8004
#define MARCH_BUILDING 8005
#define MARCH_RIVERBED 8006
#define MARCH_ONE_PEOPLE 8007
#define MARCH_TWO_PEOPLE 8008
#define MARCH_ONE_SHIP 8009
#define MARCH_TWO_SHIP 8010
#define MARCH_FOUR_SHIP 8011
#define MARCH_FORTRESS 8012
#define MARCH_WALL 8013
#define MARCH_EMPTY 8014
#define MARCH_CAN_SHIN 8015
#define MARCH_CAN_NOT_SHIN 8016
#define MARCH_LONG_STAIRCASE 8017
#define MARCH_SHORT_STAIRCASE 8018
//在行军策略中的错误返回码
#define MARCH_OK 0
#define MARCH_ERROR_GROUND -6000
#define MARCH_ERROR_COORD_Y -6001
#define MARCH_ERROR_COORD_X -6002
#define MARCH_ERROR_INPUT_COORD -6003
#define MARCH_ERROR_FORWARD_IN_GET_COORD -6004
#define MARCH_ERROR_GO_OUT_X_IN_GET_LINE -6005
#define MARCH_ERROR_GO_OUT_Y_IN_GET_LINE -6006
#define MARCH_ERROR_DECODE -6007
#define MARCH_ERROR_GO_OUT_ARRAY -6008
#define MARCH_ERROR_STAY_HERE -6009
#define MARCH_ERROR_COORD -6010
#define MARCH_ERROR_CAN_NOT_GO -6011
#define MARCH_ERROR_UNIT_STATUS -6012
#define MARCH_ERROR_MARCH_TRACK -6013
#define MARCH_ERROR_FORWARD -6014
#define MARCH_ERROR_TO_PLAIN -6015
//定义在给出两点的坐标以后,求出的第一步的方向
#define MARCH_UP 0
#define MARCH_RIGHT_UP 1
#define MARCH_RIGHT 2
#define MARCH_RIGHT_DOWN 3
#define MARCH_DOWN 4
#define MARCH_LEFT_DOWN 5
#define MARCH_LEFT 6
#define MARCH_LEFT_UP 7
#define MARCH_UP_UP 8
#define MARCH_DOWN_DOWN 9
#define MARCH_NO_UP_DOWN 10
#define MARCH_FORWARD_NO_CHANGE 13
//定义是否能够走到目的地
#define MARCH_CAN_RECEIVE 9200
#define MARCH_CAN_NOT_RECEIVE 9201
//定义调用行军函数的单元的类型
#define MARCH_SHIP 9000
//定义在直线轨迹上是否有障碍点
#define MARCH_BLOCK 8500
#define MARCH_NO_BLOCK 8501
#define MARCH_SAME_POINT 8502
//定义是否为本身
#define MARCH_IS_ME 8800
#define MARCH_IS_NO_ME 8801
//定义是否接近目的地
#define MARCH_IS_NEAR 8900
#define MARCH_IS_FAR 8901
//
#define MARCH_NO_NEW_END 9900
#define MARCH_NEW_END 9901
/////////////
extern int March_Interface(int BeginX,int BeginY,int BeginLevel,int EndX,int EndY,int EndLevel);//,int UnitNum);
/////////////
// 当给出了起始点和目的地的地址,求出下一步的前进方向
// 前进的方向是在返回值中传给调用者的
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_StepByStepOnHigh(short MARCH_Current[3],short MARCH_Next[3],int MARCH_Aspect);
int MARCH_CheckAround(short MARCH_CurrentX,short MARCH_CurrentY,int Level);
// 根据当前点和起始点位置判断当前点是否在起始点的范围内
// MARCH_CurrentPoint : 当前点的坐标
int MARCH_IsMe_2(int MARCH_CurrentX,int MARCH_CurrentY);
// 根据当前点和起始点位置判断当前点是否在起始点的范围内
// MARCH_CurrentPoint : 当前点的坐标
int MARCH_IsMe_4(int MARCH_CurrentX,int MARCH_CurrentY);
// 如果出发点在山上或者城墙上,首先从出发点下到最底层
// MARCH_BeginX : 出发点的X坐标
// MARCH_BeginY : 出发点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_DownToGround(int BeginX,int BeginY,int BeginLevel,int EndX,int EndY,int EndLevel,int NewBegin[2]);
// 如果目的地在山上或者城墙上,从目的地下到最底层
// MARCH_BeginX : 出发点的X坐标
// MARCH_BeginY : 出发点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_UpFromGround(int BeginX,int BeginY,int EndX,int EndY,int EndLevel,int NewEnd[2]);
int MARCH_GoWithSameLevel(int BeginX,int BeginY,int EndX,int EndY,int Level);
int MARCH_StepByStepOnHigh1(short MARCH_Current[3],short MARCH_Next[3],int MARCH_Aspect);
// 根据当前点和临时数组中的位置算出这点的坐标
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_Num : 下一点在临时数组中的位置
int MARCH_GetCoord(short MARCH_CurrentPoint[2],int MARCH_NextPoint[2],int MARCH_Num);
// 判断所给的坐标的点上的属性
// AroundPointX : 所给点的X坐标
// AroundPointY : 所给点的Y坐标
// MARCH_Level : 所给点的层数
// 返回值 : 返回此点的属性
extern int MARCH_CheckAroundPoint(int AroundPointX,int AroundPointY,int MARCH_Level);
// 在出发点和目的地之间找到一条直线轨迹
// MARCH_BeginX : 出发点的X坐标
// MARCH_BeginY : 出发点的Y坐标
// MARCH_EndX : 目的地的Y坐标
// MARCH_EndY : 目的地的X坐标
int MARCH_LookForLine(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
//当MARCH_LookForLine函数求出了一个大概的直线时,此函数在进行一下校正
// MARCH_BeginX : 在MARCH_LookForLine函数中结束点的X坐标
// MARCH_BeginY : 在MARCH_LookForLine函数中结束点的Y坐标
// MARCH_EndX : 目的地的Y坐标
// MARCH_EndY : 目的地的X坐标
int MARCH_CorrectLine(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 根据当前点的坐标和方向求出下一点的坐标
// NowX : 下一点的X坐标
// NowY : 下一点的Y坐标
// LastX : 前一点的X坐标
// LastY : 前一点的Y坐标
// Forward : 所走的方向
extern void MARCH_TransBack(int *NowX, int *NowY, int LastX, int LastY, int Forward);
// 根据当前点的坐标和下一点的坐标求出方向
// NowX : 下一点的X坐标
// NowY : 下一点的Y坐标
// LastX : 前一点的X坐标
// LastY : 前一点的Y坐标
// Forward : 所走的方向
void MARCH_TransPoint(int NowX, int NowY, int LastX, int LastY, int *Forward);
// 将已经得到坐标的轨迹转变成一条方向轨迹
//
int MARCH_Transform(void);
// 利用当前点和目的地的坐标,求出下一点的坐标位置,此函数只考虑了1*1格士兵的情况
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_EndPoint : 目的地的坐标
// MARCH_Aspect : 靠左或靠右前进的标志位
int MARCH_OnePeopleWithCurrent(short MARCH_CurrentPoint[2],short MARCH_NextPoint[2],short MARCH_EndPoint[2],int MARCH_Aspect);
// 当给出了起始点和目的地的地址,求出下一步的前进方向
// 前进的方向是在返回值中传给调用者的
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_StepByStepForward(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 当给出了进入障碍物的进入点和离开障碍物的离开点后,求出一条绕过障碍物的比较优化的路径
// 此函数只考虑了1*1格士兵的情况
// MARCH_FromPlain : 进入障碍物的进入点
// MARCH_ToPlain : 离开障碍物的离开点
int MARCH_OnePeopleFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2]);
// 利用当前点和目的地的坐标,求出下一点的坐标位置,此函数只考虑了2*2格士兵的情况
// 与1*1格士兵不同之处是进入障碍物的进入点不是紧靠着障碍物的一点,而是与障碍物之间有一格距离的一点作为进入障碍物的进入点
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_EndPoint : 目的地的坐标
// MARCH_Aspect : 靠左或靠右前进的标志位
int MARCH_TwoPeopleWithCurrent(short MARCH_CurrentPoint[2],short MARCH_NextPoint[2],short MARCH_EndPoint[2],int MARCH_Aspect);
// 当给出了进入障碍物的进入点和离开障碍物的离开点后,求出一条绕过障碍物的比较优化的路径
// 此函数只考虑了2*2格士兵的情况
// MARCH_FromPlain : 进入障碍物的进入点
// MARCH_ToPlain : 离开障碍物的离开点
int MARCH_TwoPeopleFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2]);
// 利用当前点和目的地的坐标,求出下一点的坐标位置,此函数只考虑了1*1格的船的情况
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_EndPoint : 目的地的坐标
// MARCH_Aspect : 靠左或靠右前进的标志位
int MARCH_OneShipWithCurrent(short MARCH_CurrentPoint[2],short MARCH_NextPoint[2],short MARCH_EndPoint[2],int MARCH_Aspect);
// 当给出了进入障碍物的进入点和离开障碍物的离开点后,求出一条绕过障碍物的比较优化的路径
// 此函数只考虑了1*1格船的情况
// MARCH_FromPlain : 进入障碍物的进入点
// MARCH_ToPlain : 离开障碍物的离开点
int MARCH_OneShipFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2]);
// 利用当前点和目的地的坐标,求出下一点的坐标位置,此函数只考虑了2*2格船的情况
// 与1*1格船不同之处是进入障碍物的进入点不是紧靠着障碍物的一点,而是与障碍物之间有一格距离的一点作为进入障碍物的进入点
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_EndPoint : 目的地的坐标
// MARCH_Aspect : 靠左或靠右前进的标志位
int MARCH_TwoShipWithCurrent(short MARCH_CurrentPoint[2],short MARCH_NextPoint[2],short MARCH_EndPoint[2],int MARCH_Aspect);
// 当给出了进入障碍物的进入点和离开障碍物的离开点后,求出一条绕过障碍物的比较优化的路径
// 此函数只考虑了2*2格船的情况
// MARCH_FromPlain : 进入障碍物的进入点
// MARCH_ToPlain : 离开障碍物的离开点
int MARCH_TwoShipFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2]);
// 利用当前点和目的地的坐标,求出下一点的坐标位置,此函数只考虑了4*4格船的情况
// 与1*1格船不同之处是进入障碍物的进入点不是紧靠着障碍物的一点,而是与障碍物之间有一格距离的一点作为进入障碍物的进入点
// MARCH_CurrentPoint : 当前点的坐标
// MARCH_NextPoint : 下一点的坐标
// MARCH_EndPoint : 目的地的坐标
// MARCH_Aspect : 靠左或靠右前进的标志位
int MARCH_FourShipWithCurrent(short MARCH_CurrentPoint[2],short MARCH_NextPoint[2],short MARCH_EndPoint[2],int MARCH_Aspect);
// 当给出了进入障碍物的进入点和离开障碍物的离开点后,求出一条绕过障碍物的比较优化的路径
// 此函数只考虑了4*4格船的情况
// MARCH_FromPlain : 进入障碍物的进入点
// MARCH_ToPlain : 离开障碍物的离开点
int MARCH_FourShipFindWay(short MARCH_FromPlain[2],short MARCH_ToPlain[2]);
// 当给出了起始点和目的地的坐标,求出一条行军轨迹,此函数只考虑1*1格士兵
// 这条行军的轨迹是在第0层地形上的,上山,下山和上城,下城则在另外的函数中处理
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_OnePeopleTrack(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 当给出了起始点和目的地的坐标,求出一条行军轨迹,此函数只考虑2*2格士兵
// 这条行军的轨迹是在第0层地形上的,上山,下山和上城,下城则在另外的函数中处理
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_TwoPeopleTrack(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 当给出了起始点和目的地的坐标,求出一条行军轨迹,此函数只考虑1*1格船
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_OneShipTrack(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 当给出了起始点和目的地的坐标,求出一条行军轨迹,此函数只考虑2*2格船
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_TwoShipTrack(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
// 当给出了起始点和目的地的坐标,求出一条行军轨迹,此函数只考虑4*4格船
// MARCH_BeginX : 起始点的X坐标
// MARCH_BeginY : 起始点的Y坐标
// MARCH_EndX : 目的地的X坐标
// MARCH_EndY : 目的地的Y坐标
int MARCH_FourShipTrack(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
int MARCH_OnePeopleTrack1(int MARCH_BeginX,int MARCH_BeginY,int MARCH_EndX,int MARCH_EndY);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -