125 lines
3.9 KiB
Python
125 lines
3.9 KiB
Python
import pygame
|
|
from random import choice
|
|
|
|
RES = WIDTH, HEIGHT = 1202, 902
|
|
TILE = 50
|
|
cols, rows = WIDTH // TILE, HEIGHT // TILE
|
|
|
|
pygame.init()
|
|
sc = pygame.display.set_mode(RES)
|
|
clock = pygame.time.Clock()
|
|
|
|
|
|
class Cell:
|
|
def __init__(self, x, y):
|
|
self.x, self.y = x, y
|
|
self.walls = {'top': True, 'right': True, 'bottom': True, 'left': True}
|
|
self.visited = False
|
|
|
|
def draw_current_cell(self):
|
|
x, y = self.x * TILE, self.y * TILE
|
|
pygame.draw.rect(sc, pygame.Color('saddlebrown'), (x + 2, y + 2, TILE - 2, TILE - 2))
|
|
|
|
def draw(self):
|
|
x, y = self.x * TILE, self.y * TILE
|
|
if self.visited:
|
|
pygame.draw.rect(sc, pygame.Color('black'), (x, y, TILE, TILE))
|
|
|
|
if self.walls['top']:
|
|
pygame.draw.line(sc, pygame.Color('darkorange'), (x, y), (x + TILE, y), 3)
|
|
if self.walls['right']:
|
|
pygame.draw.line(sc, pygame.Color('darkorange'), (x + TILE, y), (x + TILE, y + TILE), 3)
|
|
if self.walls['bottom']:
|
|
pygame.draw.line(sc, pygame.Color('darkorange'), (x + TILE, y + TILE), (x , y + TILE), 3)
|
|
if self.walls['left']:
|
|
pygame.draw.line(sc, pygame.Color('darkorange'), (x, y + TILE), (x, y), 3)
|
|
|
|
def check_cell(self, x, y):
|
|
find_index = lambda x, y: x + y * cols
|
|
if x < 0 or x > cols - 1 or y < 0 or y > rows - 1:
|
|
return False
|
|
return grid_cells[find_index(x, y)]
|
|
|
|
def check_neighbors(self):
|
|
neighbors = []
|
|
top = self.check_cell(self.x, self.y - 1)
|
|
right = self.check_cell(self.x + 1, self.y)
|
|
bottom = self.check_cell(self.x, self.y + 1)
|
|
left = self.check_cell(self.x - 1, self.y)
|
|
if top and not top.visited:
|
|
neighbors.append(top)
|
|
if right and not right.visited:
|
|
neighbors.append(right)
|
|
if bottom and not bottom.visited:
|
|
neighbors.append(bottom)
|
|
if left and not left.visited:
|
|
neighbors.append(left)
|
|
return choice(neighbors) if neighbors else False
|
|
|
|
|
|
def remove_walls(current, next):
|
|
dx = current.x - next.x
|
|
if dx == 1:
|
|
current.walls['left'] = False
|
|
next.walls['right'] = False
|
|
elif dx == -1:
|
|
current.walls['right'] = False
|
|
next.walls['left'] = False
|
|
dy = current.y - next.y
|
|
if dy == 1:
|
|
current.walls['top'] = False
|
|
next.walls['bottom'] = False
|
|
elif dy == -1:
|
|
current.walls['bottom'] = False
|
|
next.walls['top'] = False
|
|
|
|
|
|
grid_cells = [Cell(col, row) for row in range(rows) for col in range(cols)]
|
|
current_cell = grid_cells[0]
|
|
stack = []
|
|
colors, color = [], 40
|
|
|
|
|
|
|
|
def generate_maze():
|
|
global current_cell
|
|
while True:
|
|
current_cell.visited = True
|
|
next_cell = current_cell.check_neighbors()
|
|
if next_cell:
|
|
next_cell.visited = True
|
|
stack.append(current_cell)
|
|
remove_walls(current_cell, next_cell)
|
|
current_cell = next_cell
|
|
elif stack:
|
|
current_cell = stack.pop()
|
|
else:
|
|
break
|
|
generate_maze()
|
|
|
|
while True:
|
|
sc.fill(pygame.Color('darkslategray'))
|
|
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
exit()
|
|
|
|
[cell.draw() for cell in grid_cells]
|
|
current_cell.visited = True
|
|
current_cell.draw_current_cell()
|
|
[pygame.draw.rect(sc, colors[i], (cell.x * TILE + 2, cell.y * TILE + 2,
|
|
TILE - 4, TILE - 4)) for i, cell in enumerate(stack)]
|
|
|
|
next_cell = current_cell.check_neighbors()
|
|
if next_cell:
|
|
next_cell.visited = True
|
|
stack.append(current_cell)
|
|
colors.append((min(color, 255), 10, 100))
|
|
color += 1
|
|
remove_walls(current_cell, next_cell)
|
|
current_cell = next_cell
|
|
elif stack:
|
|
current_cell = stack.pop()
|
|
|
|
pygame.display.flip()
|
|
clock.tick(30) |