迷宫随机生成算法Python实现

迷宫随机生成算法Python实现

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

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

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

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])


你可能感兴趣的:(算法,python,数据结构)