You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何实现符合特定要求的随机生成迷宫(2D列表形式)

看起来你已经在着手实现仅含唯一路径的随机迷宫生成了,这类迷宫通常用深度优先搜索(DFS)或者Prim算法来实现,刚好能满足你“任意两点间仅有一条路径”的要求——本质上就是生成一棵无环的生成树,再对应到迷宫的通道上。

我帮你把现有代码补全,同时拆解每个步骤的作用:

完整实现思路与代码

首先,你的gen_base函数需要先创建一个全墙(False)的基础迷宫,因为标准网格迷宫是2h+1 × 2w+1的结构,奇数行/列是墙体,偶数行/列是潜在的通道节点:

def gen_base(height, width):
    # 初始化全为墙体(False)的基础迷宫网格
    maze = [[False for _ in range(width)] for _ in range(height)]
    return maze

然后entrance函数可以设置迷宫的入口和出口,比如把左上角和右下角的节点设为通道(True):

def entrance(height, width, maze):
    # 左上角入口(对应基础迷宫的(1,1),是第一个可通行节点)
    maze[1][1] = True
    # 右下角出口(对应基础迷宫的倒数第二行/列)
    maze[height-2][width-2] = True
    return maze

接下来是核心的route函数,我们用**深度优先搜索(DFS)**来生成无环路径——DFS天生能生成无环的遍历路径,完美匹配你“任意两点仅一条路径”的要求:

import random

def route(height, width, maze):
    # 实际迷宫的可通行节点是基础迷宫中 (2i+1, 2j+1) 的位置,对应原始height×width个节点
    visited = set()
    # 从入口对应的原始节点(0,0)开始
    start = (0, 0)
    visited.add(start)
    # 用栈实现DFS遍历
    stack = [start]
    
    # 四个移动方向:上、下、左、右
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    
    while stack:
        current = stack[-1]
        curr_i, curr_j = current
        # 筛选当前节点的所有未访问邻居
        neighbors = []
        for di, dj in directions:
            ni, nj = curr_i + di, curr_j + dj
            # 确保邻居在合法范围内且未被访问
            if 0 <= ni < (height-1)//2 and 0 <= nj < (width-1)//2 and (ni, nj) not in visited:
                neighbors.append((ni, nj))
        
        if neighbors:
            # 随机选择一个未访问的邻居
            next_node = random.choice(neighbors)
            ni, nj = next_node
            visited.add(next_node)
            # 打通当前节点到邻居之间的墙体
            di = ni - curr_i
            dj = nj - curr_j
            maze[2*curr_i+1 + di][2*curr_j+1 + dj] = True
            # 标记邻居节点为可通行通道
            maze[2*ni+1][2*nj+1] = True
            # 将邻居加入栈继续遍历
            stack.append(next_node)
        else:
            # 没有未访问邻居,回溯出栈
            stack.pop()
    return maze

最后补全你的generate函数,注意修正拼写错误(theght改为theight):

def generate(height, width):
    theight = height * 2 + 1
    twidth = width * 2 + 1
    maze_lst = gen_base(theight, twidth)
    maze_lst = entrance(theight, twidth, maze_lst)
    maze_lst = route(theight, twidth, maze_lst)
    return maze_lst
验证与使用说明
  • 生成的迷宫是2h+1 × 2w+1的二维列表,True代表通道,False代表墙体
  • 由于DFS生成的是无环路径,迷宫中任意两个通道点之间仅有一条唯一路径,完全符合你的要求
  • 你可以用以下代码直观打印迷宫(用#代表墙体,空格代表通道):
def print_maze(maze):
    for row in maze:
        print(''.join(['#' if not cell else ' ' for cell in row]))

# 测试生成一个5×5的迷宫(原始节点数)
maze = generate(5,5)
print_maze(maze)

如果需要调整入口出口位置,或者改用Prim算法生成不同风格的迷宫,随时可以调整~

内容的提问来源于stack exchange,提问作者Adam Scott

火山引擎 最新活动