📄 clsmap8db.h
字号:
/*
;=============================================================================
; 名称:clsMAP8dB
;=============================================================================
; 描述:地图综合
;=============================================================================
*/
#define MAP_obstacle 'X' //地图文件障碍标志
#define MAP_startSign 's' //地图文件起点标志
#define MAP_finishSign 'f' //地图文件终点标志
#define MAP_path_show '+' //地图显示时的路径标志
#define MAP_obstacle_show 'X' //地图显示时的障碍标志
#define MAP_passable_show ' ' //地图显示时的通行标志
#define MAP_start_point_show 's' //地图显示时的起点标志
#define MAP_finish_point_show 'f' //地图显示时的终点标志
class clsMAP8dB{
public:
clsNODE *start_point; //指向起点类的指针
clsNODE *finish_point; //记录终点类的指针
int x_size; //地图的宽,表示格的个数,从1起
int y_size; //地图的高,表示格的个数,从1起
int passable(clsNODE *, int); //判断地图是否通行,通行则返回1,不通行返回0
void display(); //输出地图
void InputMapFile(string mapFILENAME); //设置地图文件名并提取入临时变量同时执行转制
vector<vector<clsNODE *> > mapData; //地图数据,1为障碍,0为通行
void ShowPath(typePATH); //让地图显示路径
private:
vector<string> mapTEMP; //临时存储地图变量,存放字符串地图
void MapConvert(); //地图数字化
};
//-----------------------------------------------------------------------------
// 名称:InputMapFile
// 功能:提取地图文件
//-----------------------------------------------------------------------------
void clsMAP8dB::InputMapFile(string mapFILENAME){
ifstream mapFILE(mapFILENAME.c_str());
string strTEMP;
while(mapFILE.eof() == NULL){
mapFILE>>strTEMP;
//当前行不为空才加入地图数据中
if(strTEMP[0]){
mapTEMP.push_back(strTEMP);
strTEMP = "";
}
}
mapFILE.close();
MapConvert(); //转换字符串为数字格式,并存入数据
}
//-----------------------------------------------------------------------------
// 名称:MapConvert
// 功能:转换临时字符串为整形地图数据同时转制,1为障碍,0为通行
//-----------------------------------------------------------------------------
void clsMAP8dB::MapConvert(){
unsigned int i, j = 0;
char temp;
vector<clsNODE *> mapLINE;
clsNODE *p_clsNODE;
for(i = 0; i < mapTEMP[0].length(); i++){
mapLINE.clear();
for(j = 0; j < mapTEMP.size(); j++){
temp = mapTEMP[j][i];
switch(temp){
case MAP_obstacle : //设置地图障碍
p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
p_clsNODE->x = i;
p_clsNODE->y = j;
p_clsNODE->Flag = 1;
mapLINE.push_back(p_clsNODE);
break;
case MAP_startSign : //设置地图起点
p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
p_clsNODE->x = i;
p_clsNODE->y = j;
p_clsNODE->Flag = 0;
start_point = p_clsNODE;
mapLINE.push_back(p_clsNODE);
break;
case MAP_finishSign : //设置地图终点
p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
p_clsNODE->x = i;
p_clsNODE->y = j;
p_clsNODE->Flag = 0;
finish_point = p_clsNODE;
mapLINE.push_back(p_clsNODE);
break;
default : //设置地图通行
p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
p_clsNODE->x = i;
p_clsNODE->y = j;
p_clsNODE->Flag = 0;
mapLINE.push_back(p_clsNODE);
}
}
mapData.push_back(mapLINE);
}
x_size = mapData.size();
y_size = mapData[0].size();
}
/*
//-----------------------------------------------------------------------------
// 名称:display
// 功能:输出地图
//-----------------------------------------------------------------------------
void clsMAP8dB::display(){
int i, j;
//输出地图边框
for(i = 0; i < x_size + 2; i++)
cout<<MAP_obstacle_show;
cout<<endl;
for(i = 0; i < y_size; i++){
//输出地图边框
cout<<MAP_obstacle_show;
for(j = 0; j < x_size; j++){
switch(mapData[j][i]->Flag){
case 0 :
if((j == start_point->x) && (i == start_point->y))
cout<<MAP_start_point_show;
else if((j == finish_point->x) && (i == finish_point->y))
cout<<MAP_finish_point_show;
else
cout<<MAP_passable_show;
break;
case 1 :
if((j == start_point->x) && (i == start_point->y))
cout<<MAP_start_point_show;
else if((j == finish_point->x) && (i == finish_point->y))
cout<<MAP_finish_point_show;
else
cout<<MAP_obstacle_show;
break;
}
}
//输出地图边框
cout<<MAP_obstacle_show<<endl;;
}
//输出地图边框
for(i = 0; i < x_size + 2; i++)
cout<<MAP_obstacle_show;
cout<<endl;
cout<<"起点坐标=("<<start_point->x<<","<<start_point->y<<")"<<endl;
cout<<"终点坐标=("<<finish_point->x<<","<<finish_point->y<<")"<<endl;
}
//-----------------------------------------------------------------------------
// 名称:ShowPath
// 功能:输出地图路径
//-----------------------------------------------------------------------------
void clsMAP8dB::ShowPath(typePATH path){
int i, j;
clsNODE *now_p = start_point;
vector<vector<clsNODE *> > show_map_data;
show_map_data = mapData;
//将路径加入临时地图
show_map_data[now_p->x][now_p->y]->Flag = -1;
for(i = 0; i < path.size(); i++){
switch(path[i]){
case 1 :
now_p = show_map_data[now_p->x - 1][now_p->y + 1];
break;
case 2 :
now_p = show_map_data[now_p->x][now_p->y + 1];
break;
case 3 :
now_p = show_map_data[now_p->x + 1][now_p->y + 1];
break;
case 4 :
now_p = show_map_data[now_p->x - 1][now_p->y];
break;
case 6 :
now_p = show_map_data[now_p->x + 1][now_p->y];
break;
case 7 :
now_p = show_map_data[now_p->x - 1][now_p->y - 1];
break;
case 8 :
now_p = show_map_data[now_p->x][now_p->y - 1];
break;
case 9 :
now_p = show_map_data[now_p->x + 1][now_p->y - 1];
break;
}
show_map_data[now_p->x][now_p->y]->Flag = -1;
}
//输出地图+路径
for(i = 0; i < x_size + 2; i++)
//输出地图边框
cout<<MAP_obstacle_show;
cout<<endl;
for(i = 0; i < y_size; i++){
//输出地图边框
cout<<MAP_obstacle_show;
for(j = 0; j < x_size; j++){
switch(show_map_data[j][i]->Flag){
case -1 :
cout<<MAP_path_show;
break;
case 1:
cout<<MAP_obstacle_show;
break;
default :
cout<<MAP_passable_show;
}
}
//输出地图边框
cout<<MAP_obstacle_show<<endl;
}
//输出地图边框
for(i = 0; i < x_size + 2; i++)
cout<<MAP_obstacle_show;
cout<<endl;
}
*/
//-----------------------------------------------------------------------------
// 名称:passable
// 功能:判断从某一点沿某方向行走一格是否通行,通行返回1,不通行返回0
// 需传递坐标,方向
//-----------------------------------------------------------------------------
int clsMAP8dB::passable(clsNODE *p_point, int direction){
int x = p_point->x, y = p_point->y;
switch(direction){
case 2 :
if((y + 1 <= y_size - 1) && (mapData[x][y + 1]->Flag != 1))
return 1;
break;
case 4 :
if((x - 1 >= 0) && (mapData[x - 1][y]->Flag != 1))
return 1;
break;
case 6 :
if((x + 1 <= x_size - 1) && (mapData[x + 1][y]->Flag != 1))
return 1;
break;
case 8 :
if((y - 1 >= 0) && (mapData[x][y - 1]->Flag != 1))
return 1;
break;
case 1 :
if((x - 1 >= 0) && (y + 1 <= y_size - 1) && (mapData[x - 1][y + 1]->Flag != 1)
&& ((mapData[x][y + 1]->Flag != 1) && (mapData[x - 1][y]->Flag != 1)))
return 1;
break;
case 3 :
if((x + 1 <= x_size - 1) && (y + 1 <= y_size - 1) && (mapData[x + 1][y + 1]->Flag != 1)
&& ((mapData[x][y + 1]->Flag != 1) && (mapData[x + 1][y]->Flag != 1)))
return 1;
break;
case 7 :
if((x - 1 >= 0) && (y - 1 >= 0) && (mapData[x - 1][y - 1]->Flag != 1)
&& ((mapData[x][y - 1]->Flag != 1) && (mapData[x - 1][y]->Flag != 1)))
return 1;
break;
case 9 :
if((x + 1 <= x_size - 1) && (y - 1 >= 0) && (mapData[x + 1][y - 1]->Flag != 1)
&& ((mapData[x][y - 1]->Flag != 1) && (mapData[x + 1][y]->Flag != 1)))
return 1;
break;
default :
return 0;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -