# C4-A03 — Gère un inventaire avec une liste

import { ActivityHero } from "../../../src/components/ActivityHero";
import { ActivitySolution } from "../../../src/components/ActivitySolution";
import { BlockImage } from "../../../src/components/BlockImage";
import { BonusChallenge } from "../../../src/components/BonusChallenge";
import { CompletionCheck } from "../../../src/components/CompletionCheck";
import { Hint } from "../../../src/components/Hint";
import { PrintableVersion } from "../../../src/components/PrintableVersion";
import { StarterProject } from "../../../src/components/StarterProject";
import { StudentStep } from "../../../src/components/StudentStep";
import { TeacherAccess } from "../../../src/components/TeacherAccess";
import { TryIt } from "../../../src/components/TryIt";

<ActivityHero
  id="C4-A03"
  title="Gère l'inventaire d'un jeu de rôle avec une liste dynamique"
  cycle="4"
  level="5e, 4e, 3e"
  duration="50 min"
  tool="Scratch avancé"
  difficulty="Défi"
  needsAdult={false}
  mission="Crée le sac à dos d'un aventurier avec une liste : ramasse des clés, potions et boucliers, vérifie si un objet précis est possédé et supprime un objet quand il est utilisé !"
/>

<PrintableVersion
  pdfColorUrl="/downloads/c4-a03-utilise-une-liste.pdf"
  pdfColorName="Fiche mission élève : Manipuler les listes et tableaux (A4)"
/>

<StarterProject
  title="Projet Scratch de départ"
  type="scratch"
  downloadUrl="/projects/c4-a03-listes-donnees-depart.sb3"
  filename="c4-a03-listes-donnees-depart.sb3"
  size="0.5 KB"
  preparedItems={[
    "Lutin Héros 'Knight' au centre",
    "Objets à ramasser : Clé dorée, Potion magique, Bouclier de fer",
    "Liste 'Inventaire' déjà créée dans la palette Variables",
  ]}
/>

---

## 🪜 Les étapes de gestion de liste

<StudentStep
  number={1}
  title="Vide le sac à dos au démarrage"
  check="La liste Inventaire est vide (longueur = 0) au clic sur le drapeau vert."
>
  Sur le **Héros**, réinitialise toujours la liste :
  <BlockImage category="variables" text="supprimer tous les éléments de la liste [Inventaire v]" />
</StudentStep>

<StudentStep number={2} title="Ajoute un objet quand tu le touches" check="Dès que le héros touche la clé, 'Clé dorée' s'ajoute dans la liste et la clé se cache.">
  Sur le lutin **Clé dorée** :
  ```text
  quand le drapeau vert est cliqué
  montrer
  répéter indéfiniment
      si <touche le [Knight v] ?> alors
          ajouter [Clé dorée] à [Inventaire v]
          jouer le son [Collect v]
          cacher
          stop [ce script v]
  ```
</StudentStep>

<StudentStep number={3} title="Vérifie si un objet est présent dans la liste" check="La porte s'ouvre si la liste contient 'Clé dorée'.">
  Sur le lutin **Porte verrouillée** :
  ```text
  quand ce lutin est cliqué
  si <[Inventaire v] contient [Clé dorée] ?> alors
      dire [Porte déverrouillée !] pendant 2 secondes
      supprimer (position de [Clé dorée] dans [Inventaire v]) de [Inventaire v]
      basculer sur le costume [porte_ouverte v]
  sinon
      dire [Il te faut la Clé dorée pour ouvrir !] pendant 2 secondes
  ```
</StudentStep>

---

## 🧪 Teste ton inventaire

<TryIt expected="Clique sur la porte : elle refuse de s'ouvrir. Va ramasser la clé : elle s'ajoute à ton inventaire. Re-clique sur la porte : elle s'ouvre et consomme la clé de la liste !">
  Ramasse ensuite la potion et le bouclier pour observer le sac à dos se remplir.
</TryIt>

---

## 💡 Indices progressifs

<Hint
  hints={[
    {
      level: 1,
      title: "Indice 1 — Où sont les blocs de liste ?",
      content: (
        <p>
          Tout en bas de la catégorie orange <strong>Variables</strong>, après avoir cliqué sur «
          Créer une liste ».
        </p>
      ),
    },
    {
      level: 2,
      title: "Indice 2 — Le bloc de recherche 'contient'",
      content: (
        <p>
          Le bloc hexagonal <code>&lt;[Inventaire] contient [texte] ?&gt;</code> renvoie VRAI si
          l'élément est dans la liste.
        </p>
      ),
    },
    {
      level: 3,
      title: "Indice 3 — Parcourir toute la liste",
      content: (
        <p>
          Pour faire réciter la liste au héros :{" "}
          <code>
            mettre index à 1 -&gt; répéter (longueur de Inventaire) [dire (élément index de
            Inventaire), ajouter 1 à index]
          </code>
          .
        </p>
      ),
    },
  ]}
/>

---

## 🔍 Solution et explications

<ActivitySolution
  title="Voir les scripts complets de gestion de l'inventaire"
  downloadUrl="/projects/c4-a03-listes-donnees-corrige.sb3"
  filename="c4-a03-listes-donnees-corrige.sb3"
  size="0.5 KB"
>

```text
// Sur le Héros (Lecture du contenu de l'inventaire)
[quand la touche [i v] est pressée]
si <(longueur de [Inventaire v]) = 0> alors
    dire [Mon sac à dos est vide !] pendant 2 secondes
sinon
    mettre [index v] à 1
    répéter (longueur de [Inventaire v]) fois
        dire (regrouper [Objet : ] (élément (index) de [Inventaire v])) pendant 1.5 secondes
        ajouter (1) à [index v]
```

</ActivitySolution>

---

## 🌟 Défi bonus

<BonusChallenge title="Défi bonus : Limite la taille maximale du sac à dos !">
  Empêche le joueur de ramasser plus de 3 objets : `si <(longueur de Inventaire) < 3> alors [ajouter...] sinon [dire "Mon sac est plein !"]`.
</BonusChallenge>

---

<CompletionCheck
  activityId="C4-A03"
  nextActivityUrl="/activites/cycle-4/c4-a04-cree-des-clones"
  nextActivityTitle="C4-A04 — Crée des clones et projectiles"
  cycleUrl="/activites/cycle-4"
/>

<TeacherAccess lessonId="C4-S05" lessonTitle="Listes" lessonUrl="/cycle-4/c4-s05-listes" />
