Le principe du jeu est de trouver le nombre de l’ordinateur en un certains nombres de tentatives. Si le joueur ne trouve pas ce nombre en ce certains nombres de tentatives, la partie prend fin mais aussi lorsque le joueur trouve le nombre généré aléatoirement par l’ordinateur.
Sommaire
Introduction
Ce jeu a été réalisé par un élève en première et spécialité NSI.
Jouez au jeu du plus ou moins sur ordinateur ou sur un émulateur qui soit compatible avec le module tkinter !
Dans le cadre de mon projet, le jeu a été codé en python sous 2 formes différentes :
La première qui permet au joueur de jouer directement via la console d’exécution de son application :
La seconde qui permet au joueur de jouer dans un terminal appart soit dans une nouvelle fenêtre :
Évolution
Jeu dans la console d’exécution
- L’importation des modules et variables
Le module randint est un module aléatoire donne accès à diverses fonctions utiles et l’une d’elles est capable de générer des nombres aléatoires. Elle s’écrit de cette façon : randint(start, end)
J’ai crée 5 variables nombres : La 1ère définit notre nombre d’essais maximum, la 2nde notre nombre d’essais au départ, la 3ème le nombre du joueur, la 4ème et la 5ème sont liée car ici nous faisons appel a la variable nombre_max_ordi dans la fonction randit().
from random import randint essais_max= 5 # nombre d'essais maximum essais = 1 # nombre essais nombre_joueur = 0 # nombre du joueur au départ nombre_max_ordi = 25 # nombre maximum généré par l'ordinateur nombre_ordi = randint(1,nombre_max_ordi) # nombre choisi par l'ordinateur
- Affichage
La fonction print permet d’afficher a l’écran du texte.
print("L'ordinateur a choisi un nombre entre 1 et",nombre_max_ordi, ".") print("Vous devez le trouver en moins de 5 tentatives !")
- Boucle while
En anglais » while » signifie « Tant que ». Pour créer une boucle , il faut donc utiliser ce mot clé suivi d’une indication qui dit quand la boucle s’arrête.
Ici notre boucle ne s’arrêtera pas tant que quand le nombre de l’ordinateur ne sera pas égal au nombre du joueur et que son nombre d’essais soit inférieur ou égal au nombre d’essais maximum.
if, elif et else sont des conditions incrémenté dans notre boucle while.
if signifie « si ». Ici, elle marchera si le nombre du joueur est inférieur a celui de l’ordinateur.
elif est contraction de « else » et « if », qu’on pourrait traduire par « sinon ». Ici elle marchera si le nombre du joueur est supérieur a celui de l’ordinateur.
else signifie « autre ». Elle marchera si les conditions if et elif ne sont pas respectés. Entre autre le joueur aura gagné.
while nombre_ordi != nombre_joueur and essais <= essais_max: print("vous êtes au", essais, "essai.") nombre_joueur = int(input("Choisissez un nombre :")) if nombre_joueur < nombre_ordi: print("Le nombre que vous avez choisi est trop petit") elif nombre_joueur > nombre_ordi: print("Le nombre que vous avez choisi est trop grand") else: print("Félicitations ! Vous avez trouvé le nombre de l'ordinateur ","en",essais,"essai(s)") essais += 1
- Condition if
Si le joueur dépasse le nombre d’essais maximum et que si son nombre n’est pas le même que celui de l’ordinateur alors il aura perdu.
if essais>essais_max and nombre_joueur != nombre_ordi : print("Désolé, vous avez utilisé tous vos essais.") print("Vous êtes vraiment nul, réessayer jusqu'a que vous gagnez!") print("L'ordinateur avais choisi le nombre",nombre_ordi,".")
Jeu avec interface graphique
- L’importation des modules et variables
Tkinter (de l’anglais Tool kit interface) est la bibliothèque graphique libre d’origine pour le langage Python, permettant la création d’interfaces graphiques.
Pour créer mon interface graphique, j’ai d’abord créer une fenêtre dont j’ai préciser sa dimension dans laquelle on y retrouva le titre, puis la couleur de fond (qui sera ici du bleu cyan), ainsi que le texte de présentation.
from random import randint from tkinter import * fenetre = Tk()#creation fenetre fenetre.title("Devine le nombre")#titre fenetre.config(bg = "#87AEAB")# couleur de fond fenetre.geometry("1080x720") # dimension texte = Label (fenetre, text = "Bienvenue sur le jeu du + OU -")# texte texte.pack()
Du coté des variables une seule chose a changé : leurs valeurs ( je vous expliquerai pourquoi plus tard).
essais_max= 4 # nombre d'essais maximum essais = 1 # nombre essais nombre_joueur = 0 # nombre proposé par le joueur nombre_max_ordi = 9 # nombre maximum généré par l'ordinateur nombre_ordi = randint(0,nombre_max_ordi) # nombre choisi par l'ordinateur
- Affichage
Le widget Label est un widget Tkinter standard utilisé pour afficher un texte ou une image à l’écran. Ici il va afficher du texte.
La fonction str() convertit les valeurs en forme de chaîne afin qu’elles puissent être combinées avec d’autres chaînes. Elle est utilisé dans mon programme car on ne peut écrire un texte avec des valeurs autres que des lettres alors que ma variable est un chiffre.
La méthode .pack place les widgets les uns en dessous des autres et ajuste la taille de la fenêtre. On verra plus bas que l’on peut passer des arguments à cette méthode pour placer les widgets différemment (en haut, à droite, à gauche).
Pour résumer si la méthode .pack() n’est pas utilisé a chaque fin de variables, celles-ci ne s’afficheront pas lors de l’exécution du programme.
texte2 = Label (fenetre, text = "L'ordinateur a choisi un nombre entre 1 et " +str(nombre_max_ordi)) texte2.pack() Label (fenetre, text = "Tu as 4 essais pour le trouver ").pack() Label (fenetre, text = "A toi de jouer !").pack()
- Le cerveau du programme
La fonction chekInput représente la boucle principale, c’est elle qui contient les conditions de notre programme.
En Python, le mot clé global permet de modifier la variable en dehors de la portée courante. Il est utilisé pour créer une variable globale et apporter des modifications à la variable dans un contexte local ( donc ici dans notre fonction).
Puisque c’est une boucle qui tourne à toutes les actions du joueur, c’est l’endroit idéal pour mettre à jour les infos du joueur, comme le nombre d’essais.
Cette fonction ne change pas vraiment de celle du 1er programme appart le texte.
def checkInput(nombre_joueur): global essais, essais_max, nombre_ordi Label (fenetre, text = "Vous avez choisi " + str(nombre_joueur) + " :").pack() print(essais , essais_max) if nombre_ordi != nombre_joueur and essais <= essais_max: Label (fenetre, text = "vous êtes au " + str(essais) + " essai.").pack() essais += 1 nombre_joueur = int(nombre_joueur) if nombre_joueur < nombre_ordi: Label (fenetre, text = "Le nombre que vous avez choisi est trop petit").pack() elif nombre_joueur > nombre_ordi: Label (fenetre, text = "Le nombre que vous avez choisi est trop grand").pack() elif nombre_ordi == nombre_joueur: Label (fenetre, text = "Bien joué, le chiffre était bien : " + str(nombre_ordi)).pack() elif essais>essais_max and nombre_joueur != nombre_ordi : Label (fenetre, text = "Désolé, vous avez utilisé tous vos essais. Le chiffre était " + str(nombre_ordi)).pack()
- Problème rencontré
Le moment est venu de vous expliquer pourquoi les valeurs de mes variables ont changé.
Tout simplement puisque j’ai crée des boutons de 0 à 9 et je n’avais pas la place d’en mettre plus sinon on aurait pas vu la fin de notre programme.
Voici une photo pour mieux comprendre.
Si il y avait eu plus de bouton le texte qui apparait après chaque clic sur un bouton aurait dépassé de ma fenêtre.
- Interaction homme/machine
Voici les 10 boutons allant de 0 a 9.
Pour lier un événement à un widget, on utilise la méthode bind() sur ce widget.
Le premier argument, ‘<Button-1>’, est un «descripteur de séquence» qui indique à tkinter que lorsque le bouton gauche de la souris est pressé, il faut qu’il appelle la fonction chekInput fourni comme deuxième argument.
Une fonction lambda est une petite fonction anonyme qui peut prendre n’importe quel nombre d’arguments, mais ne peut avoir qu’une seule expression.
Ici elle va prendre le chiffre qui lui est associé et le joué dans la fonction chekInput.
btn0 = Label (fenetre, text = str(0)) btn0.bind("<Button-1>", lambda e: checkInput(0)) btn0.pack() btn1 = Label (fenetre, text = str(1)) btn1.bind("<Button-1>", lambda e: checkInput(1)) btn1.pack() btn2 = Label (fenetre, text = str(2)) btn2.bind("<Button-1>", lambda e: checkInput(2)) btn2.pack() btn3 = Label (fenetre, text = str(3)) btn3.bind("<Button-1>", lambda e: checkInput(3)) btn3.pack() btn4 = Label (fenetre, text = str(4)) btn4.bind("<Button-1>", lambda e: checkInput(4)) btn4.pack() btn5 = Label (fenetre, text = str(5)) btn5.bind("<Button-1>", lambda e: checkInput(5)) btn5.pack() btn6 = Label (fenetre, text = str(6)) btn6.bind("<Button-1>", lambda e: checkInput(6)) btn6.pack() btn7 = Label (fenetre, text = str(7)) btn7.bind("<Button-1>", lambda e: checkInput(7)) btn7.pack() btn8 = Label (fenetre, text = str(8)) btn8.bind("<Button-1>", lambda e: checkInput(8)) btn8.pack() btn9 = Label (fenetre, text = str(9)) btn9.bind("<Button-1>", lambda e: checkInput(9)) btn9.pack()
- Fin de la fenêtre
La méthode mainloop() permet d’afficher la fenêtre qui vient d’être créée. Pour ceux qui ne l’avais pas deviné, elle marque la fin de notre programme.
fenetre.mainloop()
Anecdote
A la base j’étais dans un groupe de 3 personnes et ont voulais créer un space invaders mais ont s’est vite rendu compte de la difficulté alors ont s’est orienté sur le jeu du morpion. Puis je décida de quitter le groupe et de me mettre en solo car ils ne travaillait pas et c’est ainsi que j’ai codé le jeu du plus ou moins.
Conclusion
Pour pouvoir jouer à mes des versions du jeu, téléchargez le code par l’intermédiaire du lien ci-dessous. Pour la 1ère version il vous faut écrire le nombre dans la console d’exécution et pour la 2nde il vous suffit juste de cliquer sur les boutons.
Amusez-vous bien !
Téléchargement
Cet article a été écrit par des élèves du lycée Louis Pasteur.
Ils étudiaient alors la spécialité NSI, en classe de 1ère.
Promotion 2021 – 2021