Files
amazing/README.md
T
2026-04-01 23:20:11 +02:00

251 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# A Maze Ing
Un générateur et solveur de labyrinthe en Python avec interface MLX (2D pixels), accompagné de code robuste, tests et typage statique.
## Description
A Maze Ing vise à implémenter un ensemble de fonctionnalités complètes pour la génération, représentation et résolution dun labyrinthe, dans un contexte pédagogique :
- génération de labyrinthe avec deux algorithmes classiques (`DepthFirstSearch` et `Kruskal`);
- représentation textuelle et structurelle de la grille via `Cell` et `Maze`;
- solveurs (`DepthFirstSearchSolver`, `AStar`) pour retrouver un chemin source/target;
- interface graphique avec `mlx` pour visualiser en temps réel.
Le but est de coder un moteur de maze complet, testable et maintenable, tout en appliquant des pratiques modernes (typing, tests, CI via Makefile).
## Objectifs
- comprendre et placer les algorithmes de génération dans un pipeline complet
- offrir un usage reproductible via config + API
- démontrer la compatibilité avec `pytest` et `mypy`
- fournir un produit avec UI interactive et animation de chemin
## Instructions
### Prérequis
- Python 3.10+
- Numpy, Pydantic, Pytest, Mypyc/ Mypy, Flake8, mlx (via distribution locale `mlx-2.2-py3-none-any.whl`)
### Installation
```
git clone <url> amazing
cd amazing
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools
pip install -r requirements.txt # si présent, sinon :
pip install pydantic numpy pytest mypy
pip install mlx-2.2-py3-none-any.whl
```
### Exécution
- Direct :
```
PYTHONPATH=src python3 a_maze_ing.py config.txt
```
- Make :
```sh
make run
```
### Tests
```
PYTHONPATH=src pytest
```
### Lint / mypy
```
make lint
make lint-strict
```
ou
```
PYTHONPATH=src python3 -m mypy --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs -p mazegen -p AMazeIng
```
## Structure du projet
- `a_maze_ing.py` : point dentrée CLI / application MLX.
- `src/AMazeIng.py` : modèle Pydantic + orchestration `Maze`/`MazeGenerator`/`MazeSolver`.
- `src/mazegen/Cell.py` : classe `Cell` (int bitmask) + méthodes accès.
- `src/mazegen/Maze.py` : stockage et opérations sur la grille.
- `src/mazegen/MazeGenerator.py` : interfaces + `DepthFirstSearch`, `Kruskal`.
- `src/mazegen/MazeSolver.py` : `DepthFirstSearchSolver`, `AStar`.
- `src/parsing/Parsing.py` : lecture et validation du `config.txt`.
- `tests/` : tests unitaires.
- `Makefile` : cibles build/install/run/lint.
## Config file (complète)
- `config.txt` doit contenir au moins :
- largeur/hauteur
- entrée et sortie (coordonnées 1-based)
- nom du solveur, nom du générateur
- paramètres de visualisation.
(Le parser `src/parsing/Parsing.py` gère la validation et erreur 1/2/3 etc.)
## Algorithme de génération choisi
- `Kruskal` (fusion densembles) comme méthode principale.
- `DepthFirstSearch` (backtracking) complémentaire.
### Pourquoi Kruskal
- génère un labyrinthe parfait, totalement plein sans cycles, très lisible.
- bonne base pour `unperfect_maze` (possibilité de briser des murs).
- facile à tester et à raisonner, code modulaire.
## Reusable code
- `Cell` et `Maze` peuvent servir à nimporte quelle appli de grille / labyrinthes.
- `MazeGenerator` / `MazeSolver` sont des interfaces réutilisables pour autres implémentations.
- `Parsing` est un parser général de config (validation Pydantic).
## Usage / features avancées
- supports `perfect` ou `imperfect` (avec openning randomisé)
- render loop avec maj dynamique et chemins animés
- switch generator/solver à lexécution
- couleur de chemin et patterns (42)
## Resources
- Documentation python : https://docs.python.org/3/
- Mypy : https://mypy.readthedocs.io/
- Pydantic : https://docs.pydantic.dev/
- Algorithme labyrinthe : https://en.wikipedia.org/wiki/Maze_generation_algorithm
- A* : https://en.wikipedia.org/wiki/A*_search_algorithm
- Tutoriel DFS / Kruskal maze : https://weblog.jamisbuck.org/2011/1/16/maze-generation-depth-first-search
### IA utilisée
- Copilot Chat (Raptor mini) : aide à :
- correction derreurs `mypy` / import module
- refactorisation import `from mazegen.Cell import Cell`
- création du README complet
- recommandations de workflow et tests
## Équipe et gestion de projet
- Dev unique ou équipe réduite (à préciser) :
- Rôles : dev, tests, doc, releases.
- Planning anticipé :
- 1 semaine : structure + model
- 1 semaine : générateur + solveur
- 1 semaine : interface MLX + tests
- 1 semaine : typage / CI / docs
- Ce qui a bien marché :
- architecture modulaire, tests automatisés
- apprentissage sur typage et mypy
- Améliorations possibles :
- ajout dune UI web/SDL
- stubs type pour `mlx`
- config utilisateur plus riche / JSON
## Outils
- Python 3.10
- pytest, mypy, flake8
- uv/make
- Mlx (graphique)
- Git + GitHub
---
> Carte de sortie : ce README inclut toutes les parties demandées et est orienté projet complet A-Z.
## 🚀 Installation
1. Cloner le dépôt :
```sh
git clone <url> amazing
cd amazing
```
2. Créer un environnement :
```sh
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools
pip install -r requirements.txt # si présent ; sinon pip install pydantic numpy pytest mypy
```
## ▶️ Exécution
- Mode commande :
```sh
PYTHONPATH=src python3 a_maze_ing.py config.txt
```
- Avec Makefile :
```sh
make run
```
Le programme ouvre une fenêtre MLX et affiche le labyrinthe généré ; contrôles :
- 1 : regénérer
- 2 : afficher le chemin
- 3 : changer la couleur
- 4 : quitter
## 🧪 Tests
- Lancer tous les tests :
```sh
PYTHONPATH=src pytest
```
- Fichiers de tests existants :
- `tests/test_Cell.py`
- `tests/test_Depth.py`
- `tests/test_Maze.py`
- `tests/test_MazeGenerator.py`
- `tests/test_MazeSolver.py`
- `tests/test_parsing.py`
## 🧹 Lint / typage
- Flake8 + MyPy (configuration dans Makefile)
```sh
make lint
make lint-strict
```
- Sur le projet, utilisez ces commandes :
```sh
PYTHONPATH=src python3 -m mypy --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs -p mazegen -p AMazeIng
```
### Problèmes connus
- `mypy` en mode strict détecte :
- `mlx` non typé, donc `no-untyped-call` (bibliothèque native sans stub)
- `AMazeIng` identifié comme module installé sans `py.typed` pour lautocomplétion stricte.
## 🛠️ Architecture
- `Cell` : gestion binaire des murs (N, E, S, W).
- `MazeGenerator.DepthFirstSearch` : génération récursive avec backtracking.
- `MazeGenerator.Kruskal` : génération via graphe densembles disjoints.
- `MazeSolver.DepthFirstSearchSolver` : recherche DFS.
- `MazeSolver.AStar` : recherche A* avec heuristique Manhattan.
## 📝 Notes
- Préférer des imports relatifs depuis `src` :
- `from mazegen.Cell import Cell` plutôt que `from mazegen import Cell` pour éviter les conflits `module is not valid as type`.
- `from parsing.Parsing import DataMaze` pour la configuration.
- Le code est déjà prêt pour packaging avec `pyproject.toml` / `setup.cfg`.
## 📦 Distribution
- Makefile contient cible `build` générant 1 roue `.whl` via `uv build`.
- `install`|`run` sont inclus.
---
Projet maintenu en mode éducatif. Contribution bienvenue via issues et PR.