Compter les tours pour des Courses à 3 tours
Durée estimée: 45 minutes
Ce que l’on va faire :
- compter les tours,
- trouver une solution pour compter un seul tour quand la voiture touche la ligne d'arrivée,
- dire que l'on a gagné après 3 tours.
Réalisation
Ressources de départ : vous pouvez partir du résultat de la leçon précédente, ou du projet à cette adresse.Notions abordées :
- Debug : déroulement du code pas à pas pour comprendre son fonctionnement et le corriger
- caractère dynamique des test dans une boucle
- utilisation d'une variable d'état et d'un 2° lutin pour contrôler le comportement du programme
Déroulement
Pour ce développpement, nous allons modifier lea procédure "compterToursEtChronometrer" qui est appelée dasns la boucle infinie pour tester si la voiture touche la ligne d'arrivée et chronométrer. Les autres parties deu code ne sont pas modifiées.
- Compter les tours : premier essai
- Définir une variable nombreDeTours et l'initialiser à 3 au départ (script du drapeau vert).
Cette variable est le nombre de tour qui reste jusqu'à la fin de la course.
Il va falloir la réduire de 1 à chaque fois que la voiture passe la ligne d'arrivée.
Nota : vous aurez peut-être remarqué que je n'utilise pas les accents ni les espaces dans les noms de variables. Dans Scratch vosu pouvez le faire, mais ça n'est pas le cas dans d'autres langages qui l'interdisent ou le déconseillent. Il y a des conventions ou recommandations pour désigner les variables. Celle que j'utilise s'appelle "camel case" ou la "casse en chameau". Elle utilise une minuscule au prmeir mot etun majuscule au début de chaque mot suivant la variable. Ca donne des noms de variables comme nombreDeTours qui sont assez faciles à lire. Avec Scratch, Vous n'êtes pas obligés de faire comme ça, mais c'est une bonne habitude à prendre. - Masquer les variables qui ne sont pas utiles en les décochant,
- Réduire de 1 la variable nombreDeTours, si la voiture touche la ligne d'arrivée,
- Puis tester avec un bloc de contrôle Si, si le nombre de tours est égal à 0 :
- Si "oui" les blocs qui mesurent le temps, disent "J'ai gagné" et "stop tout" sont à exécuter, donc à mettre à l'intérieur de ce bloc (de branchement conditionnel),
- Si "non" il n'y a pas de bloc à ajouter, il faut simplement continuer le déroulement du script, et la boucle infinie.
- Définir une variable nombreDeTours et l'initialiser à 3 au départ (script du drapeau vert).
- Test de cette modification et debogage :
- résultat du test est négatif :
quand la voiture atteint la ligne d'arrivée, le nombre de tour descend de 3 à 0 et le programme annonce que l'on a gagné, sans avoir fait les 3 tours.
Il y a un bogue, il faut coprendre lequel (deboguer) et le corriger. - Pour ça, il faut dérouler "pas à pas"ce qui se passe quand la voiture touche le bleu (la ligne).
- Faites le avec un crayon, ...
- la première fois que la voiture touche le bleu : nombreDeTours = 3
- le nombre de tours est réduit de 1 : nombreDeTours = 2
- le nombre de tours est différent de 0 : nouvelle itération de la boucle infinie
- au passage suivant la voiture avance de vitesse, mais touche toujours la ligne
- le nombre de tours est réduit de 1 : nombreDeTours = 1
- le nombre de tours est différent de 0 : nouvelle itération de la boucle infinie
- au passage suivant la voiture avance de vitesse, mais touche toujours la ligne
- le nombre de tours est réduit de 1 : nombreDeTours = 0
- le nombre de tours est égal à 0 : donc les commandes"J'ai gagné" et stop to"ut" sont exécutées.
- trois tours ont été décomptés au lieu d'un seul!
- il faut empêcher de décompter plusieurs tours quand la voitue touche la ligne.
- résultat du test est négatif :
- Etude d'une solution et correction : :
- Pour empêcher de compter plusieurs fois,on va utiliser une variable qui vaudra 1 si le tour doit être compté et 0 sinon,
- Dès que l'on a compté une fois, on met cette variable à 0, pour ne plus compter de tour,
- On remet cette avriable à 1 quand la voiture ne touche plus la ligne, ou encore mieux, quand elle touche un lutin situé avant l'arrivée. Tant qu'elle n'aura pas touché ce lutin, les tours ne pourront être comptés.
- modification :
- Créer la variable "decompte" et l'initialiser à 0 au départ (drapeau vert),
- Créer un nouveau lutin "passage" et le placer sur la piste avant la ligne d'arrivée,
- Dans la boucle infinie, si la voiture touche "passage" autoriser le decompte de tour en mettant la variable "decompte" à 1.
- Mettre le bloc qui retire 1 au nombre de tours, à l'intérieur d'un bloc de contrôle qui teste si "decompte" = 1, et après le bloc qui réduit de 1 le nombre de tour. rmettre decompte à 0 pour empêcher un nouveau decompte.
- Tester, ça fonctionne ...
Revue des notions mises en oeuvre
- Tests dans une boucle : Comme les boucles sont souvent exécutées très rapidement,il faut faire attention à ce qu'une même instruction ne soit pas exécutée plusieurs fois, si on ne le souhaite pas.
- Debug : pour bien comprendre ce qui se passe dans un programme, il faut dérouler le code pas à pas, en notant les valeurs successives des variables utilisées;
- Lorsqu'une variable est connue de tous les lutins, elle peut être modifiée par plusieurs. C'est très pratique, mais c'est aussi dangereux car une variable peut être modifiée à un endroit auquel on ne pense pas quand on cherhce une erreur. On a alors du mal à trouver le problème.
Donc il faut éviter de partager une variable entre les lutins sauf si c'est vraiment nécessaire. Ici, la variable decompte doit être partagée entre les lutins voiture et passage. Par contre, la variable vitesse aurait dû être déclarée en variable connue seulement du lutin voiture.