对递归回溯生成随机迷宫的演示

回顾: 

[python实现] 递归回溯(深度优先)构造随机迷宫 - 泥烟 - 博客园 (cnblogs.com)


在上次的基础上稍加改动,可以更加直观地欣赏整个过程

美中不足的是我想不停地原地输出并刷新,可惜找了很多文章都没能达到理想的效果,

希望有大佬有实现过类似的情况可以指点一二 hhh

 

 

# # -*- coding: utf-8 -*-
# """
# Created on Thu Nov 18 13:33:53 2021

# @author: Knight
# """

import sys
import time
import os
from enum import Enum
from random import randint, choice


class DIRECTOIN(Enum):
    UP = 0,
    LEFT = 1,
    DOWN = 2,
    RIGHT = 3,


class TYPE(Enum):
    EMPTY = 0,
    BLOCK = 1


class Map():
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # 全部初始化成墙体
        self.map = [[1 for x in range(self.width)] for y in range(self.height)]

    def setMap(self, x, y, value):
        if value == TYPE.EMPTY:
            self.map[y][x] = 0
        elif value == TYPE.BLOCK:
            self.map[y][x] = 1

    def checkVisited(self, x, y):
        return self.map[y][x] != 1

    def showMap(self):
        for row in self.map:
            mp = ''
            for item in row:
                if item == 0:
                    mp += '  '
                elif item == 1:
                    mp += ' @'
            print(mp)


def checkPosition(map, x, y, w, h, waitingList):
    direction = []
    if y > 0:
        if not map.checkVisited(2 * x + 1, 2 * (y - 1) + 1):
            direction.append(DIRECTOIN.UP)
    if x > 0:
        if not map.checkVisited(2 * (x - 1) + 1, 2 * y + 1):
            direction.append(DIRECTOIN.LEFT)
    if y < h - 1:
        if not map.checkVisited(2 * x + 1, 2 * (y + 1) + 1):
            direction.append(DIRECTOIN.DOWN)
    if x < w - 1:
        if not map.checkVisited(2 * (x + 1) + 1, 2 * y + 1):
            direction.append(DIRECTOIN.RIGHT)

    if len(direction):
        # 随机选择方向
        direc = choice(direction)
        if direc == DIRECTOIN.UP:
            map.setMap(2 * x + 1, 2 * (y - 1) + 1, TYPE.EMPTY)
            map.setMap(2 * x + 1, 2 * y, TYPE.EMPTY)
            waitingList.append((x, y - 1));
        elif direc == DIRECTOIN.LEFT:
            map.setMap(2 * (x - 1) + 1, 2 * y + 1, TYPE.EMPTY)
            map.setMap(2 * x, 2 * y + 1, TYPE.EMPTY)
            waitingList.append((x - 1, y));
        elif direc == DIRECTOIN.DOWN:
            map.setMap(2 * x + 1, 2 * (y + 1) + 1, TYPE.EMPTY)
            map.setMap(2 * x + 1, 2 * y + 2, TYPE.EMPTY)
            waitingList.append((x, y + 1));
        elif direc == DIRECTOIN.RIGHT:
            map.setMap(2 * (x + 1) + 1, 2 * y + 1, TYPE.EMPTY)
            map.setMap(2 * x + 2, 2 * y + 1, TYPE.EMPTY)
            waitingList.append((x + 1, y));

        map.showMap()
        sys.stdout.flush()
        time.sleep(0.05)
        return True
    else:
        return False


def recursive(map, w, h):
    x0, y0 = (randint(0, w - 1)), (randint(0, h - 1))
    map.setMap(2 * x0 + 1, 2 * y0 + 1, TYPE.EMPTY)

    waitingList = []
    waitingList.append((x0, y0))
    cnt = 0
    while len(waitingList):
        if not checkPosition(map, waitingList[-1][0], waitingList[-1][1], w, h, waitingList):
            waitingList.remove(waitingList[-1])


# def setStartEnd(map):
#     x0, y0 =

# 开始构造迷宫
def startCreateMap(map):
    recursive(map, map.width // 2, map.height // 2)
    # setStartEnd(map)


def run():
    WIDTH = 31
    HEIGHT = 37
    map = Map(WIDTH, HEIGHT)
    startCreateMap(map)



if __name__ == "__main__":
    run()


 

posted @ 2021-11-18 16:50  泥烟  阅读(44)  评论(0编辑  收藏  举报