用Python写一个走迷宫的小程序(图形化:matplotlib,dfs,prim)

本文介绍了使用Python创建迷宫并实现动态寻路的程序,利用matplotlib进行图形化展示,迷宫生成算法包括Prim和DFS,其中DFS生成的迷宫更为真实。程序通过二维数组记录路径,采用BFS或DFS算法寻找路径,并详细讨论了不同方向的画路径策略。此外,还提供了将Python代码打包成exe的教程链接。
摘要由CSDN通过智能技术生成

不要脸的放到了Github上面,嘿嘿。

Github:https://github.com/Radium1209/Maze

先看一下动态效果图(慢放):

 

所需要的库:

matplotlib

# for Linux
# python 3+
$ sudo apt-get install python3-matplotlib

# python 2+
$ sudo apt-get install python-matplotlib

numpy

# for Linux
# python 3+
$ sudo pip3 install numpy

# python 2+
$ sudo pip install numpy

 

首先生成迷宫:

主要用了两个算法:Prim和dfs

总结:DFS生成的比较像真正的迷宫,所以默认用了DFS生成迷宫

具体参考:https://blog.csdn.net/juzihongle1/article/details/73135920

先输入n,m,会生成一个迷宫(prim生成),然后会动态的走完整个迷宫。

走迷宫用的是bfs(dfs)算法,具体不多说了,关键难点在于记录路径:

我是用一个path二维数组来记录路径的,每一个位置存的是这个位置的上一个位置,在输出的时候倒着从最后一个点回溯到第一个点存入一个栈,最后正常出栈就是路径了。

 

画路径:有上,下,左,右,上左,上右,下左,下右,左下,左上,右上,右下12中情况分类讨论(实在是太麻烦了)。

 

最后用pyinstaller生成exe

教程:https://blog.csdn.net/Radium_1209/article/details/82939368

 

 

全部代码(已更新,添加了DFS寻路):

import random
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm
from collections import deque

def show_maze(Maze):
    plt.imshow(Maze, cmap=cm.Wistia_r, interpolation='none')
    # plt.ion()
    plt.show()


def find_path_bfs(image, M):
    path = np.zeros((num_rows, num_cols, 2))
    vis = np.zeros((num_rows, num_cols))
    vis[0][0] = 1
    Queue = deque()
    Queue.append((0, 0))
    while(Queue):
        temp = Queue.popleft()
        nr = temp[0]
        nc = temp[1]

        if (nc == num_cols - 1) and (nr == num_rows - 1):
            show_path(image, path)
            break
        if (nc > 0) and (not vis[nr][nc - 1]) and (M[nr][nc][0]):
            vis[nr][nc] = 1
            Queue.append((nr, nc - 1))
            path[nr][nc - 1][0] = nr
            path[nr][nc - 1][1] = nc
        if (nr > 0) and (not vis[nr - 1][nc]) and (M[nr][nc][1]):
            vis[nr][nc] = 1
            Queue.append((nr - 1, nc))
            path[nr - 1][nc][0] = nr
            path[nr - 1][nc][1] = nc
        if (nc < num_cols - 1) and (not vis[nr][nc + 1]) and (M[nr][nc][2]):
            vis[nr][nc] = 1
            Queue.append((nr, nc + 1))
            path[nr][nc + 1][0] = nr
            path[nr][nc + 1][1] = nc
        if (nr < num_rows - 1) and (not vis[nr + 1][nc]) and (M[nr][nc][3]):
            vis[nr][nc] = 1
            Queue.append((nr + 1, nc))
            path[nr + 1][nc][0] = nr
            path[nr + 1][nc][1] = nc


def find_path_dfs(image, M):
    path = np.zeros((num_rows, num_cols, 2))
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值