该项目不过是一个平平无奇的小作业,基于python3.8开发,目前提供两种迷宫生成算法与三种迷宫求解算法,希望对大家的学习有所帮助。
项目如果有后续的跟进将会声明,目前就这样吧~代码在这github_code
效果图如下所示:

刚刚说了,这是python3.8,同时我们还包含了两个第三方库,这些我将会放在requirement.txt中。是的,我现在意识到它非常重要,因为跑别人代码没有它真的很容易环境冲突。
项目很简单,一共只有三个文件,所以如果是想要学习的朋友应该很容易可以梳理清楚文件的关系。
ui.py 是项目的UI设计以及运行入口,所有的逻辑都是基于此开发的;
Generate.py 是项目中负责生成迷宫的,提供了DFS、PRIM两种生成方式,具体的逻辑一会会介绍;
solve.py 是项目中负责迷宫求解的部分,提供了DFS、BFS、A*三种迷宫求解方案。
该部分介绍一下两个迷宫生成算法的主要逻辑。
深度搜素算法构建迷宫。我在实现该算法的时候和网络上的方法略有出入,大体流程如下:
maze_map和记录迷宫访问状态的maze_state;同时还有一个记录DFS状态的memory列表。memory列表不为空时,开始循环:
memory最后一个元素可以向外扩展:即与该元素相邻的元素存在未被访问过的元素,则将该元素添加进入列表中,如果有多个未被访问过的元素,则随机选择一个进入,来确保迷宫的随机性。并将添加进来的元素的maze_state标记为1。memory最后一个元素无法向外扩展,则将该元素从memory中弹出。这里需要注意的时,如何判断一个元素是否可以向外扩展呢?这里的判断条件如下:
通过DFS生成的迷宫图效果如下图所示:

PRIM构建迷宫。该算法构建迷宫构建流程如下图所示:
同样的,这里的合法的探索方向也有限制条件:
通过PRIM生成的迷宫图效果如下图所示:

在完成了迷宫设计后,接下来开始设计求解方法。
DFS是经典的迷宫求解算法,通过深度搜索探索全部路径,直到到达终点,这在仅有一条通路的情况下是还不错的。但通常现实环境是复杂的,存在多条通路的,在这种情况下DFS很难获得最优路径。
接下来介绍DFS的实现流程:
memory;同样的,算法方向的选择也是核心问题之一:
BFS也是常用的迷宫问题求解算法,通过广度优先的方法,通常来说广度优先搜索在路径搜索中可以得到最优解。如果迷宫有且仅有唯一解,该算法所探索的格子一般远高于DFS探索的空间,但如果迷宫中有多个路径存在时,该算法可以获得最优解。接下来时BFS算法逻辑:
memory,同时我们还需要一个存放每一次迭代的所有坐标的列表;memory和标志位;在方向的统计上,同BFS一样。
DFS虽然可以求得最优路径,但由于其的复杂度极高,且遍历空间极大的问题,在实际使用中通常不被采用;A*算法是在其后的佼佼者,通过启发式搜索的方式,在程序运行的阶段,对于其当前位置的移动损耗和预计损耗作为评估指标,来实现剪枝的作用。其流程如下所示:
memory、损耗优先队列cost;cost最小的元素进行拓展;cost,并添加入cost队列中。还有一些迷宫生成方法没有加入,如递归分割迷宫生成法。
如果拓展结果存在值,则计算新节点的cost,并添加入cost队列中。
4. 检查是否到达终点,到达则跳出循环。
还有一些迷宫生成方法没有加入,如递归分割迷宫生成法。
在UI输出坐标移动位置时,如果地图过大会导致页面卡死。