diff --git a/src/AMazeIng.py b/src/AMazeIng.py new file mode 100644 index 0000000..7389b0b --- /dev/null +++ b/src/AMazeIng.py @@ -0,0 +1,46 @@ +from dataclasses import field +from os import eventfd_read +from typing import Generator +import numpy +from typing_extensions import Self +from pydantic import AfterValidator, BaseModel, Field, model_validator + +from amaz_lib import Maze, MazeGenerator, MazeSolver +from amaz_lib.Cell import Cell + + +class AMazeIng(BaseModel): + width: int = Field(ge=3) + height: int = Field(ge=3) + entry: tuple[int, int] + exit: tuple[int, int] + output_file: str = Field(min_length=3) + perfect: bool = Field(default=True) + maze: Maze = Field(default=Maze(maze=numpy.array([]))) + generator: MazeGenerator + solver: MazeSolver + + @model_validator(mode="after") + def check_entry_exit(self) -> Self: + if self.entry[0] >= self.width or self.entry[1] >= self.height: + raise ValueError("Entry coordinates exceed the maze size") + if self.exit[0] >= self.width or self.exit[1] >= self.height: + raise ValueError("Exit coordinates exceed the maze size") + return self + + def generate(self) -> Generator[Maze, None, None]: + for array in self.generator.generator(self.height, self.width): + self.maze.set_maze(array) + yield self.maze + + def solve_path(self) -> str: + return self.solver.solve(self.maze) + + def __str__(self) -> str: + res = self.maze.__str__() + res += "\n" + res += f"{self.entry[0]},{self.entry[1]}\n" + res += f"{self.exit[0]},{self.exit[1]}\n" + res += self.solve_path() + res += "\n" + return res diff --git a/src/amaz_lib/classes/Cell.py b/src/amaz_lib/Cell.py similarity index 100% rename from src/amaz_lib/classes/Cell.py rename to src/amaz_lib/Cell.py diff --git a/src/amaz_lib/classes/Maze.py b/src/amaz_lib/Maze.py similarity index 84% rename from src/amaz_lib/classes/Maze.py rename to src/amaz_lib/Maze.py index e47c51c..fc01270 100644 --- a/src/amaz_lib/classes/Maze.py +++ b/src/amaz_lib/Maze.py @@ -2,14 +2,12 @@ from dataclasses import dataclass import numpy from .Cell import Cell -from ..MazeGenerator import MazeGenerator +from .MazeGenerator import MazeGenerator @dataclass class Maze: maze: numpy.ndarray - start: tuple[int, int] - end: tuple[int, int] def get_maze(self) -> numpy.ndarray | None: return self.maze @@ -25,18 +23,12 @@ class Maze: for cell in line: res += cell.__str__() res += "\n" - res += "\n" - res += f"{self.start[0]},{self.start[1]}\n" - res += f"{self.end[0]},{self.end[1]}\n" return res def export_maze(self, file_name: str) -> None: with open(file_name, "w") as file: file.write(self.__str__()) - def solver(self) -> str: - pass - def ascii_print(self) -> None: for line in self.maze: if line is self.maze[0]: diff --git a/src/amaz_lib/MazeGenerator.py b/src/amaz_lib/MazeGenerator.py index a41536e..f83c8f3 100644 --- a/src/amaz_lib/MazeGenerator.py +++ b/src/amaz_lib/MazeGenerator.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Generator import numpy as np -from .classes.Cell import Cell +from .Cell import Cell import math diff --git a/src/amaz_lib/MazeSolver.py b/src/amaz_lib/MazeSolver.py new file mode 100644 index 0000000..dae0fd0 --- /dev/null +++ b/src/amaz_lib/MazeSolver.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod +from .Maze import Maze + + +class MazeSolver(ABC): + @abstractmethod + @classmethod + def solve(cls, maze: Maze) -> str: ... diff --git a/src/amaz_lib/__init__.py b/src/amaz_lib/__init__.py index cf2963d..9a6cf1d 100644 --- a/src/amaz_lib/__init__.py +++ b/src/amaz_lib/__init__.py @@ -1,7 +1,8 @@ -from .classes.Cell import Cell -from .classes.Maze import Maze +from .Cell import Cell +from .Maze import Maze from .MazeGenerator import MazeGenerator +from .MazeSolver import MazeSolver __version__ = "1.0.0" __author__ = "us" -__all__ = ["Cell", "Maze", "MazeGenerator"] +__all__ = ["Cell", "Maze", "MazeGenerator", "MazeSolver"]