Imprimer
Catégorie : Programmation Python - STAV
Affichages : 13622

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

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 ;)

 


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

 


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