Jeu pour réviser les tables de multiplication
Énoncé de l’exercice :
Écrire un programme qui choisit aléatoirement deux chiffres entre [1 et 10] et qui demande au joueur de donner le résultat de multiplication de ces 2 chiffres.
- Le programme posera 20 questions de la table de multiplication choisies aléatoirement
- Si le joueur donne le bon résultat le programme affiche un message de félicitation et passe à la question suivante
- Si le joueur donne un mauvais résultat le programme affiche un message d’encouragement et repropose la même question jusqu’à ce que la bonne réponse soit donnée
Proposition de solution
Il existe plusieurs manières différentes pour résoudre ce problème, voici la mienne :
Vous trouverez en dessous du code sa description et l’explication des fonctions choisies.
from random import randint
from random import choice
iterMax = 5
nbrQuestion = 10
msgCourage = ["Tu y es presque, essaie un autre nombre : ", "Courage, tu vas finir par trouver la bonne réponse : ",
"Essaie encore, ne te décourage pas : ", "Ah dommage, tu y es presque, essaie encore : "]
msgFelicit = ["Bravo ! Ty es un(e) champion(ne)", "Et encore une bonne réponse !", "Oui oui oui ouiiiiii",
"C'est tout simplement Génial ! ", "ça c'est un travail de PRO !", "Trop trop fort, ne change rien !"]
q=0
while q < nbrQuestion:
nbr1 = randint(2, 9)
nbr2 = randint(2, 9)
sol = int(input(str(nbr1) + " x " + str(nbr2) + " = "))
it = 0
while it < iterMax:
if sol == nbr1*nbr2:
print(choice(msgFelicit))
print("Félicitations !")
break
elif it == iterMax-1:
print("la réponse juste est ", nbr1*nbr2)
break
else:
print(choice(msgCourage))
sol = int(input("Courage, nouvelle réponse :"))
it = it+1
q = q+1
Description de la solution
Tout d’abord j’ai commencé par importer du module random, les fonctions randint() et choice().
La fonction randint() permet de retourner un nombre entier compris dans un intervalle donné. J’ai utilisé cette fonction pour choisir au hasard deux nombres entiers compris entre 2 et 9. Le joueur doit donner le résultat de multiplication de ces deux nombres.
Pour encourager le joueur, j’ai pensé à lui afficher quelques messages d’encouragement. Ces messages sont répertoriés dans deux listes différentes :
- Messages d’encouragement en cas de mauvaise réponse. (msgCourage)
- Et message de félicitations en cas de bonne réponse. (msgFelicit)
J’ai utilisé la fonction choice() pour choisir de façon aléatoire un message à partir de ces deux listes. La fonction choice() prend un seul argument (une liste) et retourne un élément de la liste choisi au hasard.
Ensuite j’ai utilisé la fonction input() pour interagir avec le jouer en lui demandant d’entrer les réponses aux questions.
Puis la fonction int() qui permet de transformer les valeurs entrées par l’utilisateur en nombres entiers.
Une boucle while pour proposer plusieurs questions. La variable nbrQuestion, ici égale à 10.
Une autre boucle while est utilisée en cas de mauvaise réponse. Le paramètre iterMax limite le nombre de mauvaises réponses données pour une même question.
Et enfin, j’ai utilisé les tests conditionnels avec les instructions if, elif et else pour diriger l’interaction avec le joueur en fonction de sa réponse.
J’ai fait le choix d’utiliser des boucles while, mais il est tout à fait possible de résoudre l’exercice uniquement avec des boucles for ou avec un mélange des deux boucles. Vous pouvez refaire l’exercice avec des boucles différentes.
Propositions d’amélioration
Un code est toujours amené à être évolué. Le but derrière cet exercice est de montrer des cas d’utilisation de quelques fonctions du module random. Pour rendre le code plus performant, on peut anticiper certaines erreurs d’exécution au cas où l’utilisateur n’entre pas une valeur au clavier mais plutôt une lettre, dans cette éventualité le programme enverra une erreur comme celle affichée ci-dessous :
Traceback (most recent call last):
File « /revisionTableMultiplication.py », line 14, in <module>
sol = int(input(str(nbr1) + » x » + str(nbr2) + » = « ))
ValueError: invalid literal for int() with base 10: »
En gros, l’erreur dit que la fonction int() ne parvient pas à transformer une chaine de caractère en un nombre entier. On pourrait forcer le programme d’afficher à l’utilisateur d’entrer un nombre valide plutôt que de laisser le programme afficher cette erreur, c’est ce qu’on appelle la gestion des exceptions.
En deuxième proposition d’amélioration de code, on pourrait entregistrer le nombre de bonnes réponses et le nombre des mauvaises réponses, puis enregistrer les mauvaises réponses pour tout afficher à la fin du jeu. Cela permettra d’informer le joueur de sa performance.
Vous pouvez faire l’exercice de faire cette deuxième amélioration.