feat: add Builder pattern
This commit is contained in:
parent
38f361bdc4
commit
e11bfb0f7a
38
lomakinae/docs/data/02/src/builder.py
Normal file
38
lomakinae/docs/data/02/src/builder.py
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
from abc import ABC, abstractmethod
|
||||
|
||||
from .maze import Maze
|
||||
|
||||
|
||||
class MazeBuilder(ABC):
|
||||
@abstractmethod
|
||||
def build_from_file(self, filename: str) -> Maze:
|
||||
pass
|
||||
|
||||
|
||||
class TextFileMazeBuilder(MazeBuilder):
|
||||
def build_from_file(self, filename: str) -> Maze:
|
||||
with open(filename, "r", encoding="utf-8") as f:
|
||||
lines = [line.rstrip("\n") for line in f.readlines()]
|
||||
height = len(lines)
|
||||
width = max(len(line) for line in lines) if height > 0 else 0
|
||||
|
||||
start_count = 0
|
||||
exit_count = 0
|
||||
maze = Maze(width, height)
|
||||
|
||||
for y, line in enumerate(lines):
|
||||
for x, ch in enumerate(line):
|
||||
if ch == "#":
|
||||
maze.set_cell(x, y, "wall")
|
||||
elif ch == "S":
|
||||
maze.set_cell(x, y, "start")
|
||||
start_count += 1
|
||||
elif ch == "E":
|
||||
maze.set_cell(x, y, "exit")
|
||||
exit_count += 1
|
||||
else:
|
||||
maze.set_cell(x, y, "path")
|
||||
|
||||
if start_count != 1 or exit_count != 1:
|
||||
raise ValueError(f"S={start_count}, E={exit_count}")
|
||||
return maze
|
||||
Loading…
Reference in New Issue
Block a user