迷宫随机生成算法Python实现

迷宫随机生成算法Python实现

最近在B站看到一个关于迷宫随机生成算法的视频《从迷宫生成算法到创意编程》,受到启发,就用刚学的Python语言尝试实现了一下,代码只是模拟算法生成的过程,还没有把迷宫可视化,不过只要解决了算法问题,其余都只是细节问题,因为代码可以一键生成任意大小、难度的迷宫,而人脑是很难想象出来的。

算法过程结果目前未可视化,只是以路线的方式呈现,需要手动转化成图形。
举例如下:(为了绘制方便,只取5X5的迷宫作为示例,实际上可以任意大小)
1.运行代码生成路线:
在这里插入图片描述
2.绘制:
将路线串起来,绘制出边框,然后擦去线路。
在这里插入图片描述
只要设置LENGTH和WIDTH值,可以生成任意大小的迷宫路线:(图为10X10)
在这里插入图片描述

"""迷宫随机生成算法"""

from random import randint,choice

LENGTH=10
#一行的格数
WIDTH=10
#一列的格数
maps=list(range(1,LENGTH*WIDTH+1))
record_path=[]
#记录去过的小格
finish_cell=[]
#记录无墙可砸的小格

"""判断该格是否可去"""
def available(n):
    cp=[]
    if n-1 in maps and (n-1)%LENGTH != 0:
        cp.append(now-1)
    if n+1 in maps and n%LENGTH != 0:
        cp.append(n+1)
    if n+LENGTH in maps:
        cp.append(n+LENGTH)
    if n-LENGTH in maps:
        cp.append(n-LENGTH)

    if cp:
        return True
    else:
        return False

"""随机生成路线"""
now=1
while len(finish_cell) != LENGTH*WIDTH:
    record_path.append(now)
    if now in maps:
        maps.remove(now)
    choice_path=[]
    if now-1 in maps and (now-1)%LENGTH != 0:
        choice_path.append(now-1)
    if now+1 in maps and now%LENGTH != 0:
        choice_path.append(now+1)
    if now+LENGTH in maps:
        choice_path.append(now+LENGTH)
    if now-LENGTH in maps:
        choice_path.append(now-LENGTH)
    
    if choice_path:
        now=choice(choice_path)
    else:
        finish_cell.append(now)
        while True:
            now=choice(record_path)
            if available(now):
                break
            else:
                finish_cell.append(now)
                if len(finish_cell) == LENGTH*WIDTH:
                    break


"""判断两个数字是否通路"""
def next_step(i):
    distance=record_path[i+1]-record_path[i]
    if distance == LENGTH :
        return True
    if distance == -LENGTH:
        return True
    elif distance == 1 and record_path[i]%LENGTH != 0:
        return True
    elif distance ==-1 and record_path[i]%LENGTH != 1:
        return True
    else:
        return False

"""打印路线"""
i=0
while i < len(record_path)-1:
    if next_step(i):
        print(record_path[i],end='')
        print('->',end='')
    else:
        print(record_path[i])
    i+=1
print(record_path[i])


  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值