[2] добавил модель лабиринта
This commit is contained in:
parent
c1086c89c3
commit
a912487cdc
5
raskatovia/docs/data/task2/maps/simple.txt
Normal file
5
raskatovia/docs/data/task2/maps/simple.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#######
|
||||||
|
#S...F#
|
||||||
|
#.###.#
|
||||||
|
#.....#
|
||||||
|
#######
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
class Cell:
|
||||||
|
def __init__(self, row, col, value):
|
||||||
|
self.row = row
|
||||||
|
self.col = col
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def is_wall(self):
|
||||||
|
return self.value == "#"
|
||||||
|
|
||||||
|
def is_start(self):
|
||||||
|
return self.value == "S"
|
||||||
|
|
||||||
|
def is_finish(self):
|
||||||
|
return self.value == "F"
|
||||||
|
|
||||||
|
|
||||||
|
class Maze:
|
||||||
|
def __init__(self, cells, start, finish):
|
||||||
|
self.cells = cells
|
||||||
|
self.start = start
|
||||||
|
self.finish = finish
|
||||||
|
self.height = len(cells)
|
||||||
|
self.width = len(cells[0]) if cells else 0
|
||||||
|
|
||||||
|
def inside(self, row, col):
|
||||||
|
return 0 <= row < self.height and 0 <= col < self.width
|
||||||
|
|
||||||
|
def get_cell(self, row, col):
|
||||||
|
if not self.inside(row, col):
|
||||||
|
return None
|
||||||
|
return self.cells[row][col]
|
||||||
|
|
||||||
|
def is_free(self, row, col):
|
||||||
|
cell = self.get_cell(row, col)
|
||||||
|
return cell is not None and not cell.is_wall()
|
||||||
|
|
||||||
|
def neighbors(self, row, col):
|
||||||
|
variants = [
|
||||||
|
(row - 1, col),
|
||||||
|
(row + 1, col),
|
||||||
|
(row, col - 1),
|
||||||
|
(row, col + 1)
|
||||||
|
]
|
||||||
|
result = []
|
||||||
|
for next_row, next_col in variants:
|
||||||
|
if self.is_free(next_row, next_col):
|
||||||
|
result.append((next_row, next_col))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def draw(self, path=None):
|
||||||
|
path_set = set(path) if path else set()
|
||||||
|
lines = []
|
||||||
|
for row in range(self.height):
|
||||||
|
line = ""
|
||||||
|
for col in range(self.width):
|
||||||
|
cell = self.cells[row][col]
|
||||||
|
if (row, col) in path_set and not cell.is_start() and not cell.is_finish():
|
||||||
|
line += "*"
|
||||||
|
else:
|
||||||
|
line += cell.value
|
||||||
|
lines.append(line)
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
|
class MazeBuilder:
|
||||||
|
def __init__(self):
|
||||||
|
self.lines = []
|
||||||
|
|
||||||
|
def from_file(self, filename):
|
||||||
|
with open(filename, "r", encoding="utf-8") as file:
|
||||||
|
self.lines = [line.rstrip("\n") for line in file if line.strip()]
|
||||||
|
return self
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cells = []
|
||||||
|
start = None
|
||||||
|
finish = None
|
||||||
|
width = len(self.lines[0])
|
||||||
|
|
||||||
|
for row, line in enumerate(self.lines):
|
||||||
|
if len(line) != width:
|
||||||
|
raise ValueError("maze lines have different length")
|
||||||
|
cell_row = []
|
||||||
|
for col, value in enumerate(line):
|
||||||
|
cell = Cell(row, col, value)
|
||||||
|
if cell.is_start():
|
||||||
|
start = (row, col)
|
||||||
|
if cell.is_finish():
|
||||||
|
finish = (row, col)
|
||||||
|
cell_row.append(cell)
|
||||||
|
cells.append(cell_row)
|
||||||
|
|
||||||
|
if start is None or finish is None:
|
||||||
|
raise ValueError("maze must have start and finish")
|
||||||
|
|
||||||
|
return Maze(cells, start, finish)
|
||||||
Loading…
Reference in New Issue
Block a user