Index de l'article

Objectif

Reprendre le script du jeu se trouvant en dessous élaboré par Etaine BRUNET, élève de première STAV en 2021 (accord pour citation de sa part) et le modifier le afin de calculer la fréquence des erreurs faites par le joueur par tables. Pour comprendre l'esprit du script, voir ici.

Imaginons que la valeur aléatoire de a soit 7 et que celle de b soit 5, alors il est demandé au joueur le résultat de 7x5. Supposons que le joueur réponde 34, nous partirons alors du principe que le joueur ne connaît pas la table de 7 NI la table de 5. Ces deux tables seront donc à ajouter dans la liste d'erreurs.

L'objectif sera donc en fin de partie de disposer d'une liste de toutes les erreurs faites par le joueur, par exemple : [7,5,5,3,2,9] (ici le joueur a joué trois fois et c'est trompé à chaque fois) et de calculer les fréquences de ses erreurs par tables de multiplication.

#------------------
# proposition initiale faite par Etaine
#------------------
from random import randint
n=0
max=3
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")  

Testez ce script et comprenez le...


Etape 1 - Présentation des listes et de la méthode append()

Que l'on soit bien d'accord, pour l'instant mon programme ne conserve rien dans sa mémoire. Pour chaque tour dans la boucle, il calcule a,b, mémorise rep, incrémente n (ou pas) puis les valeurs de ces variables sont écrasées lors de la boucle suivante...

Il est temps de faire appel aux listes et à ces méthodes. Pour la doc voir ici: https://docs.python.org/fr/3/tutorial/datastructures.html

 

Tester le script suivant

Le script

vide=[]
pasvide=[2,"rieffel",2.58]
print(vide)
print(type(vide))
print(pasvide)
print(type(pasvide))
vide.append(12)
vide.append("plus vide")
print("-----")
print(vide)

Le résultat

>>> %Run zzz.py
[]
<class 'list'>
[2, 'rieffel', 2.58]
<class 'list'>
-----
[12, 'plus vide']

Pour comprendre

  • La première ligne => création d'une liste de nom "vide" ne contenant pas d'élément. Elle est donc vide!
  • La seconde ligne => création d'une liste de nom "pasvide" contenant 3 éléments: l'entier 2, le texte rieffel et le décimal 2.58
  • Les lignes 3 et 4 affichent le contenu de la liste vide et son type "class 'list". C'est donc une liste ;)
  • Idem pour les lignes 5 et 6
  • La ligne 7 applique la méthode append() à la liste vide et lui ajoute l'entier 12 => la liste vide contient maintenant 12!
  • La ligne 8 applique la méthode append() à la liste vide qui contient 12 le texte "plus vide" => la liste vide contient maintenant 12 et le texte "plus vide"!

Pour enfoncer le clou

Je veux créer une liste qui contiendra les 100 premiers entiers au cube. Je me dis qu'une boucle me fera gagner du temps! En partant d'une liste vide, je peux ajouter les cubes via la méthode append().

cube=[]
n=0
for i in range (100):
    n=i*i*i
    cube.append(n)
  • Notez que je peux le faire en n'utilisant pas la variable n, et en gagnant 2 lignes! Trouvez le script!
  • Notez aussi que si i*i*i calcule bien le cube de i, il en est de même pour i**3 ;)

Etape 2 - Mémorisation des erreurs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

 

Tester le script suivant

En comprenant l'étape 1, j'ai l'idée de faire ceci:

Le script

#------------------
# proposition initiale faite par Etaine, et amélioration du prof
#------------------
from random import randint
n=0
max=3
erreur=[]
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")
        erreur.append(a) #ajoute la valeur de a dans la liste erreur
        erreur.append(b) #fait de meme pour b

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")
print ("Et les tables dans lesquelles vous vous trompez sont: ",erreur)

Le résultat

>>> %Run aaa.py
3 x 6 =?
Votre réponse=?18
Bravo mon ptit pote, t'as 1 point de plus
6 x 9 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
10 x 1 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
----------------------------------------------
Nombre d'essais: 3 et nombre de bonnes réponses: 1
Voici ta note sur 20 coco, 6.666666666666666 /20
Et les tables dans lesquelles vous vous trompez sont:  [6, 9, 10, 1]

Pour comprendre

  • Création d'une liste vide "erreur" au début du script
    L'objectif sera d'ajouter avec la méthode append() les tables pour lesquelles le joueur se trompe.
  • Le joueur se trompe si sa réponse: rep est différente du produit a*b.
    Le traitement de l'erreur est donc sous le else:
  • Il est logique alors d'ajouter dans ce else les 2 lignes avec append()

=> Au final, ma liste erreur contient toutes les valeurs de a et b pour lesquelles le joueur c'est trompé dans la partie.

 

Simulation avec 10 tours

Je ne teste ici que des réponses fausses. J'ai bien 0/20 et il est normal de voir une liste erreur contenant:

  • 20 valeurs
  • certaines valeurs se répètent
Nombre d'essais: 10 et nombre de bonnes réponses: 0
Voici ta note sur 20 coco, 0.0 /20
Et les tables dans lesquelles vous vous trompez sont:  [8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]

Etape 3 - Liste, méthode et calculs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

J'y suis presque. Je vous redonne le lien de la doc pour celles et ceux qui veulent creuser plus loin.

 

Tester le script suivant

Le script

meserreurs=[8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]

print(meserreurs)
print(len(meserreurs))
print(meserreurs[0],meserreurs[4])
print(meserreurs.count(1),meserreurs.count(3),meserreurs.count(10))

print("------------------------------")

n=len(meserreurs)

for i in range(10):
    print(meserreurs.count(i+1))

Le résultat

>>> %Run ttt.py
[8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]
20
8 3
3 1 4
------------------------------
3
2
1
1
2
2
2
1
2
4

Pour comprendre

  • Le premier print m'affiche le contenu de la liste meserreurs
  • Le second m'affiche le nombre de valeur dans la liste avec la fonction len
  • Le troisième m'affiche la première valeur de la liste = meserreurs[0] et la cinquième =  meserreurs[4]
    Vous noterez que les indices d'une liste commence par 0.
    Vous comprendrez que si j'ai 20 valeurs, alors les indices iront de 0 à 19!!!
  • Le quatrième print compte le nombre de fois qu'il y a de 1 dans la liste grâce à la méthode count() =meserreurs.count(1) et j'en ai bien 3!
    Cette ligne compte aussi le nombre de 3 et le nombre de 10.
  • Pour la boucle, l'idée est de compter le nombre de fois qu'il y a des 1, des 2,... et des 10 dans meserreurs.
    Je fais donc une boucle qui tourne 10 fois
    Mais je tiens compte du fait que i commence à 0 ;)

Etape 4 - Calculs des fréquences des erreurs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

 

Tester le script suivant

Le script

#------------------
# proposition initiale faite par Etaine, et amélioration du prof
#------------------
from random import randint
n=0
max=2
erreur=[]
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")
        erreur.append(a) #ajoute la valeur de a dans la liste erreur
        erreur.append(b) #fait de meme pour b

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")
print ("Et les tables dans lesquelles vous vous trompez sont: ",erreur)

# frequence des erreurs
print("----------------------------------------------")
totalerreur=len(erreur)
for i in range(10):
    n=erreur.count(i+1)
    print("Pour la table de ",i+1, "vous avez fait ",n, "erreurs sur un total de ",totalerreur)

Le résultat

>>> %Run aaa.py
6 x 10 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
3 x 10 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
----------------------------------------------
Nombre d'essais: 2 et nombre de bonnes réponses: 0
Voici ta note sur 20 coco, 0.0 /20
Et les tables dans lesquelles vous vous trompez sont:  [6, 10, 3, 10]
----------------------------------------------
Pour la table de  1 vous avez fait  0 erreurs sur un total de  4
Pour la table de  2 vous avez fait  0 erreurs sur un total de  4
Pour la table de  3 vous avez fait  1 erreurs sur un total de  4
Pour la table de  4 vous avez fait  0 erreurs sur un total de  4
Pour la table de  5 vous avez fait  0 erreurs sur un total de  4
Pour la table de  6 vous avez fait  1 erreurs sur un total de  4
Pour la table de  7 vous avez fait  0 erreurs sur un total de  4
Pour la table de  8 vous avez fait  0 erreurs sur un total de  4
Pour la table de  9 vous avez fait  0 erreurs sur un total de  4
Pour la table de  10 vous avez fait  2 erreurs sur un total de  4

Les fréquences

Sachant qu'une fréquence en statistique se définit comme le rapport de la taille d'une classe sur une population: voir ici https://fr.wikipedia.org/

Modifiez le script pour obtenir ce genre d'affichage:

(La question peut faire peur, mais ayez confiance en vous, et croyez en moi, la réponse est simple ;)))