New job: maze
This commit is contained in:
parent
8d533e891a
commit
8c7f4f4cb6
61
jobs/maze.py
Normal file
61
jobs/maze.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
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
|
||||||
@ -3,6 +3,7 @@ from escpos.exceptions import USBNotFoundError
|
|||||||
from jobs.math_homework import MathHomeworkJob
|
from jobs.math_homework import MathHomeworkJob
|
||||||
from jobs.unit_conversion import UnitConversionJob
|
from jobs.unit_conversion import UnitConversionJob
|
||||||
from jobs.chess_puzzle import ChessPuzzleJob
|
from jobs.chess_puzzle import ChessPuzzleJob
|
||||||
|
from jobs.maze import MazeJob
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
@ -40,7 +41,8 @@ def get_printer():
|
|||||||
JOBS = [
|
JOBS = [
|
||||||
MathHomeworkJob(),
|
MathHomeworkJob(),
|
||||||
UnitConversionJob(),
|
UnitConversionJob(),
|
||||||
ChessPuzzleJob()
|
ChessPuzzleJob(),
|
||||||
|
MazeJob()
|
||||||
]
|
]
|
||||||
|
|
||||||
def run_tui():
|
def run_tui():
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user