# C4-S03 — États d'un programme

import { AssessmentGrid } from "../../src/components/AssessmentGrid";
import { Correction } from "../../src/components/Correction";
import { ExerciseCard } from "../../src/components/ExerciseCard";
import { LearningObjectives } from "../../src/components/LearningObjectives";
import { LessonHeader } from "../../src/components/LessonHeader";
import { LessonNavigation } from "../../src/components/LessonNavigation";
import { TeacherTip } from "../../src/components/TeacherTip";

<LessonHeader
  id="C4-S03"
  title="Machine à états finis : Modéliser le cycle de vie d'une application"
  cycle="4"
  levels="5e, 4e, 3e"
  duration="55 minutes"
  tool="Scratch"
  grouping="Binômes"
  expressPrep={{
    objective: "Implémenter une machine à états finis (MENU, JEU, PAUSE, GAME_OVER).",
    material: "Diagramme d'états d'une application.",
    trap: "Laisser tourner la physique du jeu pendant l'état PAUSE.",
    timing: "15' Diagramme d'états • 25' Variable ETAT_JEU • 15' Bilan",
  }}
  studentUrl="/activites/cycle-4/c4-a02-gere-plusieurs-niveaux"
  studentId="C4-A02"
/>

<LearningObjectives
  objectives={[
    "Comprendre et formaliser la notion d'état d'un programme informatique (Menu, Jeu en cours, Pause, Victoire, Défaite).",
    "Utiliser une variable globale `Etat` et restreindre les transitions autorisées entre états.",
    "Structurer le code de l'application selon une boucle principale de gestion d'états (Main Loop).",
  ]}
/>

---

## 🎒 Le graphe des états d'un jeu vidéo

```mermaid
stateDiagram-v2
    [*] --> MENU
    MENU --> JEU : Clic sur Jouer
    JEU --> PAUSE : Touche P
    PAUSE --> JEU : Touche P
    JEU --> VICTOIRE : Score >= 20
    JEU --> DEFAITE : Vies <= 0
    VICTOIRE --> MENU : Bouton Rejouer
    DEFAITE --> MENU : Bouton Rejouer
```

---

## ⏱️ Déroulé de la séance

### 1. Modélisation papier du diagramme d'états (15 min)

Les élèves dessinent les bulles des différents états et tracent les flèches des transitions avec leurs conditions déclenchantes.

### 2. Atelier de programmation (30 min)

<ExerciseCard title="Mission : Le gestionnaire d'états global" difficulty="Moyen">
  Créer une variable `Etat` pouvant prendre les valeurs : `MENU`, `JEU`, `PAUSE`, `FIN`. - Bloquer
  le déplacement du joueur quand `Etat != JEU`. - Programmer la touche `P` pour basculer entre `JEU`
  et `PAUSE`.
</ExerciseCard>

<Correction title="Architecture de la boucle principale d'états">

```text
// Sur la Scène (Contrôleur global)
[quand le drapeau vert est cliqué]
mettre [Etat v] à [MENU]
basculer sur l'arrière-plan [Menu v]

[quand la touche [p v] est pressée]
si <(Etat) = [JEU]> alors
    mettre [Etat v] à [PAUSE]
    dire [PAUSE] pendant 1 secondes
sinon
    si <(Etat) = [PAUSE]> alors
        mettre [Etat v] à [JEU]

// Sur le Joueur (Mouvement conditionné à l'état)
[quand le drapeau vert est cliqué]
répéter indéfiniment
    si <(Etat) = [JEU]> alors
        si <touche la [flèche droite v] pressée ?> alors
            ajouter (10) à x
        si <touche la [flèche gauche v] pressée ?> alors
            ajouter (-10) à x
```

</Correction>

### 3. Bilan d'architecture logicielle (10 min)

La machine à états garantit qu'on ne peut pas perdre de vie quand on est dans le menu ou en pause.

---

## 📊 Grille d'évaluation

<AssessmentGrid
  criteria={[
    {
      label: "Modélise les états et transitions sur papier",
      withHelp: "Oublie des états intermédiaires (pause, game over)",
      autonomous: "Trace un graphe d'états complet et cohérent",
      transfer: "Ajoute un état `NIVEAU_2` avec de nouvelles règles",
    },
    {
      label: "Conditionne l'exécution des scripts à l'état actif",
      withHelp: "Laisse les lutins actifs pendant le menu ou la pause",
      autonomous: "Vérifie `Etat = JEU` avant d'autoriser les actions",
      transfer: "Gère une transition propre avec réinitialisation des scores",
    },
  ]}
/>


<LessonNavigation
  prevUrl="/cycle-4/c4-s02-logique-booleenne"
  prevId="C4-S02"
  prevTitle="Logique booléenne"
  nextUrl="/cycle-4/c4-s04-variables-locales-et-globales"
  nextId="C4-S04"
  nextTitle="Variables locales et globales"
  cycleUrl="/cycle-4"
  cycleTitle="Vue d'ensemble du Cycle 4"
/>
