Python迷宫生成器

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

作为一项古老的智力游戏,千百年来迷宫都散发着迷人的魅力。但是,手工设计迷宫费时又耗(脑)力,于是,我们有必要制作一个程序:迷宫生成器……
好吧,我编不下去了。但是,从上面的文字中,我们可以看出,我们此次的主题是:用Python实现一个迷宫生成器。
首先展示一下效果图:

我们先分析一下所需的库:
既然是生成器,每次生成的迷宫一模一样显然是说不过去的。因此,我们不可避免地要使用随机数(Random库)。迷宫一定是要绘制的,所以需要有一个GUI库或绘图库,这里我使用Pygame(Tkinter或Turtle其实都可以做到,但毕竟Pygame比较顺手)。与Pygame搭配,Sys似乎也是需要的(用于退出程序,但其实不使用似乎也无伤大雅)。然后是Tkinter.filedialog,主要用于询问保存路径(生成的迷宫总得保存吧)。当然,用Time加一个计时器似乎是锦上添花。
于是,就有:
  1. #coding:utf-8
  2. import contextlib
  3. with contextlib.redirect_stdout(None):
  4.     import pygame
  5. import random
  6. import sys
  7. import time
  8. from tkinter.filedialog import *
复制代码
这里要说明的是,由于导入Pygame时会输出版本信息等很多内容(这很影响美感),我们需要使用Contextlib阻止它输出。
接下来,我们需要询问一些参数:
  1. a=int(input("列数:"))
  2. b=int(input("行数:"))
  3. l=int(input("大小:"))
  4. saveit=input("是否保存:")
复制代码
然后,就要运行生成迷宫的程序了。同时,我们有必要计录一下时间(相当于开启计时器):
  1. print("生成中...")
  2. e = time.time()
复制代码
然后就是正式生成迷宫。在介绍这部分代码之前,我们需要了解一下算法:
第一步,生成一个由迷宫单元(白格)和墙(黑格)组成的网格。一行中迷宫单元的数量为迷宫的列数,一列找迷宫单元的数量为迷宫的行数。令左上角的迷宫单元为起点,右下角的迷宫单元为终点,打破起点左边与终点右边的墙,如图所示:

第二步,访问各迷宫单元。将起点标记为当前迷宫单元,当存在未被访问的迷宫单元(凡是曾经成为过当前迷宫单元的迷宫单元,都视为已访问)时,重复执行:

  • 将周围的未被访问的迷宫单元加入表格;
  •  如果表格中有迷宫单元:

    • 将当前迷宫单元入栈(可以理解为将其加入一个叫做栈的表格);
    • 从表格中随机选择一个迷宫单元;
    • 打破当前迷宫单元与选择的迷宫单元之间的墙;
    • 将选择的迷宫单元标记为当前迷宫单元;

  • 如果表格中没有迷宫单元:

    • 栈顶迷宫单元出栈(可以理解为将栈中的最后一个元素获取并删除);
    • 将出栈的迷宫单元设为当前迷宫单元;

在循环结束以后,就会出现像文章开头效果图一样的结果。
接下来,我们就要将文字化的算法转化为Python的代码。
首先,程序是不认识图片的,它认识的是数据。所以我们需要设置一个二维列表,以此来用一串数据表示当前的图像。当然,我们可以顺便将第一步的设置一起完成:
  1. alist = []
  2. aa=0
  3. need=[]
  4. for j in range(2*a+1):
  5.     if aa==0:
  6.         aa = 1
  7.         alistone = []
  8.         for i in range(2*b+1):
  9.             alistone.append(1)
  10.         alist.append(alistone)
  11.     else:
  12.         aa=0
  13.         alistone = []
  14.         bb=0
  15.         for i in range(2*b+1):
  16.             if bb==0:
  17.                 bb=1
  18.                 alistone.append(1)
  19.             else:
  20.                 bb = 0
  21.                 need.append((j,i))
  22.                 alistone.append(0)
  23.         alist.append(alistone)
  24. alist[0][1]=0
  25. alist[-1][-2]=0
复制代码
可以看到,除此以外我们还建立了一个列表need,里面存储了所有的迷宫单元。它的作用就是判断迷宫单元是否被访问,每次访问都会将迷宫单元从表格中删除,当表格中没有迷宫单元时,就说明所有迷宫单元都被访问了。
[code]x=1y=1need.remove((1, 1))listing=[]while len(need)>0:    aroundit=[]    try:        if x-2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表