迷宫随机生成算法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])