From c8a13e9d5c5e348ee263e87536f60850cc623a5c Mon Sep 17 00:00:00 2001 From: David GAILLETON Date: Wed, 18 Mar 2026 12:14:10 +0100 Subject: [PATCH] add output to Maze class --- a_maze_ing.py | 13 ++++++++++++- output_validator.py | 25 +++++++++++++++++++++++++ src/amaz_lib/__init__.py | 4 +++- src/amaz_lib/classes/Cell.py | 2 +- src/amaz_lib/classes/Maze.py | 28 ++++++++++++++++++++-------- src/amaz_lib/generators/kruskal.py | 4 ++-- test.txt | 10 ++++++++++ 7 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 output_validator.py create mode 100644 test.txt diff --git a/a_maze_ing.py b/a_maze_ing.py index 08efe94..ad30819 100644 --- a/a_maze_ing.py +++ b/a_maze_ing.py @@ -1,5 +1,16 @@ +from numpy import ma +from src.amaz_lib import kruskal +from src.amaz_lib import Maze + + def main() -> None: - print("A-Maze-ing !!!") + try: + maze = Maze(maze=None) + for alg in kruskal(10, 10): + maze.set_maze(alg) + maze.export_maze("test.txt") + except Exception as err: + print(err) if __name__ == "__main__": diff --git a/output_validator.py b/output_validator.py new file mode 100644 index 0000000..dfc16eb --- /dev/null +++ b/output_validator.py @@ -0,0 +1,25 @@ +# This script does not check for errors or malformed files. +# It only validates that neighbooring cells sharing a wall have +# both the correct encoding. +# Usage: python3 output_validator.py output_maze.txt + +import sys + +if len(sys.argv) != 2: + print(f"Usage: python3 {sys.argv[0]} ") + sys.exit(1) + +g = [] +for line in open(sys.argv[1]): + if line.strip() == '': + break + g.append([int(c, 16) for c in line.strip(' \t\n\r')]) + +for r in range(len(g)): + for c in range(len(g[0])): + v = g[r][c] + if not all([(r < 1 or v & 1 == (g[r-1][c] >> 2) & 1), + (c >= len(g[0])-1 or (v >> 1) & 1 == (g[r][c+1] >> 3) & 1), + (r >= len(g)-1 or (v >> 2) & 1 == g[r+1][c] & 1), + (c < 1 or (v >> 3) & 1 == (g[r][c-1] >> 1) & 1)]): + print(f'Wrong encoding for ({c},{r})') diff --git a/src/amaz_lib/__init__.py b/src/amaz_lib/__init__.py index b47ab7d..03ae356 100644 --- a/src/amaz_lib/__init__.py +++ b/src/amaz_lib/__init__.py @@ -1,5 +1,7 @@ from .classes.Cell import Cell +from .classes.Maze import Maze +from .generators.kruskal import kruskal __version__ = "1.0.0" __author__ = "us" -__all__ = ["Cell"] +__all__ = ["Cell", "Maze", "kruskal"] diff --git a/src/amaz_lib/classes/Cell.py b/src/amaz_lib/classes/Cell.py index 83a6483..0dbde40 100644 --- a/src/amaz_lib/classes/Cell.py +++ b/src/amaz_lib/classes/Cell.py @@ -5,7 +5,7 @@ class Cell(BaseModel): value: int = Field(ge=0, le=15) def __str__(self) -> str: - return hex(self.value) + return hex(self.value).removeprefix("0x") def set_value(self, value: int) -> None: self.value = value diff --git a/src/amaz_lib/classes/Maze.py b/src/amaz_lib/classes/Maze.py index b6fcfbf..79b1faa 100644 --- a/src/amaz_lib/classes/Maze.py +++ b/src/amaz_lib/classes/Maze.py @@ -1,15 +1,27 @@ -from sys import stdout -import numpy as np -from pydantic import BaseModel +from dataclasses import dataclass +from .Cell import Cell -class Maze(BaseModel): - maze: np.ndarray +@dataclass +class Maze: + maze: list[list[Cell]] + + def get_maze(self) -> list[list[Cell]] | None: + return self.maze + + def set_maze(self, new_maze: list[list[Cell]]) -> None: + self.maze = new_maze def __str__(self) -> str: + if self.maze is None: + return "None" res = "" - for _ in self.maze: - for cell in self.maze: - res += cell + for line in self.maze: + for cell in line: + res += cell.__str__() res += "\n" return res + + def export_maze(self, file_name: str): + with open(file_name, "w") as file: + file.write(self.__str__()) diff --git a/src/amaz_lib/generators/kruskal.py b/src/amaz_lib/generators/kruskal.py index 2a62752..cf45c87 100644 --- a/src/amaz_lib/generators/kruskal.py +++ b/src/amaz_lib/generators/kruskal.py @@ -45,7 +45,7 @@ def merge_sets(sets: list[list[int]], wall: tuple[int, int]) -> None: sets.remove(set) -def kraskal( +def kruskal( height: int, width: int ) -> Generator[np.ndarray, None, np.ndarray]: sets = [[i] for i in range(height * width)] @@ -69,7 +69,7 @@ def kraskal( def main(): try: - for alg in kraskal(10, 10): + for alg in kruskal(10, 10): maze = alg # print(maze) # print() diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..217e942 --- /dev/null +++ b/test.txt @@ -0,0 +1,10 @@ +2a80002a80 +2a80282800 +282aaaa800 +2a82a802a8 +2802800280 +002aaaaa80 +2a80280280 +00282aa828 +002a82aaa8 +2aa8000028