Python利用Prim算法生成迷宫

 更新时间:2023年01月06日 09:03:13   作者:Leleprogrammer  
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。这篇文章将利用Prim算法实现迷宫的生成,感兴趣的可以了解一下

Prim算法随机生成后的迷宫数列矩阵如下图:

15x15:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 s 0 1 0 1 0 1 1 1 1 1 0 1 0 
0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 
0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 
0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 
0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 
0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 
0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 
0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 
0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 
0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 
0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 
0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 
0 1 1 1 0 1 1 1 1 1 1 e 0 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

27x27:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 s 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 
0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 
0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 
0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 
0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 
0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 
0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 
0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 
0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 
0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 
0 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 
0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 
0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 
0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 
0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 
0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 
0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 
0 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 
0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 
0 1 1 1 e 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

实现该效果的代码如下: 

import random as rd
 
nearmaybe=[
    [-2,0],
    [2,0],
    [0,-2],
    [0,2]
]
 
def createMaze(row,col):
    maze=[[0 for i in range(col)] for i in range(row)]
    check=[]
    firstrow=rd.randrange(1,row-2,2)
    firstcol=rd.randrange(1,col-2,2)
    maze[firstrow][firstcol]=1
    check.append([firstrow,firstcol])
    while len(check):
        c=rd.choice(check)
        nears=[]
        conditions=[]
        for maybe in nearmaybe:
            conditions.append([c[0]+maybe[0],c[1]+maybe[1]])
        for condition in conditions:
            if condition[0]>=1 and condition[0]<=row-2 \
                    and condition[1]>=1 and condition[1]<=col-2:
                nears.append([condition[0],condition[1]])
        for n in nears.copy():
            if maze[n[0]][n[1]]:
                nears.remove(n)
        for block in nears:
            if block[0]==c[0]:
                if block[1]<c[1]:
                    maze[block[0]][c[1]-1]=1
                    maze[block[0]][block[1]]=1
                    check.append([block[0],block[1]])
                else:
                    maze[block[0]][block[1]-1]=1
                    maze[block[0]][block[1]]=1
                    check.append([block[0],block[1]])
            else:
                if block[0]<c[0]:
                    maze[c[0]-1][block[1]]=1
                    maze[block[0]][block[1]]=1
                    check.append([block[0],block[1]])
                else:
                    maze[block[0]-1][block[1]]=1
                    maze[block[0]][block[1]]=1
                    check.append([block[0],block[1]])
        if not len(nears):
            check.remove(c)
    maze[1][1]="s"
    while True:
        c=rd.randint(1,col-2)
        if maze[row-2][c]:
            maze[row-2][c]="e"
            break
 
    return maze

调用该函数的方法:

maze=createMaze(27,27)
for l in maze:
    for s in l:
        print(s,end=" ")
    print()

CreateMaze传入的两个参数必须都是单数,否则程序可能会无法运行!

下面的for循环遍历就是将生成的迷宫矩阵打印出来

S表示出发点

1表示路

0表示墙

E表示终点

生成迷宫矩阵后,就可以将其引用到游戏中去啦!

到此这篇关于Python利用Prim算法生成迷宫的文章就介绍到这了,更多相关Python Prim生成迷宫内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现棋盘覆盖问题及可视化

    python实现棋盘覆盖问题及可视化

    这篇文章主要给大家介绍了关于python实现棋盘覆盖问题及可视化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python显示生日是星期几的方法

    python显示生日是星期几的方法

    这篇文章主要介绍了python显示生日是星期几的方法,涉及Python使用date模块操作日期的技巧,需要的朋友可以参考下
    2015-05-05
  • python中的列表和元组实例详解

    python中的列表和元组实例详解

    在Python中序列是最基本的数据结构,它是一块用于存放多个值得连续内存空间,Python中内置了5个常用的序列结构,分别是列表、元组、集合、字典和字符串,本文将详细讲解python中的列表和元组,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • PyTorch 实现L2正则化以及Dropout的操作

    PyTorch 实现L2正则化以及Dropout的操作

    这篇文章主要介绍了PyTorch 实现L2正则化以及Dropout的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python如何实现多层级自动赋值字典

    python如何实现多层级自动赋值字典

    这篇文章主要介绍了python如何实现多层级自动赋值字典问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python爬虫开发与项目实战

    Python爬虫开发与项目实战

    本书从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言和Web前端基础知识引领读者入门,之后介绍动态爬虫原理以及Scrapy爬虫框架,最后介绍大规模数据下分布式爬虫的设计以及PySpider爬虫框架等,需要的朋友快来下载电子版吧
    2020-12-12
  • pandas中NaN缺失值的处理方法

    pandas中NaN缺失值的处理方法

    当我们用python进行数据处理时会遇到很多缺失值,对缺失值我们需要进行删除或者填补,本文主要介绍了pandas中NaN缺失值的处理方法,感兴趣的可以了解一下
    2021-05-05
  • Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)

    Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(

    这篇文章主要介绍了Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中,本文给大家介绍的非常详细,需要的朋友可以参考下
    2020-05-05
  • Python技巧之四种多线程应用分享

    Python技巧之四种多线程应用分享

    这篇文章主要介绍了Python中多线程的所有方式,包括使用threading模块、使用concurrent.futures模块、使用multiprocessing模块以及使用asyncio模块,希望对大家有所帮助
    2023-05-05
  • Python实现的一个自动售饮料程序代码分享

    Python实现的一个自动售饮料程序代码分享

    这篇文章主要介绍了Python实现的一个自动售饮料程序代码分享,就是用python实现的生活中一种投币式自动售饮料机的内部程序判断代码,需要的朋友可以参考下
    2014-08-08

最新评论