Index de l'article

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

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 :
j'admire l'approche constructive de l'erreur et la gestion des print dans le shell

Proposition de Louison Morazin :
Il est chaud Louison ;))) - j'ai regardé sur le net: T'es sah = "pour de vrai" ou "t'es sérieux"
####
# Ajout Pierre Troulet
# creation Annaelle C - STAV promo 2020-2022
# en voici un script bien commenté... je n'ai plus grand chose à dire ;)
####

#Importation des bibliothèques
from random import randint

#Déclaration des variables
x = 0 #Nombre de points
print ("Vous avez 20 essais") #Affiche le nombre d'essais

#Début boucle
for i in range (20):
    a = randint(1,10) #Nombre aléatoire pour le calcul
    b = randint(1,10) #Nombre aléatoire pour le calcul
    print(a," * ",b," = ? ") #Affiche "a + b = ?"
    d=int(input("Saisir le résultat:")) #Demande au joueur de saisir sa réponse
    if d == a * b: #Calcule a * b et vérifie si la condition est bonne
        #Condition d (réponse) = a * b
        print ("Gagné, vous avez 1 point")
        x = x + 1
        print () #Retour à la ligne
        print ("Vous avez",x,"point(s) au total")
        print ("Vous êtes à votre",i+1,"ème essais sur 20")
        print () #Retour à la ligne
    else: #Condition d (réponse) ≠ a * b
        print("Caramba, c'est raté, vous avez une deuxième chance:")
        d=int(input("Saisir le résultat:")) #Redemande au joueur de saisir sa réponse
        if d == a * b: #Calcule a * b et vérifie si la condition est bonne
            #Condition d (réponse) = a * b
            print ("Gagné, vous avez 0.5 point")
            x = x + 0.5
            print () #Retour à la ligne
            print ("Vous avez",x,"point(s) au total")
            print ("Vous êtes à votre",i+1,"ème essais sur 20")
            print () #Retour à la ligne
        else: #Condition d (réponse) ≠ a * b
            print("Caramba, c'est raté, vous avez 0 points")
            print () #Retour à la ligne
            print ("Vous avez",x,"point(s) au total")
            print ("Vous êtes à votre",i+1,"ème essais sur 20")
            print () #Retour à la ligne
            print () #Retour à la ligne
            print ("Vous avez",x,"point(s) au total")
            print ("Vous êtes à votre",i+1,"ème essais sur 20")
            print () #Retour à la ligne

#Affichage des scores
print () #Retour à la ligne
print ()
print ("Jeu terminé, vous avez eu",x,"points en",i + 1,"essais.")
####
# Ajout Pierre Troulet
# creation Louison M - STAV promo 2020-2022
####

# ceci est un script
from random import randint
n=0
max=20

for i in range(max):
    a=randint(1,10)
    b=randint(1,10)
    u=a*b
    print(a,"x",b)
    d=int(input("="))
    if d == u:
        n=n+1
        print("T'es chaud bien joué cousin !")
    else:
        print("T'es sah, tu déconnes la ! La bonne réponse c'était",u)
    
#bilan
print("Tu a eu",n,"sur",max)
if n>15:
    print("c'est une bonne note, t'auras ton bac.")
else:
    print("Euhh... continue de t'entrainer la")
Pièce(s) jointe(s)
Download this file (table.png)table.png[ ]918 kB