Êtes-vous bon en calcul mental ? Ce script en python vous propose de tester vos capacités à travers différents niveaux de difficulté, et tout cela chronométré !
Objectif
L’objectif de ce projet est de tester mes capacités en python et de mobiliser les notions vues en python en spécialité NSI (and, or, not, …etc). De plus, cela à pour but de proposer un outil pour s’entraîner au calcul mental. Je pense aussi l’adapter plus tard pour la calculatrice Numworks, ce qui donnera la possibilité d’y jouer dessus.
Projet
Le choix du langage pour ce projet est assez simple : python. C’est un langage assez simple à maitriser et adapté pour l’idée de mon jeux. Il propose aussi des bibliothèques assez intéressantes pour sa réalisation notamment time et random.
Analyse du code
Analysons le code.
Dans un premier temps on importe différentes bibliothèques qui vont nous être utilise. Nous utilisons la bibliothèque random pour générer des valeurs aléatoires pour diversifier les calculs ainsi que le module time.
import math from random import * from time import time from art import text2art operateurs1 = ["+","-"] operateurs2 = ["+","-","x"]])
Subséquemment, vous pouvez aussi voir une bibliothèque art avec le module text2art qui nous sert à convertir du texte en ascii art et donc à sublimer par exemple le menu.
La première liste sert uniquement au niveau 1 qui est censé être le plus simple, on se limite donc à des additions/soustractions tandis que la deuxième liste est destinée au niveaux 2 et 3.
Passons maintenant au menu.
def menu(): # Interface du début titre1 = text2art("NSI : Calcul \t mental") # Titre en ascii art print(titre1) print("Il y a 3 niveaux:") # Présente les différents niveaux print("1-Niveau facile") print("2-Niveau intermédiaire") print("3-Niveau difficile") choix = int(input("\nAlors, qu'allez vous choisir :\n")) while choix not in [1, 2, 3]: # Empêche toutes valeurs autre que 1, 2 ou 3 input("Veuillez choisir un chiffre :\n") if choix == 1: # Renvoie au niveau choisie niveau1() if choix == 2: niveau2() if choix == 3: niveau3() menu()
On commence par présenter les différents niveaux avec des print() et aussi un titre en ascii art grâce au module text2art(). Vous allez voir que tout au long du code que nous allons utiliser des input() qui permettent à l’utilisateur de rentrer des valeurs ou une chaîne de caractère.
Ici, la boucle à la ligne 12 est nécessaire pour que l’utilisateur entre quelque chose de valable, la logique est simple : tant que qu’il n’a pas rentrer une valeur valable on réitère la question et dès lors qu’il tapera 1,2 ou 3 le script pourra continuer.
Enfin, on ajoute des conditions avec if pour le rediriger le joueur sur le niveau choisi. Passons maintenant à la structure d’un niveau.
def niveau2(): # Deuxième niveau score = 0 compteur = 0 while compteur < 10: indice_aleatoire = randint(0,len(operateurs1)-1) generation1 = randint(2,4) generation2 = randint(11,42) generation3 = randint(300,600) generation4 = randint(384,666) # Plus de génération car on ajoute des multiplications if indice_aleatoire == 2: print("\nPeux tu calculer", str(generation1), operateurs1[indice_aleatoire], str(generation2), "? Tu as 7 secondes.") else: print("\nPeux tu calculer", str(generation4), operateurs1[indice_aleatoire], str(generation3), "? Tu as 7 secondes.") depart_temps = time() # Calcule le temps rep = int(input("\nMa réponse : ")) fin_temps = time()-depart_temps
Nous allons ici prendre pour exemple le niveau 2 (intermédiaire), mais les autres niveaux ne sont pas si différents que ça. On va diviser le niveau en 3 parties :
- La génération du calcul et la réponse de l’utilisateur
- La correction de la réponse
- Félicite le joueur en fonction de son score
Dans un premier temps, on commence par initialiser le score et le compteur qui correspond au nombre de question, donc ici 12 questions. Le compteur s’incrémente à chaque fin de question d’où l’utilisation de while.
On génère ensuite un indice aléatoire pour choisir entre tous les opérateurs et des nombres pour les calculs. Si cela tombe sur une multiplication on va multiplier des nombres par des petites valeurs (entre 2 et 4), sinon on fait l’addition ou soustraction de deux nombres entre environ 300 à 600.
Enfin, on lance le chrono avec le module time(), on demande alors la réponse et on arrête le chrono pour savoir le temps passé.
if operateurs2[indice_aleatoire] == "+": # Détermine l'opérateur pour la correction resultat = generation4 + generation3 elif operateurs2[indice_aleatoire] == "-": resultat = generation4 - generation3 elif operateurs2[indice_aleatoire] == "x": resultat = generation1 * generation2 else: resultat = None if resultat is not None and resultat == rep and fin_temps <=7: # Correction en fonction du résultat et du temps mis print("Bravo, tu as donné la bonne réponse dans le temps imparti. Ton temps:", fin_temps) score += 1 elif resultat is not None and resultat == rep and fin_temps > 7: print("Tu as donné la bonne réponse mais pas dans le temps imparti. Ton temps:", fin_temps) else: print("\nAh...apparemment tu t'es trompé, réessaye !") suite = input("\nPrêt pout ma suite ? o/n\n") # Demande si l'utilisateur est prêt if suite.lower() != "o": break compteur += 1
Dans un deuxième temps, on détermine l’opérateur pour effectuer la correction avec la réponse de l’utilisateur. Il y a 3 cas possibles :
- La réponse est correcte et a été donnée dans le temps imparti (dans ce cas la le score s’incrémente)
- La réponse est correcte mais n’a pas été donnée dans le temps imparti
- La réponse est incorrecte et n’a pas été donnée dans le temps imparti
Ensuite, on demande si l’utilisateur est prêt pour passer à la suite. Ici, on utilise la méthode .lower() qui permet d’éviter que le script plante si l’utilisateur a mis un « o » ou un « n » en majuscule.
Puis on incrémente le compteur comme nous l’avons expliqué précédemment.
if score > 4: print("\nBravo tu as répondu à tous les calculs et tu a au moins la moyenne, ton score est de", score) # Donne le score et félicite le joueur gg = text2art("gg") print(gg) else: print("\nTon score est de", score,", ce n'est pas fameux ! Je te conseille d'acheter ma formation pour seulemment 773€/mois") # Peut être que je vais la prendre cette formation finalement
Dans un troisième temps, à la fin de toutes les questions, on obtient plusieurs grades de félicitation en fonction du score du joueur.
On retrouve aussi l’utilisation tu module text2art() qui permet de dire bien joué.
Conclusion
Le projet était assez plaisant à faire et il a permis de tester mes capacités en python tout en mobilisant des notions vues en spé NSI notamment not, and, or, les boucles, …etc. Ce script peut aussi être adapté sur la numworks dans l’avenir, ce qui peut être sympa.
Télécharger le script
Etudiant du lycée Lycée Louis Pasteur.
« Un pigeon, c’est plus con qu’un dauphin, d’accord… mais ça vole. »