Objectif
-----Tranche de vie du bureau 109
L'histoire commence à la rentrée des vacances de février 2021. Une prof de maths entre dans notre bureau (car nous sommes nombreux dans notre petit bureau) en disant:
- "C'est incroyable, ils (des term stav) ne connaissent pas les tables de multiplications! Comment veux-tu qu'ils avancent..."
Avec mes grandes oreilles, j'entends la complainte. Puis mon petit cerveau se met en marche...
- "Tiens! - lui dis-je - Tu sais que cela ferait un très bon exercice en python!"
----- Fin de la tranche de vie du bureau 109
RQ: Nouveauté 2022: ce jeu à une suite ici ->
Créer un programme nous permettant de réviser nos tables de multiplication en python. Nous commencerons par créer un programme simple permettant de faire un produit de deux entiers aléatoires entre 1 et 10 puis utiliserons la fonction input et finirons par la programmation du jeu... Alors je ne peux que vous conseiller de suivre les étapes ;)
Au fait, avant de jouer, il faut apprendre ses tables, donc je vous offre ceci :
Etape 1 - Fonction aléatoire et bibliothèque
J'ai besoin d'une fonction qui tire un entier entre 1 et 10 pour faire mon jeu.
Tester puis comprendre
# ceci est un script
from random import randint
a=randint(1,10)
b=randint(1,10)
print("a=",a)
print("b=",b)
Explication
- La ligne 2 importe la fonction randint de la bibliothèque random
- Les lignes 4 et 5 affectent une valeur entière entre 1 et 10 aux variables a et b
- Les lignes 6 et 7 affichent les valeurs de a et b
Je comprends que la fonction randint(3,20) donnerait donc une valeur aléatoire-rand entière-int entre 3 et 20 (bornes incluses). Je comprends donc que si je relance le programme une autre fois j'ai peu de chance d'afficher les mêmes valeurs ;) - cool
Etape 2 - Fonction input() et type()
Pour jouer, j'ai besoin de faire saisir à l'utilisateur sa réponse, donc j'ai besoin de la fonction input(), mais attention input() renvoie toujours une valeur de type texte et cela génère des surprises!
Tester puis comprendre
# ceci est un script
c=input("Saisir un entier entre 2 et 12 c= ")
print(c)
print(c+c)
print(c*3)
print(type(c))
d=int(input("Saisir un entier entre 2 et 12 d= "))
print(d)
print(d+d)
print(d*3)
print(type(d))
Le script du dessus donne ce qu'il y a en dessous dans le shell:
CECI EST LE RESULTAT DU SCRIPT
>>> %Run test.py
Saisir un entier entre 2 et 12 c= 3
3
33
333
<class 'str'>
Saisir un entier entre 2 et 12 d= 4
4
8
12
<class 'int'>
Explication
Amusant hein ;)
- Si l'utilisateur saisie 3 pour "c" alors puisque cette variable est de type 'str' (str = string = texte), la "somme" c+c "additionne" la lettre 3 avec la lettre 3 et donc donne 33 (Pas la peine d'allez voir le médecin) Même logique de concaténation pour le produit "c*3" qui donne 3 lettres c donc 333. Vous pourriez saisir une lettre pour "c" et vous obtiendriez le même genre de résultat!
- Si l'utilisateur saisie 4 pour "d" à l'aide d'un input() alors nous avons le même problème de type "string" que pour "c" mais vous noterez la fonction int() qui englobe le input()! Cette fonction int() transforme un nombre type texte en nombre type entier. Cela tombe bien ;)
Donc pour les calculs avec la variable "d" plus de problème ;)
Etape 3 - boucle bornée et test
Pour jouer plusieurs coups, j'ai besoin d'une boucle. La fonction for est là pour ça! Se rappeler que tout ce qui est indenté fait partie de la boucle. Et puis pour vérifier la réponse j'ai besoin de if. Se rappeler que le symbole = correspond à l'affectation et que l'opérateur d'égalité est == en python.
Tester puis comprendre
# ceci est un script
a=2
for i in range (4):
print(i,a)
if i==a:
print ("i=a est vrai")
else:
print("i=a est faux")
print("ce print n'est pas dans la boucle")
print("suite du programme...")
Le script du dessus donne ce qu'il y a en dessous dans le shell:
CECI EST LE RESULTAT DU SCRIPT
>>> %Run test.py
0 2
i=a est faux
1 2
i=a est faux
2 2
i=a est vrai
3 2
i=a est faux
ce print n'est pas dans la boucle
suite du programme...
Explication
- Repérer les indentations pour le for ... :
- Faire de même pour le if... : else :
Le jeu - algorithme de base
Bon et bien maintenant que nous avons toutes les briques, voici un algorithme pour vous aider à créer votre programme.
CECI n'est PAS un SCRIPT
importer randint de la bibliothèque random
#initialiser le compteur de reussite
n <- 0
#nombre d'essai
max <-20
#boucle
pour i allant de 0 à max :
a <- tirage aleatoire d'un entier de 1 à 10
b <- tirage aleatoire d'un entier de 1 à 10
afficher "a*b=?"
rep <- demander à l'utilisateur de saisir le resultat du produit et l'affecter à rep
# debut du test
si rep correpond à a*b alors :
afficher "Gagné, vous avez 1 point"
augmenter n de 1
sinon:
afficher "Caramba, c'est raté, vous avez 0 point"
# bilan
afficher le nombre d'essai total, le nombre de points gagnés, et la note sur 20
Le jeu final
Pour l'avoir créé, je vous propose une petite amélioration. Dans mon script, je donne une deuxième chance pour le même tirage, mais alors cela ne rapporte que 0.5 point au lieu de 1 ;)))
Saurez-vous le créer?!
Notez que dans cette copie d'écran je joue 5 fois, et que j'ai tout bon mais le script donne une seconde chance au joueur, enfin moi je le vois ;)
Propositions d'élèves
Ce qui est bien quand on enseigne, c'est que parfois on est surpris. Au regard des rendus des élèves de STAV, je conseille l'exercice car j'ai parfois rigolé... et j'avoue que cela ne m'arrive pas souvent. Merci à eux!
Comme tout travail mérite valorisation, après ma demande d'autorisation de publier les noms d'Annaelle et de Louison (RGPD), pour la gloire et la notoriété, et jusqu'à la fin des temps (je blague;), je me permets de publier leurs propositions en dessous:
Proposition de Annaelle Cocandeau : |
|
|
|
Proposition de Louison Morazin :
|