89 lines
2.8 KiB
Markdown
89 lines
2.8 KiB
Markdown
# Jalons - Labyrinthe
|
||
|
||
> Progression suggérée sur ~10 séances (septembre → février)
|
||
|
||
---
|
||
|
||
## Phase 1 - Modélisation (Séances 1-2)
|
||
|
||
**Objectif :** Représenter un labyrinthe en Python.
|
||
|
||
- Étudier la classe `Maze` dans `../src/maze.py` : comment est codé le labyrinthe ? Quelles méthodes sont disponibles ?
|
||
- Choisir une représentation : dictionnaire `{cellule: [voisins accessibles]}` ou grille 2D avec murs
|
||
- Écrire `creer_grille(n, m)` → grille n×m avec tous les murs fermés
|
||
- Écrire `afficher(grille)` → affichage terminal avec `+`, `-`, `|`, ` `
|
||
|
||
**Exemple de représentation :**
|
||
```
|
||
+--+--+--+
|
||
| | |
|
||
+ +--+ +
|
||
| | |
|
||
+--+--+--+
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 2 - Génération (Séances 3-4)
|
||
|
||
**Objectif :** Générer un labyrinthe parfait aléatoirement.
|
||
|
||
**Algorithme DFS récursif (backtracking) :**
|
||
1. Partir d'une cellule aléatoire, la marquer comme visitée
|
||
2. Choisir aléatoirement un voisin non visité
|
||
3. Supprimer le mur entre les deux cellules
|
||
4. Appeler récursivement depuis le voisin
|
||
5. Si aucun voisin non visité : revenir en arrière (backtrack)
|
||
|
||
- Implémenter `generer_dfs(grille, cellule)` de manière récursive
|
||
- Tester sur un labyrinthe 5×5, puis 20×20
|
||
- Observer : le labyrinthe est-il toujours parfait (sans cycle) ?
|
||
|
||
---
|
||
|
||
## Phase 3 - Résolution (Séances 5-6)
|
||
|
||
**Objectif :** Trouver le chemin de l'entrée à la sortie.
|
||
|
||
- Implémenter `resoudre_bfs(grille, entree, sortie)` → plus court chemin (largeur d'abord)
|
||
- Implémenter `resoudre_dfs(grille, entree, sortie)` → premier chemin trouvé (profondeur d'abord)
|
||
- Comparer les deux : même longueur de chemin ? Même rapidité ?
|
||
- Afficher le chemin dans le labyrinthe (ex. cellules marquées `*`)
|
||
|
||
**Point clé :** dans un labyrinthe parfait, BFS et DFS trouvent tous les deux le chemin (unique), mais BFS garantit qu'il est le plus court.
|
||
|
||
---
|
||
|
||
## Phase 4 - Affichage graphique (Séances 7-8)
|
||
|
||
**Objectif :** Visualiser la génération et la résolution.
|
||
|
||
- Choisir une bibliothèque graphique (Pyxel, tkinter, pygame)
|
||
- Afficher le labyrinthe avec des rectangles
|
||
- Animer la génération cellule par cellule
|
||
- Afficher le chemin solution en couleur
|
||
|
||
---
|
||
|
||
## Phase 5 - Finitions et documentation (Séances 9-10)
|
||
|
||
**Objectif :** Préparer le rendu et le Grand Oral.
|
||
|
||
- Nettoyer le code, ajouter des docstrings
|
||
- Mesurer les performances : temps de génération selon la taille (10×10, 50×50, 100×100)
|
||
- Compléter le `SUIVI.md`
|
||
- Préparer 2-3 questions pour le Grand Oral
|
||
|
||
---
|
||
|
||
## Idées d'extension avancée
|
||
|
||
- **A\*** : heuristique distance de Manhattan pour guider la recherche vers la sortie
|
||
- **Kruskal** : algorithme de génération alternatif (union-find)
|
||
- **Résolution par algo génétique** : utiliser le framework du projet `mastermind/`
|
||
- **Labyrinthe 3D** : extension vers une grille à 3 dimensions
|
||
|
||
---
|
||
|
||
Auteur : Florian Mathieu - Licence CC BY NC
|