用python开发简易的自动走迷宫脚本

迷宫(Maze)指的是充满复杂通道,很难找到从其内部到达入口或从入口到达中心的道路,道路复杂难辨,人进去不容易出来的建筑物。更多Python视频、源码、资料加群683380553免费获取

假设一个迷宫,它长这样(我自己画的,你也可以通过改变下面的矩阵从而改变迷宫的形状)。

用python开发简易的自动走迷宫脚本_第1张图片

 

 

起始点是红色小方块,终点是绿色的小方块,其中蓝色的■代表墙。

我们可以把迷宫抽象成一个矩阵,其中1代表墙,0代表有路,那么有

用python开发简易的自动走迷宫脚本_第2张图片

 

使用numpy模块的矩阵,不仅仅是它比双重list代表的矩阵好,还有的是把元素设置为int8,每个元素在-127到128变化即可(实际上根本用不到那么多),况且int8只占一个字节。

定义四个方向

有游戏就有外挂,用python开发简易的自动走迷宫脚本,还有谁?

 

用python开发简易的自动走迷宫脚本_第3张图片

 

我们理一下思路,走迷宫的决策是:

  • 标记当前位置
  • 从栈中弹出一个位置和要走的方向,也就是当前位置和未知方向
  • 看看未知方向,是否可以走。
  • 如果有可以走,把当前位置和下一个未知方向压入栈。把新位置和一个未知方向压入栈,返回1步骤,如果未知方向不可以走,再探查下一个未知方向。如果发现是死路,退到之前的位置再看看。
  • 下一个未知点是终点,搜索结束。返回路径
  • 一直退到出发点直到栈长度为0,说明没有路径可以走到终点。

 

为什么要标记当前位置,我用一个小漫画说明

用python开发简易的自动走迷宫脚本_第4张图片

 

有游戏就有外挂,用python开发简易的自动走迷宫脚本,还有谁?

 

有游戏就有外挂,用python开发简易的自动走迷宫脚本,还有谁?

 

mark标记函数很简单,把pos在地图maze上标记为2,表示走过了。

passable函数表示是否可以走,如果位置pos值为0就可以走。

用python开发简易的自动走迷宫脚本_第5张图片

 

就这样,一个基于栈做为搜索的函数就写成了,更重要的是,它是非递归的,如果用递归写虽然简洁可是不容易理解。

其中,基于栈为搜索方式的搜索方法叫深度优先搜索(Depth First Search),基于队列的叫宽度优先搜索 (Breadth First Search)。

运行函数,返回[((1, 1), 2), ((2, 1), 2), ((3, 1), 1), ((3, 2), 1), ((3, 3), 1), ((3, 4), 1), ((3, 5), 2), ((4, 5), 2), ((5, 5), 3), ((5, 4), 3), ((5, 3), 2), ((6, 3), 2), ((7, 3), 2), ((8, 3), 1), ((8, 4), 1), ((8, 5), 4), ((7, 5), 1), ((7, 6), 1), ((7, 7), 1), ((7, 8), 2), ((8, 8), 1), ((8, 9), 0)]

其中list的每一个元素的第一个代表坐标,将每一个元素链接起来就是路径。我们可以使用matplotlib画出迷宫和路线

用python开发简易的自动走迷宫脚本_第6张图片

 

用python开发简易的自动走迷宫脚本_第7张图片

 

有趣的是,走迷宫问题也可以使用递归来实现,具体操作如下,代码很简洁,栈(运行栈)在运行的时候,在程序内部出现的,用于保存每层函数递归的信息。

用python开发简易的自动走迷宫脚本_第8张图片

 

用python开发简易的自动走迷宫脚本_第9张图片

你可能感兴趣的:(python)