Python如何实现迷宫生成器 |
您所在的位置:网站首页 › python迷宫可视化 › Python如何实现迷宫生成器 |
Python如何实现迷宫生成器
发布时间:2022-07-12 14:36:47
来源:亿速云
阅读:73
作者:iii
栏目:开发技术
这篇文章主要介绍了Python如何实现迷宫生成器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现迷宫生成器文章都会有所收获,下面我们一起来看看吧。 首先展示一下效果图: 我们先分析一下所需的库: 既然是生成器,每次生成的迷宫一模一样显然是说不过去的。因此,我们不可避免地要使用随机数(Random库)。迷宫一定是要绘制的,所以需要有一个GUI库或绘图库,这里我使用Pygame(Tkinter或Turtle其实都可以做到,但毕竟Pygame比较顺手)。与Pygame搭配,Sys似乎也是需要的(用于退出程序,但其实不使用似乎也无伤大雅)。然后是Tkinter.filedialog,主要用于询问保存路径(生成的迷宫总得保存吧)。当然,用Time加一个计时器似乎是锦上添花。 于是,就有: #coding:utf-8 import contextlib with contextlib.redirect_stdout(None): import pygame import random import sys import time from tkinter.filedialog import *这里要说明的是,由于导入Pygame时会输出版本信息等很多内容(这很影响美感),我们需要使用Contextlib阻止它输出。 接下来,我们需要询问一些参数: a=int(input("列数:")) b=int(input("行数:")) l=int(input("大小:")) saveit=input("是否保存:")然后,就要运行生成迷宫的程序了。同时,我们有必要计录一下时间(相当于开启计时器): print("生成中...") e = time.time()然后就是正式生成迷宫。在介绍这部分代码之前,我们需要了解一下算法: 第一步,生成一个由迷宫单元(白格)和墙(黑格)组成的网格。一行中迷宫单元的数量为迷宫的列数,一列找迷宫单元的数量为迷宫的行数。令左上角的迷宫单元为起点,右下角的迷宫单元为终点,打破起点左边与终点右边的墙,如图所示: 第二步,访问各迷宫单元。将起点标记为当前迷宫单元,当存在未被访问的迷宫单元(凡是曾经成为过当前迷宫单元的迷宫单元,都视为已访问)时,重复执行: 将周围的未被访问的迷宫单元加入表格; 如果表格中有迷宫单元: 将当前迷宫单元入栈(可以理解为将其加入一个叫做栈的表格); 从表格中随机选择一个迷宫单元; 打破当前迷宫单元与选择的迷宫单元之间的墙; 将选择的迷宫单元标记为当前迷宫单元; 如果表格中没有迷宫单元: 栈顶迷宫单元出栈(可以理解为将栈中的最后一个元素获取并删除); 将出栈的迷宫单元设为当前迷宫单元; 在循环结束以后,就会出现像文章开头效果图一样的结果。 接下来,我们就要将文字化的算法转化为Python的代码。 首先,程序是不认识图片的,它认识的是数据。所以我们需要设置一个二维列表,以此来用一串数据表示当前的图像。当然,我们可以顺便将第一步的设置一起完成: alist = [] aa=0 need=[] for j in range(2*a+1): if aa==0: aa = 1 alistone = [] for i in range(2*b+1): alistone.append(1) alist.append(alistone) else: aa=0 alistone = [] bb=0 for i in range(2*b+1): if bb==0: bb=1 alistone.append(1) else: bb = 0 need.append((j,i)) alistone.append(0) alist.append(alistone) alist[0][1]=0 alist[-1][-2]=0可以看到,除此以外我们还建立了一个列表need,里面存储了所有的迷宫单元。它的作用就是判断迷宫单元是否被访问,每次访问都会将迷宫单元从表格中删除,当表格中没有迷宫单元时,就说明所有迷宫单元都被访问了。 x=1 y=1 need.remove((1, 1)) listing=[] while len(need)>0: aroundit=[] try: if x-2 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |