2026-rff_mp/konnovaea/maze_solver.py

120 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class Cell:
def __init__(self, x, y):
self.x = x
self.y = y
self.is_wall = False
self.is_start = False
self.is_exit = False
def is_passable(self):
return not self.is_wall
def __repr__(self):
return f"Cell({self.x}, {self.y})"
class Maze:
def __init__(self, width, height):
self.width = width
self.height = height
self.cells = []
self.start = None
self.exit = None
for y in range(height):
row = []
for x in range(width):
row.append(Cell(x, y))
self.cells.append(row)
def get_cell(self, x, y):
if 0 <= x < self.width and 0 <= y < self.height:
return self.cells[y][x]
return None
def get_neighbors(self, cell):
neighbors = []
directions = [(0, -1), (0, 1), (-1, 0), (1,0)]
for dx, dy in directions:
nx, ny = cell.x + dx, cell.y + dy
neighbor = self.get_cell(nx, ny)
if neighbor and neighbor.is_passable():
neighbors.append(neighbor)
return neighbors
def __repr__(self):
return f"Maze({self.width}x{self.height})"
from abc import ABC, abstractmethod
class MazeBuilder(ABC):
@abstractmethod
def build_from_file(self, filename):
pass
class TextFileMazeBuilder(MazeBuilder):
def build_from_file(self, filename):
with open(filename, 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = [line.rstrip('\n\r') for line in lines]
height = len(lines)
width = len(lines[0]) if height > 0 else 0
for i, line in enumerate(lines):
if len(line) != width:
raise ValueError(f"Строка {i+1} имеет длину {len(line)}, ожидается {width}")
maze = Maze(width, height)
start = None
exit_cell = None
for y, line in enumerate(lines):
for x, ch in enumerate(line):
cell = maze.get_cell(x, y)
if ch == '#':
cell.is_wall = True
elif ch == ' ':
cell.is_wall = False
elif ch == 'S':
cell.is_wall = False
cell.is_start = True
start = cell
elif ch == 'E':
cell.is_wall = False
cell.ia_exit = True
exit_cell = cell
else:
cell.is_wall = True
if start is None:
raise ValueError("В лабиринте не найден старт (S)")
if exit_cell is None:
raise ValueError("В лабиринте не найден выход (E)")
maze.start = start
maze.exit = exit_cell
return maze
#тест
if __name__ == "__main__":
builder = TextFileMazeBuilder()
maze = builder.build_from_file("maze1.txt")
print(f"лабиринт загружен: {maze}")
print(f"старт: {maze.start}")
print(f"выход: {maze.exit}")
neighbors = maze.get_neighbors(maze.start)
print(f"соседи старта: {neighbors}")