[2] Добавление первых версий классов Cell и Maze
This commit is contained in:
parent
d05d292101
commit
05a9bdd8f4
32
skorohodovsa/task_2/.gitignore
vendored
32
skorohodovsa/task_2/.gitignore
vendored
|
|
@ -1 +1,33 @@
|
||||||
/.obsidian
|
/.obsidian
|
||||||
|
|
||||||
|
# Виртуальное окружение
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
.venv/
|
||||||
|
.env/
|
||||||
|
|
||||||
|
# Python кэш
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.so
|
||||||
|
.Python
|
||||||
|
|
||||||
|
# Сборка документации Sphinx - ЭТО ВАЖНО!
|
||||||
|
docs/build/
|
||||||
|
docs/source/_build/
|
||||||
|
|
||||||
|
# Системные файлы
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Логи
|
||||||
|
*.log
|
||||||
|
|
||||||
|
.ruff_cache/
|
||||||
102
skorohodovsa/task_2/models/map.py
Normal file
102
skorohodovsa/task_2/models/map.py
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
class Cell:
|
||||||
|
"""Класс отвечает за хранение характеристик поля лабиринта"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
x: int,
|
||||||
|
y: int,
|
||||||
|
is_wall: bool = False,
|
||||||
|
is_start: bool = False,
|
||||||
|
is_exit: bool = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
:param x: Координата поля по оси X
|
||||||
|
:type x: int
|
||||||
|
:param y: Координата поля по оси Y
|
||||||
|
:type y: int
|
||||||
|
:param is_wall: Является ли поле **стеной**, defaults to False
|
||||||
|
:type is_wall: bool, optional
|
||||||
|
:param is_start: Является ли поле **началом**, defaults to False
|
||||||
|
:type is_start: bool, optional
|
||||||
|
:param is_exit: Является ли поле **концом**, defaults to False
|
||||||
|
:type is_exit: bool, optional
|
||||||
|
"""
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.is_wall = is_wall
|
||||||
|
self.is_start = is_start
|
||||||
|
self.is_exit = is_exit
|
||||||
|
|
||||||
|
def isPossible(self) -> bool:
|
||||||
|
"""Проверка возможности перемещения в это поле
|
||||||
|
|
||||||
|
:return: Если перемещение возможно, то `True`, иначе `False`
|
||||||
|
:rtype: bool
|
||||||
|
"""
|
||||||
|
return not self.is_wall
|
||||||
|
|
||||||
|
|
||||||
|
class Maze:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
size: tuple[int, int] = (10, 10),
|
||||||
|
start_point: tuple[int, int] = (0, 0),
|
||||||
|
exit_point: tuple[int, int] = (-1, -1),
|
||||||
|
):
|
||||||
|
# Установка размеров лабиринта
|
||||||
|
self._width = size[0]
|
||||||
|
self._height = size[1]
|
||||||
|
|
||||||
|
# Установка значения стартового поля в лабиринте
|
||||||
|
self._start_x = start_point[0]
|
||||||
|
self._start_y = start_point[1]
|
||||||
|
|
||||||
|
# Установка значения выходного поля в лабиринте
|
||||||
|
self._exit_x = self._width - 1 if exit_point[0] == -1 else exit_point[0]
|
||||||
|
self._exit_y = self._height - 1 if exit_point[1] == -1 else exit_point[1]
|
||||||
|
|
||||||
|
# Создание двумерного списка лабиринта
|
||||||
|
self._map = [
|
||||||
|
[Cell(x, y) for x in range(self._width)] for y in range(self._height)
|
||||||
|
]
|
||||||
|
|
||||||
|
# Проверяем, что координаты старта находятся в области лабиринта
|
||||||
|
if self._check_point_in_map(self._start_x, self._start_y):
|
||||||
|
self._map[self._start_y][self._start_x].is_start = True
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
f"Координата точки старта задана вне области лабиринта: ({self._start_x}, {self._start_y}) not in ({self._width}, {self._height})"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Проверяем, что координаты выхода находятся в области лабиринта
|
||||||
|
if not self._check_point_in_map(self._exit_x, self._exit_y):
|
||||||
|
raise ValueError(
|
||||||
|
f"Координата точки выхода задана вне области лабиринта: ({self._start_x}, {self._start_y}) not in ({self._width}, {self._height})"
|
||||||
|
)
|
||||||
|
self._map[self._exit_y][self._exit_x].is_exit = True
|
||||||
|
|
||||||
|
def _check_point_in_map(self, x: int, y: int) -> bool:
|
||||||
|
return (0 <= x < self._width) and (0 <= y < self._height)
|
||||||
|
|
||||||
|
def get_cell(self, x: int, y: int) -> Optional[Cell]:
|
||||||
|
if not self._check_point_in_map(x, y):
|
||||||
|
raise ValueError(
|
||||||
|
f"Указанные координаты выходят за границы лабиринта: ({x}, {y}) not in ({self._width}, {self._height})"
|
||||||
|
)
|
||||||
|
return self._map[y][x]
|
||||||
|
|
||||||
|
def get_neighbors(self, x: int, y: int) -> Optional[list[Cell]]:
|
||||||
|
vector_x = [0, 1, 0, -1]
|
||||||
|
vector_y = [1, 0, -1, 0]
|
||||||
|
|
||||||
|
neighbors = []
|
||||||
|
|
||||||
|
for vec_x, vec_y in zip(vector_x, vector_y):
|
||||||
|
temp_x, temp_y = x + vec_x, y + vec_y
|
||||||
|
if self._check_point_in_map(temp_x, temp_y):
|
||||||
|
neighbors.append(self._map[temp_y][temp_x])
|
||||||
|
|
||||||
|
return neighbors
|
||||||
7
skorohodovsa/task_2/requirements.txt
Normal file
7
skorohodovsa/task_2/requirements.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
sphinx
|
||||||
|
myst-parser
|
||||||
|
sphinxawesome-theme
|
||||||
|
nbsphinx
|
||||||
|
myst-nb
|
||||||
|
tabulate
|
||||||
|
bibtexparser
|
||||||
Loading…
Reference in New Issue
Block a user