广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现迷宫自动寻路实例
  • 290
分享到

Python实现迷宫自动寻路实例

2024-04-02 19:04:59 290人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录背景预处理寻路算法测试优化绘制路径结语背景 我打开手机,发现有人在QQ空间里叫嚣。 看他得意的样子,显然是在家里呆久了,已经忘了天有多高。 预处理 设计一个迷宫自动寻路算法并不

背景

我打开手机,发现有人在QQ空间里叫嚣。

看他得意的样子,显然是在家里呆久了,已经忘了天有多高。

预处理

设计一个迷宫自动寻路算法并不难,但是对于当下这个任务而言,第一个棘手的地方在于,如何把这个迷宫变成计算机认识的样子,也就是迷宫图片的矩阵化。

图片的大小是397×390。先把四周的白边裁掉,再把这幅图中的每一个像素二值化,再根据颜色赋值,黑色用0表示,白色用1表示,建立一个0/1矩阵。考虑到迷宫的边界都是封闭的,为了防止由于图片质量问题导致某些看上去是0的地方其实是1,在之后走迷宫的过程中造成一些可预知的影响,比如列表的越界等,我们再把四条边上的元素全部强制变成0。这时,对迷宫的预处理已经基本完成,如果我们把1隐藏,把所有的0打印出来,经过放缩之后,就得到了这样的结果:

寻路算法

得到了这个迷宫矩阵之后,我们需要找到一条从左上角到右下角的路。

印象中我与有关走迷宫的方法有过一面之缘,那是在一节算法选修课上,老师在台上深情地讲着深度优先搜索与广度优先搜索,我在台下忘我地抄着大物实验报告。至今,提起这两个概念,我唯一的印象只有它俩的英文缩写一个是D开头一个是B开头。

不过没关系。当年陈刀仔他能用20块赢到3700万,我用for循环搞定这个小迷宫,没有问题。

一般来说,迷宫的内部是不封闭的,我从任意一个地方倒水,总能把整个迷宫填满。因此,假定我们有一个小老鼠,把它放在起点,如果它能够保证自动避障、不踩走过的路、遇死胡同回退,那么它总能找到终点。

因此,我们定义一个点(x,y),初始位置为(1,1),也就是边界内左上角的第一个点。

定义两个列表,一个是path,用来存放它最终确定下来的路径(也就是那个最终走到终点的路径)中的每一个点;另一个是footprint,用来存放所有它走过的地方,包括它走的错路。两个列表形如[(1,1),(1,2),(2,2),......,(m,n)]

再定义四种动作,分别是:向下走一步(y=y+1),向右走一步(x=x+1),向左走一步(x=x-1)和向上走一步(y=y-1)。我们每次让这个点尝试四种动作,如果能走就让它走。判断是否不能走是看下一步的坐标是否是墙或者是足迹。把新的点放进pathfootprint里,成为新的足迹。

确定四个动作的优先级,即下、右、左、上,能下则下,不能下则右,不能右则左,不能左则上。这样它就不会在一个空地上平白无故地乱转,而是具有一定方向性地探索。

接下来,让算法具备自动回退的能力。我们想象一个简单情景:

这个图不准确,不满足本文的优先级设定,但也足以表意

遇到这样的死胡同,假如进来的时候足迹把出去的路给封死了,那么这个点就没办法再出来了。一旦我们发现这个点陷入了绝境,哪里都不能走了,这时候我们就得让它原路返回。实迷途其未远,回到上一个路口也很简单,无非就是删掉这一段路线。方法就是把path列表里的最后一个元素逐一弹出列表,由于我们有footprint记录,所有它走过的地方都不能再走第二遍,所以只要这条错误的路没有完全退出去,退到哪一步都是四个方向都不能走的,因为附近都被它走过了。这样它就会一直退到我们期望的那个地方,也就是它误入歧途的那个路口。

测试

下面,我们让它开始循环。只要它的坐标不等于终点的坐标,我们就一直让它不断地探索。运行结束后,我们得到了一条迂回的曲线,如图(局部)。

程序成功得到了一条可以通往终点的路径,但这条路径过于冗杂,以上图为例,所有宽度不为1的地方都是这个点绕来绕去所导致的。因此,该路径还有待优化。

优化

我们考虑如下一种简单情况:

在这条路线中,显然4~9属于没有意义的兜圈,正确的路线应该是从3直接到10

我们的优化方法是:如果第n步(x,y),从第n+2步(也就是下一步的下一步),一直到最后一步,这中间只要有一步落在(x,y)一步之遥的地方,就把从第n+1步到这一步的所有路径点都删掉。拿上面这个例子来说,我们从第1步开始检查。检查到第3步时,我们从第5步开始看,一直看到第10步发现10落在3一步就能到达的地方,这时我们把中间的4-9全部删掉,直接把10接在3的后面。

不过,考虑到后面可能还会有更优的情况,比如说从12开始继续绕,绕到20发现20刚好落在3的上面,那我们事实上应该直接把20接在3后面,12也要丢掉,之前的方法有些缺陷。因此,为了避免这种情况,我们逆着循环,对于第3步而言,我们从第20步往前循环,一直循环到第5步,看是否有3能直接到达的地方。这样我们就能对这条路线进行最大优化了。

绘制路径

最终,我们得到了正确而简洁的路径,也记录了曾经走过的错路和多走的路。

根据矩阵和图片的对应关系,我们把图片里对应的像素改变颜色,其它点不作更改。

绘制路径:

优化之前:

全部足迹:

结语

至此,我们已经把这个问题解决得差不多了。整个程序在我的电脑上运行下来大概需要三五分钟这个样子,毕竟是只用for循环的暴力方法。

--结束END--

本文标题: Python实现迷宫自动寻路实例

本文链接: https://www.lsjlt.com/news/138446.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现迷宫自动寻路实例
    目录背景预处理寻路算法测试优化绘制路径结语背景 我打开手机,发现有人在QQ空间里叫嚣。 看他得意的样子,显然是在家里呆久了,已经忘了天有多高。 预处理 设计一个迷宫自动寻路算法并不...
    99+
    2022-11-13
  • Python实现随机生成迷宫并自动寻路
    目录Python深搜版:Python 广搜版lua版:Python深搜版: 核心在于带随机的深搜(见代码第23到27行,其实也可以用22行代替这几行代码,你可以试着把第24行的数字4改大或者改小,即调整随机程度) ...
    99+
    2022-06-02
    Python随机生成迷宫 Python 迷宫自动寻路
  • C++ DFS算法实现走迷宫自动寻路
    C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下 深度优先搜索百度百科解释: 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Searc...
    99+
    2022-11-12
  • C++ DFS算法如何实现走迷宫自动寻路
    小编给大家分享一下C++ DFS算法如何实现走迷宫自动寻路,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容...
    99+
    2023-06-15
  • C++ 基于BFS算法的走迷宫自动寻路的实现
    目录1.效果图2.实现代码1.队列方法类2.地图方法类3.main函数3.思路1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改...
    99+
    2022-11-12
  • Javascript结合Vue实现对任意迷宫图片的自动寻路
    目录前言二维数组,一本道映射基础界面广度优先,地毯式搜索地图编辑优化寻路算法对图片进行寻路自定义起始点,以及随时变更路线处理彩色图片性能优化前言 可以直接体验最终效果:https:/...
    99+
    2022-11-12
  • 如何使用Python实现多路径迷宫
    小编给大家分享一下如何使用Python实现多路径迷宫,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的数据类型有哪些python的数据类型:1. 数字类...
    99+
    2023-06-14
  • 教你怎么用Python实现多路径迷宫
    目录一、思路介绍二、图示三、分区域演示代码一、思路介绍 在已有的单路径迷宫基础上打开一块合适的墙就可以构成2路径的迷宫。 打开的墙不能和已有的路径过近。 1...
    99+
    2022-11-12
  • Python实现过迷宫小游戏示例详解
    目录前言开发工具环境搭建原理简介主要代码前言 今天为大家带来解闷用的过迷宫小游戏分享给大家好了。让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygam...
    99+
    2022-11-12
  • Python如何实现迷宫生成器
    这篇文章主要介绍了Python如何实现迷宫生成器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现迷宫生成器文章都会有所收获,下面我们一起来看看吧。首先展示一下效果图:我们先分析一下所需的库:既...
    99+
    2023-07-02
  • Python如何实现过迷宫小游戏
    小编给大家分享一下Python如何实现过迷宫小游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发工具Python版本: 3.6.4相关模块:pygame模块;以及一些Python自带的模块。环境搭建安装Python并添...
    99+
    2023-06-22
  • python迷宫问题深度优先遍历实例
    一、迷宫介绍 用python解迷宫问题,迷宫是一个二维列表,本次用深度优先解开迷宫问题。定义起点和终点,从一个位置到下一个位置只能通过向上或下或左或右,走一步来实现,从起点出发,如...
    99+
    2022-11-12
  • Python实现迷宫生成器的详细代码
    作为一项古老的智力游戏,千百年来迷宫都散发着迷人的魅力。但是,手工设计迷宫费时又耗(脑)力,于是,我们有必要制作一个程序:迷宫生成器…… 好吧,我编不下去...
    99+
    2022-11-11
  • python实现A*寻路算法
    目录A* 算法简介关键代码介绍保存基本信息的地图类搜索到的节点类算法主函数介绍代码的初始化完整代码A* 算法简介 A* 算法需要维护两个数据结构:OPEN 集和 CLOSED 集。OPEN 集包含所有已搜索到的待检测...
    99+
    2022-06-02
    python A*寻路算法 python A*算法
  • C++实现控制台随机迷宫的示例代码
    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常。大概有100行代码是来自网络的,我也做了改动,侵权请联系删除。 这个代码不能算是完美,...
    99+
    2022-11-12
  • python实现地牢迷宫生成的完整步骤
    目录基本属性生成房间生成墙壁生成门口生成通道总结 基本属性 定义当前地牢的等级,地图长宽,房间数量,房间的最小最大长度,如下 class Map: def __...
    99+
    2022-11-12
  • 基于C语言实现迷宫游戏的示例代码
    目录C语言迷宫游戏定义地图打印地图方法一打印地图方法二定义起点和终点位置实现读取按键实现小球下向下移动一步总结小球移动规律实现重新打印地图实现连续移动实现小球下向上下左右移动实现小球...
    99+
    2022-11-13
  • 基于Unity3D实现3D迷宫小游戏的示例代码
    目录一、前言二、构思三、正式开发3-1、搭建场景3-2、设置出入口3-3、添加角色3-4、实现角色移动3-5、出入口逻辑四、总结一、前言 闲来无事,从零开始整个《3D迷宫》小游戏。 ...
    99+
    2022-11-13
  • Java实现可视化走迷宫小游戏的示例代码
    目录效果图数据层视图层控制层效果图 数据层 本实例需要从 .txt 文件中读取迷宫并绘制,所以先来实现文件读取IO类 MazeData.java,该程序在构造函数运行时将外部文件...
    99+
    2022-11-13
    Java走迷宫游戏 Java 迷宫游戏 Java 迷宫
  • 使用python求解迷宫问题的三种实现方法
    目录前言递归求解回溯求解队列求解总结前言 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。 在介绍具体算法之前,先考虑将迷宫数字化。...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作