python - 迷宫不是随机的

标签 python backtracking depth-first-search maze

嘿,我正在构建一个生成迷宫的程序,以便稍后将路径转换为我的图形部分。我已经大部分工作了,但是,每次你只要走东线和南线,就能到达终点。即使我将宽度设置为 64,因此迷宫为 64*64,我也可以选择这 2 个选项并每次都能到达终点。我真的不明白为什么要这样做。代码如下,很容易理解。

import random

width = 8

def check(x,y):
    """Figures out the directions that Gen can move while"""
    if x-1 == -1:
        maze[x][y][3] = 0 

    if x+1 == width + 1:
        maze[x][y][1] = 0

    if y+1 == width + 1:
        maze[x][y][2] = 0

    if y-1 == -1:
        maze[x][y][0] = 0

    if x + 1 in range(0,width) and visited[x+1][y] == False:
        maze[x][y][1] = 2

    if x - 1 in range(0,width) and visited[x-1][y] == False:
        maze[x][y][3] = 2

    if y + 1 in range(0,width) and visited[x][y+1] == False:
        maze[x][y][2] = 2

    if y - 1 in range(0,width) and visited[x][y-1] == False:
        maze[x][y][0] = 2

def possibleDirs(x,y):
    """Figures out the ways that the person can move in each square"""
    dirs = []
    walls = maze[x][y]

    if walls[0] == 1:
        dirs.append('n')
    if walls[1] == 1:
        dirs.append('e')
    if walls[2] == 1:
        dirs.append('s')
    if walls[3] == 1:
        dirs.append('w')

    return dirs


def Gen(x,y):
    """Generates the maze using a depth-first search and recursive backtracking."""
    visited[x][y] = True
    dirs = []
    check(x,y)

    if maze[x][y][0] == 2:
        dirs.append(0)
    if maze[x][y][1] == 2:
        dirs.append(1)
    if maze[x][y][2] == 2:
        dirs.append(2)
    if maze[x][y][3] == 2:
        dirs.append(3)
    print dirs

    if len(dirs):
        #Randonly selects a derection for the current square to move
        past.append(current[:])
        pos = random.choice(dirs)

        maze[x][y][pos] = 1  

        if pos == 0:
            current[1] -= 1
            maze[x][y-1][2] = 1
        if pos == 1:
            current[0] += 1
            maze[x+1][y][3] = 1
        if pos == 2:
            current[1] += 1
            maze[x][y+1][0] = 1
        if pos == 3:
            current[0] -= 1
            maze[x-1][y][1] = 1

    else:
        #If there's nowhere to go, go back one square
        lastPlace = past.pop()
        current[0] = lastPlace[0]
        current[1] = lastPlace[1]



#Build the initial values for the maze to be replaced later
maze = []
visited = []
past = []

#Generate empty 2d list with a value for each of the xy coordinates
for i in range(0,width):
    maze.append([])
    for q in range(0, width):
        maze[i].append([])
        for n in range(0, 4):
            maze[i][q].append(4)

#Makes a list of falses for all the non visited places
for x in range(0, width):
    visited.append([])
    for y in range(0, width):
        visited[x].append(False)

dirs = []
print dirs

current = [0,0]

#Generates the maze so every single square has been filled. I'm not sure how this works, as it is possible to only go south and east to get to the final position.
while current != [width-1, width-1]:
    Gen(current[0], current[1])
#Getting the ways the person can move in each square
for i in range(0,width):
    dirs.append([])
    for n in range(0,width):
        dirs[i].append([])
        dirs[i][n] = possibleDirs(i,n)

print dirs
print visited

pos = [0,0]

#The user input part of the maze
while pos != [width - 1, width - 1]:
    dirs = []
    print pos
    if maze[pos[0]][pos[1]][0] == 1:
        dirs.append('n')
    if maze[pos[0]][pos[1]][1] == 1:
        dirs.append('e')
    if maze[pos[0]][pos[1]][2] == 1:
        dirs.append('s')
    if maze[pos[0]][pos[1]][3] == 1:
        dirs.append('w')
    print dirs
    path = raw_input("What direction do you want to go: ")
    if path not in dirs:
        print "You can't go that way!"
        continue
    elif path.lower() == 'n':
        pos[1] -= 1        
    elif path.lower() == 'e':
        pos[0] += 1   
    elif path.lower() == 's':
        pos[1] += 1
    elif path.lower() == 'w':
        pos[0] -= 1

print"Good job!"

正如你所看到的,我认为问题出在我生成迷宫的地方,但是,当我让它一直走到当前点的末尾时,它不会填充每个迷宫,并且通常只是一条笔直的道路。感谢您的帮助。

更新: 我已将生成迷宫的 for 循环更改为简单的 while 循环,它似乎工作得更好。看起来,当 for 循环运行时,它没有递归,但是,在 while 循环中它完全没问题。然而,现在所有的方 block 都没有填满。

最佳答案

您使用的是迭代方法,而不是像代码所述的递归方法!

查看有关迷宫生成的一系列精彩文章(从递归回溯开始):

http://weblog.jamisbuck.org/2010/12/27/maze-generation-recursive-backtracking

关于python - 迷宫不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5292758/

相关文章:

c++ - 基于堆栈的迷宫算法背后的逻辑

python - 如何在 python 中以内存高效的方式加载和合并多个 .txt 文件?

c++ - 如何优化 Knight 的游览算法?

c# - 使用队列进行深度优先搜索

algorithm - 使用邻接矩阵的深度优先搜索

python - 回溯时如何存储递归结果?

python - 在python中枚举返回什么样的对象?

python - 为什么我的 lambda 不起作用?

python - 检查我的时间序列索引数据是否有工作日的缺失值

list - 对Prolog中的列表进行排序