Python, réalisation d’un jeu de Morpion avec Tkinter

Dans un cadre purement pédagogique, il est parfois compliqué de trouver des projets pour essayer d’apprendre sans que ce soit trop compliqué. Pour ma part, j’ai choisi de réaliser un petit jeu de morpions en python en utilisant Tkinter.Après avoir vu dans un précédent article (créer une interface en python avec tkinter), je me suis dit qu’il fallait que j’aille un tout petit peu plus loin. En regardant sur le net, j’ai vu que beaucoup de tuto proposés une suite de ligne pour montrer les possibilités du langage Python et de la librairie Tkinter. J’ai donc décidé de développer mon propre jeu, j’ai choisi le morpion :

  • parce que j’aime bien y jouer
  • parce que les règles sont simples
  • parce que j’aime bien ce nom

Cahier des charges

Bon sans être trop technique (car je ne sais pas réellement faire un CCTP), je voudrais simplement :

  • jouer avec un ami, un copain, une connaissance, n’importe qui qui accepte (je veux des relations humaines)
  • sur le même poste (malheureusement, pas de réseau pour le moment)
  • respecter les règles, à qui de  jouer, qui a gagné
  • pouvoir recommencer une partie

Techniquement, un morpion en python et tkinter

Nous allons utiliser d’autres widgets que dans l’article créer une interface en python avec tkinter, nous utiliserons, des boutons, des labels, de nouvelles fenêtre, un menu, la détection du clic de la souris (ainsi que son emplacement).

Bon je vous rassure, je ne détaillerai pas tout le script, dans un premier temps, je vous le passe et ensuite, je mettrai des détails dans les commentaires, si vous en avez besoin d’avantage.

Le script du jeu

Donc voici la bête, bien entendu, il y a certainement des modifications à faire, des bonnes pratiques à acquérir (n’hésitez pas à le dire en commentaire), vous pouvez le télécharger ici. Je tiens à préciser que je me suis forcé à tout réaliser moi-même pour bien comprendre les choses.

Pour des raisons de sécurité, j’ai du modifier le nom du fichier, vous devez renommer le fichier en morpion.py

Explication du script

Détermination du joueur

A plusieurs reprises, vous verrez la mêle structure conditionnelle :

if tour % 2 == 0:
  joueur = 1
else :
  joueur = 0

Nous allons utiliser le modulo, le modulo permet de récupérer le reste d’une division un modulo de 2 ne peut avoir que deux réponses : 0 ou 1.

Dans notre cas, on incrémente à chaque tour la variable tour, le modulo passe de 0 et 1.

Fonction pointeur

La fonction pointeur est appelée lorsqu’un clic est détecté, on a donc une variable en entrée event qui correspond aux informations du clic.

if event.x >= 5 and event.x <=130 and event.y >= 5 and event.y <=130 :
  zone = 'A1'
  if zone in coup :
    erreur(1, tour)
  else:
    dessin(0,0,135,135,tour)
    coup.append(zone)
    phase[joueur].append(zone)
    gestion_gagnant(zone,joueur)

La condition du premier if permet de déterminer quelle case a été sélectionnée. Une fois qu’on a satisfait à la condition, on enregistre dans la variable zone le nom de la case (une lettre pour la ligne et un chiffre pour la colonne).

La seconde condition if permet de vérifier que le coup n’a pas déjà été joué, la variable coup est une liste qui contient tous les coups déjà joués.

Si le coup n’a pas été joué, on appelle la fonction dessin en donnant les coordonnées de la case ainsi que le tour en cours.

On ajoute la zone à la variable coup.

On ajoute ensuite la zone dans une liste phase[joueur] qui enregistre ce que chaque joueur à jouer.

On appelle ensuite la fonction gestion_gagnant en donnant la zone et le joueur pour voir si le jeu est fini ou pas.

On reproduit la même chose 8 fois, une fois pour chaque zone supplémentaire.

Fonction dessin

def dessin(x0,y0,x1,y1,forme):
  global tour
  if forme % 2 == 0:
    principal.create_oval(x0+20,y0+20,x1-20,y1-20,width=10)
  else:
    principal.create_line(x0+20,y0+20,x1-20,y1-20,width=10)
    principal.create_line(x1-20,y0+20,x0+20,y1-20,width=10)
  tour = tour + 1
  if tour % 2 == 0:
    label_information.configure(text="A votre tour Joueur 2")
  else :
    label_information.configure(text="A votre tour Joueur 1")

Cette fonction permet simplement de dessiner le rond ou la croix en fonction du joueur.

On indique ensuite quel joueur doit jouer.

Fonction gestion_gagnant

def gestion_gagnant(case,joueur):
  global fin_partie
  nb_serie = 0
  jeu_joueur = gagnant[joueur]
  for serie in liste_gagnant :
    try:
      rang = serie.index(case)
      ligne_gagnant = jeu_joueur[nb_serie]
      ligne_gagnant[rang] = True
      jeu_joueur[nb_serie] = ligne_gagnant
      gagnant[joueur] = jeu_joueur
    except ValueError :
      pass
    nb_serie = nb_serie + 1
  for serie in gagnant[joueur] :
    if serie.count(True) == 3 :
      label_information.configure(text="Le joueur "+str(joueur+1)+" a gagné")
      fin_partie = Tk.Toplevel()
      cadre_fin = Tk.Canvas(fin_partie,height=200,width=200,bg="green")
      label_gagnant = Tk.Label(cadre_fin,text="Le joueur "+str(joueur+1)+", faites un choix pour la suite")
      label_gagnant.pack()
      fin_quitter = Tk.Button(cadre_fin,text="Quitter",command=fenetre.quit)
      fin_nouveau = Tk.Button(cadre_fin,text="Rejouer",command=rejouer)
      fin_nouveau.pack(side="left")
      fin_quitter.pack(side="right")
      cadre_fin.pack()

Cette fonction a pour but de vérifier si après chaque tour, nous avons un gagnant. Dans le cas d’un gagnant, nous venons ouvrir une nouvelle fenêtre qui annonce le vainqueur et propose de sortir ou de rejouer.

Fonction Init

La fonction init permet d’initialiser la fenêtre de jeu, le point intéressant pour nous est la surveillance du clic avec principal.bind("<Button-1>", pointeur), en cas de clic on appelle la fonction pointeur.

Ensuite pour tout ce qui suit, il ne s’agit simplement de la remise à zéro des variables, la création des fenêtres, la boucle et l’initialisation.

Voilà, rien de plus compliqué que cela.

Voilà ce que cela donne :

Conclusion

Voilà qui n’est pas exceptionnel mais j’espère que vous pouvez voir plein de chose qui vous seront utiles, n’hésitez pas à poser des questions dans les commentaires et à partager si vous avez aimé.

Laisser un commentaire