Files
TermNSI/Projets/FEUILLE_DE_ROUTE.md
2026-09-18 10:39:40 +02:00

141 lines
8.8 KiB
Markdown

# Feuille de route des projets
À lire au début de chaque séance. Trouvez votre projet, vérifiez où vous en êtes, et prenez la suite.
## Comment s'en servir
Chaque projet est découpé en cinq phases de deux séances, décrites dans son fichier `JALONS.md`. Cette feuille ajoute trois choses que les jalons ne disent pas : comment savoir que vous avez terminé une phase, quoi faire exactement aujourd'hui, et quoi faire si vous allez plus vite que prévu.
**Une règle avant tout le reste.** Un projet n'avance pas parce qu'on écrit beaucoup de code, il avance parce que quelque chose fonctionne à la fin de la séance. Mieux vaut une fonction qui marche qu'un fichier de deux cents lignes qui ne s'exécute pas.
**Une seconde règle.** À la fin de chaque séance, complétez votre fiche `SUIVI.md` : ce que vous avez fait, ce qui bloque, ce que vous ferez la prochaine fois. Trois lignes suffisent. C'est ce document qui vous sauvera quand vous reprendrez le projet une semaine plus tard.
---
## Ce dont vous avez besoin, et quand
Beaucoup de groupes se demandent s'ils vont être bloqués par le cours. Voici la réponse, projet par projet.
| Projet | Notions nécessaires | Déjà vues ? |
|--------|---------------------|-------------|
| Jeu de la Vie | listes de listes, boucles, fonctions | oui, depuis la Première |
| Wa-Tor | listes de listes, boucles, fonctions, aléatoire | oui, depuis la Première |
| Labyrinthe | les mêmes, plus la **récursivité** en phase 2 | la récursivité est le chapitre en cours |
| Mastermind | les mêmes, plus l'écriture de **méthodes** en phase 2 | voir la note du projet plus bas |
Autrement dit, pour quatre projets sur cinq, rien dans le cours ne vous bloquera avant le mois de décembre. Si vous êtes arrêtés, c'est une difficulté de programmation, pas une notion qui vous manque. Appelez plutôt que d'attendre.
---
## Jeu de la Vie
### Fin de la séance 2, vous devez pouvoir cocher
- [ ] Nous savons expliquer les quatre règles de Conway avec nos propres mots
- [ ] Nous avons dessiné à la main deux générations d'une configuration simple
- [ ] `creer_grille(n, m)` renvoie une grille vide et nous savons dire ce que contient une case morte
- [ ] `afficher_grille(grille)` affiche quelque chose de lisible dans le terminal
- [ ] Nous avons tranché la question des bords : que se passe-t-il pour une cellule de la première ligne ?
### Aujourd'hui, dans cet ordre
1. Reprenez votre représentation de grille et testez-la : créez une grille 5 sur 5, mettez trois cellules vivantes à la main, affichez-la. Si l'affichage est faux, rien de ce qui suit ne marchera.
2. Écrivez `compter_voisins(grille, i, j)`. C'est la fonction centrale du projet, et la plus piégeuse.
3. Testez-la sur les cas difficiles avant de continuer : un coin, un bord, le centre. Vérifiez le résultat à la main sur votre dessin.
### Si vous allez plus vite
Passez à `etat_suivant` et `generation_suivante`, qui sont la phase 3. Puis traitez les bords en **tore** : la grille se referme sur elle-même, la colonne de droite est voisine de la colonne de gauche. C'est plus élégant que les cas particuliers, et vous retrouverez cette idée dans le Wa-Tor.
---
## Wa-Tor
### Fin de la séance 2, vous devez pouvoir cocher
- [ ] Nous savons énoncer les règles de déplacement, de reproduction et de mort
- [ ] Nous avons listé ce que doit retenir un thon, et ce que doit retenir un requin en plus
- [ ] `creer_grille(n, m, nb_thons, nb_requins)` produit une grille peuplée au hasard
- [ ] `afficher(grille)` montre les thons, les requins et les cases vides
- [ ] Nos constantes de gestation et d'énergie sont écrites en haut du fichier, en majuscules
### Aujourd'hui, dans cet ordre
1. Vérifiez votre grille initiale : lancez-la trois fois de suite, la répartition doit changer à chaque fois.
2. Écrivez `voisins_libres(grille, i, j)`, qui renvoie la liste des cases vides adjacentes. Testez-la sur un coin.
3. Écrivez `deplacer_thon`, sans vous occuper de la reproduction pour l'instant. Faites tourner une grille de thons seuls sur dix étapes et regardez-les bouger.
### Si vous allez plus vite
Ajoutez la gestation des thons, puis attaquez les requins, qui sont la phase 3. Attention au piège classique : si vous parcourez la grille de haut en bas en déplaçant les animaux au fur et à mesure, un même thon peut se déplacer plusieurs fois dans la même étape. Réfléchissez à la manière de l'éviter, c'est une vraie question de conception.
---
## Labyrinthe
### Fin de la séance 2, vous devez pouvoir cocher
- [ ] Nous avons ouvert `src/maze.py` et nous savons dire comment la classe `Maze` range un labyrinthe
- [ ] Nous avons choisi notre représentation et nous savons justifier ce choix
- [ ] `creer_grille(n, m)` produit une grille dont tous les murs sont fermés
- [ ] `afficher(grille)` dessine le labyrinthe dans le terminal avec des `+`, des `-` et des `|`
- [ ] Nous savons dire ce qu'est un labyrinthe parfait
### Aujourd'hui, dans cet ordre
1. Finissez l'affichage. Tant qu'un labyrinthe tout fermé ne se dessine pas correctement, vous ne verrez pas si la génération fonctionne.
2. Écrivez sur le papier l'algorithme de génération par parcours en profondeur, en français, en quatre ou cinq lignes.
3. Commencez `generer_dfs`. C'est de la récursivité, exactement le chapitre en cours : votre fonction s'appellera elle-même sur la cellule voisine.
### Si vous allez plus vite
Faites tourner la génération sur un 5 sur 5, puis sur un 20 sur 20, et vérifiez à l'oeil qu'il n'y a jamais de boucle. Ensuite, essayez d'écrire la même génération **sans récursivité**, avec une pile que vous gérez vous-mêmes. Comparer les deux versions est l'un des meilleurs exercices possibles sur la notion, et ça vous servira au chapitre Pile et File.
---
## Mastermind et algorithmes génétiques
### Une note pour vous, avant tout
Votre projet est le seul à demander d'écrire des **méthodes**, c'est-à-dire des fonctions rangées à l'intérieur d'une classe, alors que le chapitre sur la programmation orientée objet n'a pas encore été traité.
Ce n'est pas un problème, pour une raison simple : **les classes vous sont fournies**, déjà déclarées. Vous n'avez pas à en concevoir, vous avez à remplir des méthodes déjà nommées, qui commencent toutes par `self`. Traitez `self` comme un paramètre ordinaire qui désigne l'individu en cours, et tout le reste est de la programmation que vous connaissez.
Deux documents vous accompagnent, tous deux liés depuis le `README.md` du projet : la **fiche de TP**, qui donne les consignes dans l'ordre, et l'**activité guidée**, qui vous mène pas à pas avec les explications. Commencez toujours par la seconde.
### Fin de la séance 2, vous devez pouvoir cocher
- [ ] Nous savons expliquer ce qu'est une population, un individu et une génération
- [ ] Nous savons dire ce que font un croisement et une mutation, sans parler de code
- [ ] Nous avons ouvert `individual_interface.py` et repéré les méthodes vides à remplir
- [ ] Nous avons choisi notre liste de couleurs et la taille d'une combinaison
### Aujourd'hui, dans cet ordre
1. Lisez l'activité guidée jusqu'à la section sur la création des individus.
2. Écrivez `init_value`, qui fabrique une combinaison au hasard. Testez-la en l'appelant dix fois : les combinaisons doivent différer.
3. Écrivez `cross_with`, le croisement en un point. Testez-le sur deux combinaisons que vous choisissez à la main, pour vérifier à l'oeil que les enfants sont bien un mélange des parents.
### Si vous allez plus vite
Écrivez `mutate_gene`, puis passez à la classe du problème, qui est la phase 3. Une question à garder en tête pour la suite : votre algorithme trouve-t-il toujours la solution, et en combien de générations en moyenne ? Faites-le tourner vingt fois et notez les résultats, ce sera votre matière pour la phase 5.
---
## Si vous êtes bloqués
Dans l'ordre, avant d'appeler.
1. Relisez la consigne exacte du `JALONS.md` : le problème vient souvent de ce qu'on a répondu à une autre question.
2. Faites tourner votre code sur le plus petit cas possible, une grille 3 sur 3, deux individus, un labyrinthe 2 sur 2.
3. Affichez les valeurs intermédiaires avec des `print`. La moitié des blocages disparaissent en voyant ce que contiennent vraiment les variables.
4. Écrivez sur le papier ce que la fonction doit faire, en français, ligne à ligne.
---
Auteur : Florian Mathieu
Licence CC BY-SA
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>.