|
- #!/usr/bin/python
-
- # import modules used here -- sys is a very standard one
- import sys
- from PIL import Image, ImageDraw
- import math
- import random
-
- class Cell:
- walls = int('1111', 2)
- visited = False
-
- def __init__(self, x, y):
- self.x = x
- self.y = y
-
- def draw(self, draw):
- global start, end, margin
-
- if self.walls & 1 == 1:
- draw.line([(margin + cellSize * self.x, margin + cellSize * self.y + cellSize), (margin + cellSize * self.x + cellSize, margin + cellSize * self.y + cellSize)], fill="black", width=3)
- if (self.walls >> 1 & 1) == 1:
- draw.line([(margin + cellSize * self.x + cellSize, margin + cellSize * self.y), (margin + cellSize * self.x + cellSize, margin + cellSize * self.y + cellSize)], fill="black", width=3)
- if (self.walls >> 2 & 1) == 1:
- draw.line([(margin + cellSize * self.x, margin + cellSize * self.y), (margin + cellSize * self.x + cellSize, margin + cellSize * self.y)], fill="black", width=3)
- if (self.walls >> 3 & 1) == 1:
- draw.line([(margin + cellSize * self.x, margin + cellSize * self.y), (margin + cellSize * self.x, margin + cellSize * self.y + cellSize)], fill="black", width=3)
-
- if self.x == start[0] and self.y == start[1]:
- draw.ellipse([margin + cellSize * self.x + cellSize / 4, margin + cellSize * self.y + cellSize / 4, margin + cellSize * self.x + cellSize / 4 + cellSize / 2, margin + cellSize * self.y + cellSize / 4 + cellSize / 2], fill="blue")
- elif self.x == end[0] and self.y == end[1]:
- draw.ellipse([margin + cellSize * self.x + cellSize / 4, margin + cellSize * self.y + cellSize / 4, margin + cellSize * self.x + cellSize / 4 + cellSize / 2, margin + cellSize * self.y + cellSize / 4 + cellSize / 2], fill="green")
-
- rows = 0
- cols = 0
- #image = Image.new('RGB', (380, 400 * 2), (0, 0, 0))
- image = Image.new('RGB', (500, 400 * 4), (0, 0, 0))
- draw = ImageDraw.Draw(image)
- cellSize = 20
- margin = 10
-
- matrix = []
- stack = []
- currentCell = None
- biggestStack = 0
- start = (0, 0)
- end = (0, 0)
-
- # Gather our code in a main() function
- def main():
- global matrix, stack, currentCell, start, rows, cols, cellSize, margin
- # Setup
- if len(sys.argv) > 1:
- cellSize = int(sys.argv[1])
-
- random.seed()
-
- drawingWidth = image.width - margin * 2
- drawingHeight = image.height - margin * 2
-
- draw.rectangle([margin, margin, margin + drawingWidth, margin + drawingHeight], fill="white")
-
- rows = int(math.floor(drawingHeight / cellSize))
- cols = int(math.floor(drawingWidth / cellSize))
-
- print(cellSize)
-
- for y in range(rows):
- for x in range(cols):
- matrix.append(Cell(x, y))
-
- currentCell = matrix[0]
- start = (currentCell.x, currentCell.y)
-
- while nrOfUnvisitedCells() > 0:
- runMazeStep()
-
- # Draw
- for cell in matrix:
- cell.draw(draw)
-
- image.save("maze.png")
-
- def runMazeStep():
- global currentCell, stack, end, biggestStack
-
- currentCell.visited = True
-
- nei = []
-
- if currentCell.x > 0:
- cell = matrix[index(currentCell.x - 1, currentCell.y)]
- if not cell.visited:
- nei.append(cell)
- if currentCell.y > 0:
- cell = matrix[index(currentCell.x, currentCell.y - 1)]
- if not cell.visited:
- nei.append(cell)
- if currentCell.x < cols - 1:
- cell = matrix[index(currentCell.x + 1, currentCell.y)]
- if not cell.visited:
- nei.append(cell)
- if currentCell.y < rows - 1:
- cell = matrix[index(currentCell.x, currentCell.y + 1)]
- if not cell.visited:
- nei.append(cell)
-
- if len(nei) > 0:
- chosen = random.choice(nei)
- stack.append(currentCell)
- if len(stack) > biggestStack:
- biggestStack = len(stack)
- end = (chosen.x, chosen.y)
-
- if chosen.x < currentCell.x:
- chosen.walls &= ~(1 << 1)
- currentCell.walls &= ~(1 << 3)
- elif chosen.x > currentCell.x:
- chosen.walls &= ~(1 << 3)
- currentCell.walls &= ~(1 << 1)
- elif chosen.y > currentCell.y:
- chosen.walls &= ~(1 << 2)
- currentCell.walls &= ~(1 << 0)
- elif chosen.y < currentCell.y:
- chosen.walls &= ~(1 << 0)
- currentCell.walls &= ~(1 << 2)
-
- currentCell = chosen
- else:
- currentCell = stack.pop()
-
-
- def nrOfUnvisitedCells():
- global matrix
- res = len([cell for cell in matrix if not cell.visited])
- return res
-
- def index(x, y):
- global cols
- return y * cols + x
-
- # Standard boilerplate to call the main() function to begin
- # the program.
- if __name__ == '__main__':
- main()
|