Aller au contenu principal

Affichage du score

Indiquer au joueur s’il a bien répondu… et suivre sa progression en temps réel !

Score

Objectifs de la séance

  • Créer un composant React pour afficher le score
  • Mettre à jour le score à chaque réponse
  • Afficher immédiatement si la réponse est correcte ou non
  • Afficher le score actuel sur l’interface, en haut de la page

Notions théoriques

Pourquoi afficher un score en direct ?

Un quiz est plus motivant si l’on voit :

  • le nombre de bonnes réponses
  • la progression au fil des questions
  • une correction immédiate

Cela permet au joueur de :

  • savoir où il en est
  • se corriger en temps réel
  • se challenger

Comment gérer un score dans React ?

On utilise un état (useState) pour stocker le score :

const [score, setScore] = useState(0);

État score

À chaque bonne réponse, on incrémente ce score :

if (reponse.est_correcte) {
setScore(score + 1);
}

Où afficher le score ?

On crée un composant dédié, par exemple Score.tsx, pour l’afficher :

<Score actuel={score} total={questions.length} />

Ce composant affiche quelque chose comme :

Score : 3 / 10


Correction instantanée

On affiche immédiatement un message :

  • ✅ Bonne réponse !
  • ❌ Mauvaise réponse…

suivi par l’explication.

const message = estBonneReponse ? "✅ Bonne réponse !" : "❌ Mauvaise réponse.";
const explicationTexte = message + " " + (question.explication || "");
setExplication(explicationTexte);
setAfficherExplication(true);

Exemple de logique complète

function handleClick(reponse: any) {
if (!question || afficherExplication) return;

const estBonneReponse = reponse.est_correcte;

if (estBonneReponse) {
setScore(prev => {
const nouveauScore = prev + 1;
return nouveauScore;
});
}

const message = estBonneReponse ? "✅ Bonne réponse !" : "❌ Mauvaise réponse.";
const explicationTexte = message + " " + (question.explication || "");

setExplication(explicationTexte);
setAfficherExplication(true);

setTimeout(() => {
setAfficherExplication(false);
setExplication("");
setQuestionIndex((prev) => prev + 1);
}, 4000);
}

Quelques méthodes à connaître

Méthode / outilUtilité
useState(0)Stocker un compteur (score)
setScore(score + 1)Incrémenter le score
propsTransmettre des données (ex : score) à un composant
useEffectDéclencher une action à un moment précis
disabled={...}Désactiver les boutons pendant la correction

Test de mémorisation / compréhension


Quel hook permet de stocker le score du joueur ?


Comment incrémenter un score dans React ?


Pourquoi utiliser un composant pour afficher le score ?


Que fait `disabled={true}` sur un bouton ?


Quand affiche-t-on l’explication de la réponse ?



TP pour réfléchir et résoudre des problèmes

Objectif

Afficher un score en direct et une correction instantanée à chaque réponse.


Étapes du TP

  1. Créer un composant Score.tsx
  2. Ajouter un état score dans page.tsx
  3. Incrémenter le score à chaque bonne réponse
  4. Afficher le score dans l’interface
  5. Afficher un message immédiat après chaque réponse (bonne / mauvaise)
  6. Désactiver les boutons pendant l’affichage de l’explication

Résultat attendu

  • Le joueur voit son score en haut de l’écran
  • Lorsqu’il répond, un message s’affiche :
    • ✅ Bonne réponse !
    • ❌ Mauvaise réponse…
  • Le score s’incrémente automatiquement
  • Les boutons sont désactivés pendant l’explication

Code à compléter

1. Créer le composant Score.tsx

// components/Score.tsx

export default function Score({ actuel, total }: { actuel: number; total: number }) {
return (
<div className="text-center text-lg font-bold mt-4">
Score : {actuel} / {total}
</div>
);
}

Composant Score


2. Ajouter l’état score dans page.tsx

Pour suivre le nombre de bonnes réponses, il suffit d'ajouter un état score avec la fonction setScore et la valeur initiale 0.

Une solution
const [score, setScore] = useState(0);

État score


3. Incrémenter le score

Augmenter le score dans la fonction handleClick

// Incrémenter le score si la réponse est correcte
if (estBonneReponse) {
setScore(prev => {
const nouveauScore = prev + 1;
return nouveauScore;
});
}

État score


4. Afficher le composant Score

  • En haut du fichier page.tsx :

    import Score from "@/components/Score";

    // ...

  • En haut du return, juste après l’alerte de bienvenue, on ajoute le composant <Score> :

    <Score actuel={score} total={questions.length} />

    Voici la ligne dans la partie de code :


    // ...

    return (
    <div>
    {!joueurPret ? (

    <div>

    <Alert className="bg-blue-50 border-blue-300 text-blue-800 max-w-xl mx-auto mt-6">
    <AlertTitle className="text-xl font-semibold">Bienvenue sur CyberQuiz</AlertTitle>
    <AlertDescription>
    Un quiz pour tester vos connaissances en cybersécurité.
    </AlertDescription>
    </Alert>
    <FormulaireJoueur onJoueurCree={() => setJoueurPret(true)} />

    </div>

    ) : (

    <div>

    <Alert className="bg-green-50 border-green-300 text-green-800 max-w-xl mx-auto mt-6">
    <AlertTitle className="text-xl font-semibold">
    Bienvenue {joueurNom} !
    </AlertTitle>
    <AlertDescription>
    Préparez-vous à tester vos connaissances en cybersécurité.
    </AlertDescription>
    </Alert>

    <Score actuel={score} total={questions.length} />

    {questions.length > 0 ? (
    <Card className="max-w-4xl mx-auto mt-6">

    // ...

52_utiliser_Score.png


5. Désactiver les boutons pendant l’explication

Pour désactiver les boutons pendant l’explication, il suffit d'ajouter : disabled={afficherExplication} dans <Button> :

disabled={afficherExplication}
Une solution
<Button
key={reponse.id}
onClick={() => handleClick(reponse)}
disabled={afficherExplication}
className="w-full justify-start mt-2"
variant="outline"
>
{reponse.texte}
</Button>

Bouton désactivé


6. Correction instantanée

On affiche immédiatement un message :

  • ✅ Bonne réponse !
  • ❌ Mauvaise réponse…

suivi par l’explication.

function handleClick(reponse: any) {
if (!question || afficherExplication) return;

const estBonneReponse = reponse.est_correcte;

if (estBonneReponse) {
setScore(prev => {
const nouveauScore = prev + 1;
return nouveauScore;
});
}

const message = estBonneReponse ? "✅ Bonne réponse !" : "❌ Mauvaise réponse.";
const explicationTexte = message + " " + (question.explication || "");

setExplication(explicationTexte);
setAfficherExplication(true);

setTimeout(() => {
setAfficherExplication(false);
setExplication("");
setQuestionIndex((prev) => prev + 1);
}, 4000);
}
Voir le code complet d'une solution possible