thermoprint-homework/jobs/maze.py
2025-12-23 00:20:31 +01:00

61 lines
1.9 KiB
Python

import random
from .base import Job
class MazeJob(Job):
def get_name(self):
return "BLUDISTE"
def print_body(self, p):
# Width and Height in cells.
# Total width in chars = 2 * w + 1.
# w=15 -> 31 chars (Fits comfortably on 80mm printers, tight on 58mm)
w = 15
h = 15
maze = self.generate_maze(w, h)
p.text("Najdi cestu z S do E:\n\n")
# Center the maze
p.set(align='center')
for row in maze:
p.text("".join(row) + "\n")
p.set(align='left')
p.text("\n")
def generate_maze(self, width, height):
rows = 2 * height + 1
cols = 2 * width + 1
# Initialize grid with walls
maze = [['#' for _ in range(cols)] for _ in range(rows)]
# Starting cell (1, 1)
stack = [(1, 1)]
maze[1][1] = ' '
while stack:
x, y = stack[-1]
# Directions: Up, Down, Left, Right (step 2 to jump over walls)
directions = [(0, -2), (0, 2), (-2, 0), (2, 0)]
random.shuffle(directions)
moved = False
for dx, dy in directions:
nx, ny = x + dx, y + dy
# Check bounds (ensure we stay within the outer border)
if 1 <= nx < rows - 1 and 1 <= ny < cols - 1:
if maze[nx][ny] == '#': # If unvisited
maze[nx][ny] = ' ' # Mark cell as path
maze[x + dx // 2][y + dy // 2] = ' ' # Knock down wall
stack.append((nx, ny))
moved = True
break
if not moved:
stack.pop()
# Create Entrance (S) and Exit (E)
maze[1][0] = 'S'
maze[rows - 2][cols - 1] = 'E'
return maze