對遞迴回溯生成隨機迷宮的演示

2022-09-15 16:42:12 字數 3266 閱讀 6736

回顧: 

[python實現] 遞迴回溯(深度優先)構造隨機迷宮_☆迷茫狗子的秘密基地☆-csdn部落格

在上次的基礎上稍加改動,可以更加直觀地欣賞整個過程

美中不足的是我想不停地原地輸出並重新整理,可惜找了很多文章都沒能達到理想的效果,

希望有大佬有實現過類似的情況可以指點一二 hhh

# 全部初始化成牆體

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):

if x > 0:

if not map.checkvisited(2 * (x - 1) + 1, 2 * y + 1):

if y < h - 1:

if not map.checkvisited(2 * x + 1, 2 * (y + 1) + 1):

if x < w - 1:

if not map.checkvisited(2 * (x + 1) + 1, 2 * y + 1):

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)

elif direc == directoin.left:

map.setmap(2 * (x - 1) + 1, 2 * y + 1, type.empty)

map.setmap(2 * x, 2 * y + 1, type.empty)

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)

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)

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 =

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()

使用遞迴回溯解決迷宮問題

目的 從左上角走到右下角。地圖用陣列表示,0表示可走,1表示牆,2表示已走過 不能再走 3表示已走過但走不通。策略 向下 向右 向上 向左 初始地圖 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0...

3 隨機迷宮生成演示程式

假期寫了個基於隨機迷宮的遊戲,學習了相關隨機迷宮的生成演算法。其他演算法都好理解,也很容易寫出來。但就是隨機prim,怎麼都寫不對,生成的迷宮亂七八糟的,急死人了 沒辦法只好看別人的,但是又死活看不明白注釋,除錯又不太直觀,只好魔改程式,讓程式顯示構造迷宮過程中各個格仔的狀態。才弄懂明白,原來是隨機...

迷宮問題讓你深度理解遞迴 回溯)

當你看到遞迴時,如果腦子裡想著迴圈,一層層向下呼叫,一層層回溯,總想著計算機的每一步是怎麼做的,這樣就會陷入學習遞迴的思維誤區 正確的做法是什麼呢?遮蔽遞迴細節 假設a問題,可以細分為bcd這三個小問題,那麼我們就應該考慮bcd這三者怎麼解決,然後能解決之後再考慮bcd和a的關係 例 如果要解決我坐...