基于深度优先算法和广度优先算法的自动寻路迷宫实现

最近学习了深度优先和广度优先算法,于是想自己动手做一个小项目:自动走迷宫。

基于深度优先算法和广度优先算法的自动寻路迷宫实现_第1张图片

想要实现的功能是:随机生成迷宫地图和入口,出口位置,然后利用这两种搜索算法自动走出迷宫。

用到的工具是C++的MFC(微软基础类库),其内部封装了很多Window API函数。

要想在地图上画出物体移动的轨迹,那么就需要更新窗口,这里用到SetTimer定时器。

SetTimer(ETimerIdGameLoop,0,NULL);

表示:计时器的名称为ETimerIdGameLoop;时间间隔为0;使用onTimer函数。
然后在onTimer函数中通过查看计时器的至,可以触发响应。这里的响应就是我想要实现的功能。

基于深度优先算法和广度优先算法的自动寻路迷宫实现_第2张图片

上图是最终得到的界面。左边图片是起始位置(入口),右边图片是目标位置(出口)。

一、随机生成迷宫地图及出口和入口位置

1.1 把迷宫地图分解为一个一个小方块,小方块由起始位置(x,y),上、下、左、右是否有墙,以及墙的宽度,中间空白位置的宽度组成:

QQ(float x, float y, bool leftWall,  bool topWall,bool rightWall, bool bottomWall, 
float wallWidth, float spaceWidth) :
m_bLeft(leftWall), m_bTop(topWall), m_bRight(rightWall),m_bBottom(bottomWall), 
m_wallWidth(wallWidth), m_spaceLen(spaceWidth)

1.2 把整个地图作为一个小方块组成的矩阵vectorm_arr[][],得到地图矩阵:

for (int r = 0; r < m_row; ++r) {
	// 一行地图空间
	std::vector vRow;
	for (int c = 0; c < m_col; ++c) {
		vRow.push_back(QQ(
			static_cast(m_rectMap.X + c * step)
			, static_cast(m_rectMap.Y + r * step)
			, c == 0 ? true : (1 == rand() % 5)
			, r == 0 ? true : (1 == rand() % 5)
			, c == m_col - 1 ? true : (1 == rand() % 5)
			, r == m_row - 1 ? true : (1 == rand() % 5)
			, static_cast(m_wallWidth)
                        , static_cast(m_spaceLen)
			));
	}
		// 追加一行
	m_arr.push_back(vRow);
}

1.3 出入口的位置直接通过rand()函数实现

二、自动寻路

2.1 生成邻接矩阵:

typedef struct {
	int vexnum;//顶点的个数
	AdjMatrix arcs;//图的邻接矩阵
}Graph;
void createGraph(Graph &G,vector> m_arr);

邻接矩阵的元素arcs[a][b]表示地图中第a个小方块是否能到达第b个小方块,判断的条件是它们是否相邻,且中间无墙壁隔开。

2.2 深度优先和广度优先的寻路算法

这一部分参考了我的校友卢启衡的《基于宽度优先搜索的路径生成算法》论文以及https://www.cnblogs.com/Leo_wl/p/6251022.html 中的介绍。为了本博客能够清晰地展现本项目的步骤,这一部分会接下来在另一篇博客中介绍。

vector DFS(Graph G, int start, int target);//深度优先
vector BFS(Graph G, int start, int target);//广度优先

返回值为路径的矩阵,存储的是应走到哪个编号的小方块。

三、画出路径

通过使用_sleep()延时,间隔一定时间画出不断向出口移动的图片,得到路径。

你可能感兴趣的:(小项目)