From 2828e37853c7d8eb44b8ce29c707d1d5379ed428 Mon Sep 17 00:00:00 2001 From: David GAILLETON Date: Thu, 26 Mar 2026 18:22:45 +0100 Subject: [PATCH] maze is display once --- a_maze_ing.py | 91 +++++++++++++++++- ...ubuntu-any.whl => mlx-2.2-py3-none-any.whl | Bin test.txt | 62 ++++++------ 3 files changed, 121 insertions(+), 32 deletions(-) rename mlx-2.2-py3-ubuntu-any.whl => mlx-2.2-py3-none-any.whl (100%) diff --git a/a_maze_ing.py b/a_maze_ing.py index 600b376..e519721 100644 --- a/a_maze_ing.py +++ b/a_maze_ing.py @@ -1,16 +1,105 @@ import os +from typing import Any, Callable from src.AMazeIng import AMazeIng from src.parsing import Parsing +from mlx.mlx import Mlx +import numpy as np +import math +from src.amaz_lib import Maze + + +class MazeMLX: + def __init__(self, height: int, width: int) -> None: + self.mlx = Mlx() + self.height = height + self.width = width + self.mlx_ptr = self.mlx.mlx_init() + self.win_ptr = self.mlx.mlx_new_window( + self.mlx_ptr, width, height, "amazing" + ) + self.img_ptr = self.mlx.mlx_new_image(self.mlx_ptr, width, height) + self.buf, self.bpp, self.size_line, self.format = ( + self.mlx.mlx_get_data_addr(self.img_ptr) + ) + + def __del__(self) -> None: + self.mlx.mlx_destroy_image(self.mlx_ptr, self.img_ptr) + self.mlx.mlx_destroy_window(self.mlx_ptr, self.win_ptr) + + def put_pixel(self, x, y) -> None: + offset = y * self.size_line + x * (self.bpp // 8) + + self.buf[offset + 0] = 0xFF + self.buf[offset + 1] = 0xFF + self.buf[offset + 2] = 0xFF + if self.bpp >= 32: + self.buf[offset + 3] = 0xFF + + def clear_image(self) -> None: + self.buf[:] = b"\x00" * len(self.buf) + + def put_line(self, start: tuple[int, int], end: tuple[int, int]) -> None: + sx, sy = start + ex, ey = end + if sy == ey: + for x in range(min(sx, ex), max(sx, ex) + 1): + self.put_pixel(x, sy) + if sx == ex: + for y in range(min(sy, ey), max(sy, ey) + 1): + self.put_pixel(sx, y) + + def update_maze(self, maze: np.ndarray) -> None: + self.clear_image() + margin = math.trunc( + math.sqrt(self.width if self.width > self.height else self.height) + // 2 + ) + line_len = math.trunc( + ( + (self.height - margin) // len(maze) + if self.height > self.width + else (self.width - margin) // len(maze[0]) + ) + ) + for y in range(len(maze)): + for x in range(len(maze[0])): + x0 = x * line_len + margin + y0 = y * line_len + margin + x1 = x * line_len + line_len + margin + y1 = y * line_len + line_len + margin + + if maze[y][x].get_north(): + self.put_line((x0, y0), (x1, y0)) + if maze[y][x].get_est(): + self.put_line((x1, y0), (x1, y1)) + if maze[y][x].get_south(): + self.put_line((x0, y1), (x1, y1)) + if maze[y][x].get_west(): + self.put_line((x0, y0), (x0, y1)) + + self.mlx.mlx_put_image_to_window( + self.mlx_ptr, self.win_ptr, self.img_ptr, 0, 0 + ) + + def close_loop(self, _: Any): + self.mlx.mlx_loop_exit(self.mlx_ptr) + + def gen_maze(self, maze: np.ndarray) -> None: + self.mlx.mlx_loop_hook(self.mlx_ptr, self.update_maze, maze) + self.mlx.mlx_hook(self.win_ptr, 17, 0, self.close_loop, None) + self.mlx.mlx_loop(self.mlx_ptr) def main() -> None: + mlx = None try: + mlx = MazeMLX(1000, 1000) config = Parsing.DataMaze.get_data_maze("config.txt") - print(config) amazing = AMazeIng(**config) for _ in amazing.generate(): os.system("clear") amazing.maze.ascii_print() + mlx.gen_maze(amazing.maze.get_maze()) with open("test.txt", "w") as output: output.write(amazing.__str__()) except Exception as err: diff --git a/mlx-2.2-py3-ubuntu-any.whl b/mlx-2.2-py3-none-any.whl similarity index 100% rename from mlx-2.2-py3-ubuntu-any.whl rename to mlx-2.2-py3-none-any.whl diff --git a/test.txt b/test.txt index ba65f51..2719793 100644 --- a/test.txt +++ b/test.txt @@ -1,34 +1,34 @@ -957D3955553B957917B93D3D15553B -AB97AABBD16847D6ABAAAD452B97C6 -8687A8443EBC55538286E953A807D3 -878506952BAD3B942EAD503E86ED52 -852D4383C6C384438147D2C3879796 -ED2B96EC7D384792EC5792BEC38103 -BBC2C795516C13EC51556C053AAEAA -8452BD43D4396AD552D3BBEBE803EE -853A8552B902BABD5290029696AA93 -C7AC2B9686EE82ABB82EEC07C7E86A -D3AD0683C7D3EAC2C6C3D5693956D2 -9687E92EBBD0103857D43916A85796 -C52BD2A942D2EAE857D542E946D147 -D3EC12EE9692F852FFFBBE96957EBB -B87BAA97852AFED057FC07C507D506 -C2942C47C7EEFFFAFFFD4517ED53C3 -946BABB91553BBFEFD51796955147A -C3BA82AAC53C6AFBFFF816BEBD053A -D06AE828792B90543D568547856D42 -92BC56AAD2C6A87B83916D516BD53A -AAAD13C47AD3AED46EEA95103853C2 -EAAD2815143C43D3BBD0696EAED416 -B847EEC3EBC57AD4407C7C3B85792B -AEBBD5503A9156BD16D1792A8796AA -87AC3BD2C42C57C383D2BEAC47C3EA -C50542B857879112E812C1297BD6BA -D3C3D44417C7EEAC3EAC52C47C516A -BA903B91693B97AB87A938157D5052 -802A82EC5684414287AAEE87953AD2 -EEEEEC57D547D6D6C546D54547C47E +BBBBBB97D397BBBB917BBD15513D17 +84684003BAA946AAA854696D3EEBC3 +C112D2AC28443D06EAB9103945507A +BEAED283E857C3AD52AEAEAC7D5452 +87C53EAEBC393C4154012D29553956 +A95147EBAD6AEBB87D2EC386D52853 +86D4517AC17C50443B813AABD1443E +EBD1787850513A9506AAEAAC3A93EB +B8543850787EEAAB87EC3EC3C2A852 +AEBD443AD4517EC6ED3D2D3EB8687E +838553AC7BD2BD3BBD43EB85069457 +EAC57843D2B86D4407D0106943C7BB +D01552B856C4553BC556AC783E97C2 +92C7D6C29557F96AFFFD6D16850512 +E83D15382D3BFC7857FD39696907EA +BEAD6D46ABC2FFFAFFF96AD2D2C57A +87ABD13BC6D293FAFD50547C3C3D3E +C168128455106EFAFFFABD17EBA907 +9056AEC7B92ABBBAD15407ABD2C2C3 +EAD1691786E8044296952D06B8147A +BEB87EAD053E87D6ED07812BAE8796 +87AAD5412B87C7957BEBEAAC2D07EB +C3C2D55286857905169456E9438796 +D07EBBD287A97EAB8507957E944507 +96BD0692AD445146C7EBC55503D3AB +C16D2BEAC3D514553D52BD53AE92EA +B8552C12BE97AB952D104796C52E92 +C47D016AABC16869456AD5413BAD6A +D113AED2C292D03ED53ABD52800392 +D6EC457C7C6C7EC57D446D56EEEC6E 1,1 29,29 -SSSSEESSESSSENEEESWSSWSSWSSSSESESSENNNNESEESWSSSWWWSESSSSESWSEENESEEEENNNESESSSEENNNNESEESESSEENEESENNEESW +SSEESSEESWSEESSSESSWSWWWWSSESSSWSEENEENESEEEESWSWSEESSSSEEEENNEESEENEEENNWNNWNNEENNENENESEESWSSESSESWSSSSWWSSSEESSESEN