# Multi-Maze Generator using Depth-first Search
# Multi-Maze: Maze w/ multiple paths to solve
# http://en.wikipedia.org/wiki/Maze_generation_algorithm
# FB - 20121214
import random
from PIL import Image
imgx = 600; imgy = 600
image = Image.new("RGB", (imgx, imgy))
pixels = image.load()
m = random.randint(1, 10) # of maze paths
mx = 60; my = 60 # width and height of the maze
maze = [[0 for x in range(mx)] for y in range(my)]
dx = [0, 1, 0, -1]; dy = [-1, 0, 1, 0] # 4 directions to move in the maze
stack = [] # array of stacks
color = [(0, 0, 0)] # RGB colors maze paths
for i in range(m):
while True:
kx = random.randint(0, mx - 1); ky = random.randint(0, my - 1)
if maze[ky][kx] == 0: break
stack.append([(kx, ky)])
maze[ky][kx] = i + 1
color.append((random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)))
cont = True # continue
while cont:
cont = False
for p in range(m):
if len(stack[p]) > 0:
cont = True # continue as long as there is a non-empty stack
(cx, cy) = stack[p][-1]
# find a new cell to add
nlst = [] # list of available neighbors
for i in range(4):
nx = cx + dx[i]; ny = cy + dy[i]
if nx >= 0 and nx < mx and ny >= 0 and ny < my:
if maze[ny][nx] == 0:
# of occupied neighbors must be 1
ctr = 0
for j in range(4):
ex = nx + dx[j]; ey = ny + dy[j]
if ex >= 0 and ex < mx and ey >= 0 and ey < my:
if maze[ey][ex] == p + 1: ctr += 1
if ctr == 1: nlst.append(i)
# if 1 or more neighbors available then randomly select one and add
if len(nlst) > 0:
ir = nlst[random.randint(0, len(nlst) - 1)]
cx += dx[ir]; cy += dy[ir]
maze[cy][cx] = p + 1
stack[p].append((cx, cy))
else: stack[p].pop()
for ky in range(imgy):
for kx in range(imgx):
pixels[kx, ky] = color[maze[my * ky / imgy][mx * kx / imgx]]
image.save(str(m) + "Maze_" + str(mx) + "x" + str(my) + ".png", "PNG")