算法简介:
-
生成一张网格,把网格里面的所有边都存进一个列表edgeList里面.
-
从(0, 0)开始,做DFS。每次DFS的时候,随机地选择四周一个没有走过的格子,凿墙过去,把道路打通。凿墙的时候,把edgeList列表中相对应的那堵墙删除掉。
-
将剩下的没有凿开过的墙画出来,就是一个完整的迷宫了。
import sysimport matplotlib.pyplotas pltfrom randomimport randint
WIDTH=60
HEIGHT=40
sys.setrecursionlimit(WIDTH* HEIGHT)definitVisitedList():
visited=[]for yinrange(HEIGHT):
line=[]for xinrange(WIDTH):
line.append(False)
visited.append(line)return visiteddefdrawLine(x1, y1, x2, y2):
plt.plot([x1, x2],[y1, y2], color="black")defremoveLine(x1, y1, x2, y2):
plt.plot([x1, x2],[y1, y2], color="white")defget_edges(x, y):
result=[]
result.append((x, y, x, y+1))
result.append((x+1, y, x+1, y+1))
result.append((x, y, x+1, y))
result.append((x, y+1, x+1, y+1))return resultdefdrawCell(x, y):
edges= get_edges(x, y)for itemin edges:
drawLine(item[0], item[1], item[2], item[3])defgetCommonEdge(cell1_x, cell1_y, cell2_x, cell2_y):
edges1= get_edges(cell1_x, cell1_y)
edges2=set(get_edges(cell2_x, cell2_y))for edgein edges1:if edgein edges2:return edgereturnNonedefinitEdgeList():
edges=set()for xinrange(WIDTH):for yinrange(HEIGHT):
cellEdges= get_edges(x, y)for edgein cellEdges:
edges.add(edge)return edgesdefisValidPosition(x, y):if x<0or x>= WIDTH:returnFalseelif y<0or y>= HEIGHT:returnFalseelse:returnTruedefshuffle(dX, dY):for tinrange(4):
i= randint(0,3)
j= randint(0,3)
dX[i], dX[j]= dX[j], dX[i]
dY[i], dY[j]= dY[j], dY[i]defDFS(X, Y, edgeList, visited):
dX=[0,0,-1,1]
dY=[-1,1,0,0]
shuffle(dX, dY)for iinrange(len(dX)):
nextX= X+ dX[i]
nextY= Y+ dY[i]if isValidPosition(nextX, nextY):ifnot visited[nextY][nextX]:
visited[nextY][nextX]=True
commonEdge= getCommonEdge(X, Y, nextX, nextY)if commonEdgein edgeList:
edgeList.remove(commonEdge)
DFS(nextX, nextY, edgeList, visited)
plt.axis('equal')
plt.title('Maze')
edgeList= initEdgeList()
visited= initVisitedList()
DFS(0,0, edgeList, visited)
edgeList.remove((0,0,0,1))
edgeList.remove((WIDTH, HEIGHT-1, WIDTH, HEIGHT))for edgein edgeList:
drawLine(edge[0], edge[1], edge[2], edge[3])
plt.show()