{"id":6454,"date":"2021-09-13T16:48:15","date_gmt":"2021-09-13T14:48:15","guid":{"rendered":"https:\/\/www.mathweb.fr\/euclide\/?p=6454"},"modified":"2021-10-26T16:00:50","modified_gmt":"2021-10-26T14:00:50","slug":"creer-le-jeu-du-morpion-en-python","status":"publish","type":"post","link":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/","title":{"rendered":"Cr\u00e9er le jeu du Morpion en Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m&rsquo;y suis coll\u00e9&#8230; et ce ne fut pas de tout repos!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais comme je suis tr\u00e8s gentil, je vous explique tout !<\/p>\n\n\n\n<!--more-->\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Au menu sur cette page...<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#Le_jeu_du_Morpion_en_Python_reflexions_preliminaires\" >Le jeu du Morpion en Python: r\u00e9flexions pr\u00e9liminaires<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#Le_jeu_du_Morpion_la_base\" >Le jeu du Morpion: la base<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#Le_jeu_du_Morpion_en_Python_initialisation\" >Le jeu du Morpion en Python: initialisation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#Le_jeu_du_Morpion_le_pointeur_de_la_souris\" >Le jeu du Morpion: le pointeur de la souris<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#Pour_le_reste%E2%80%A6\" >Pour le reste&#8230;<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Le_jeu_du_Morpion_en_Python_reflexions_preliminaires\"><\/span>Le jeu du Morpion en Python: r\u00e9flexions pr\u00e9liminaires<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je ne veux absolument pas un jeu tout pourri en mode console&#8230; Seul le mode graphique sera accept\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il faudrait aussi deux niveaux : \u00ab\u00a0Facile\u00a0\u00bb et \u00ab\u00a0Difficile\u00a0\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut aussi que le joueur ait la possibilit\u00e9 de commencer le jeu ou de laisser la main \u00e0 l&rsquo;ordinateur selon ses envies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je veux tenir des statistiques sur les parties (gagn\u00e9es, perdues et les matchs nuls).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voil\u00e0. Avec \u00e7a, j&rsquo;ai mati\u00e8re \u00e0 faire&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant, quel paradigme de programmation vais-je utiliser ? Bon, je vais m&rsquo;en tenir \u00e0 la <a href=\"https:\/\/www.mathweb.fr\/euclide\/tag\/poo\/\" target=\"_blank\" rel=\"noreferrer noopener\">POO<\/a> parce que j&rsquo;ai plus l&rsquo;habitude. Quant \u00e0 la solution graphique, je vais utiliser <a href=\"https:\/\/docs.python.org\/fr\/3\/library\/tkinter.html\" target=\"_blank\" rel=\"noreferrer noopener\">Tkinter<\/a> pare que QT&#8230; je ne suis pas assez dou\u00e9 ! \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Le_jeu_du_Morpion_la_base\"><\/span>Le jeu du Morpion: la base<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je vais cr\u00e9er une classe <em>Morpion<\/em> qui repr\u00e9sentera mon jeu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Qui dit <em>classe<\/em> dit <em>constructeur<\/em>. Je vais y aller doucement en d\u00e9finissant d&rsquo;abord la fen\u00eatre:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from tkinter import Tk, Canvas\n\nclass Morpion:\n    def __init__(self, window):\n        window.geometry(\"750x505\")\n        window.title(\"Le jeu du Morpion - St\u00e9phane Pasquet (mathweb.fr)\")\n        Label(window, text=\"Le jeu du Morpion (OXO)\", font=(\"Helvetica\", 20)).place(x=190,y=1)\n        \n        self.game = Canvas(window, width = 405, height = 405, bg = \"white\")        \n\nif __name__ == '__main__':    \n    root = Tk()\n    Morpion(root)  <\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"537\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image.png\" alt=\"\" class=\"wp-image-6455\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image.png 752w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-300x214.png 300w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-600x428.png 600w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut maintenant que je place une grille&#8230; je vais d\u00e9finir une m\u00e9thode pour cela :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def draw_grid(self):\n        self.game.create_rectangle(0,0,405,405,fill='white')\n        for x in [ 4 , 135 , 270 , 405 ]:\n            self.game.create_line(0 , x , 405 , x , fill = 'black' , width = 4)\n            self.game.create_line(x , 0 , x , 405 , fill = 'black' , width = 4)\n        \n        self.game.place(x = 0 , y = 50)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bien entendu, il faut que j&rsquo;ajoute la ligne suivante dans le constructeur :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">self.draw_grid()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"537\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-1.png\" alt=\"\" class=\"wp-image-6456\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-1.png 752w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-1-300x214.png 300w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-1-600x428.png 600w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant, je dois ajouter les menus; je vais donc ajouter \u00e0 mon appel \u00e0 tk quelques commandes :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from tkinter import Tk, Canvas, Label, StringVar, Button, OptionMenu, DISABLED, NORMAL<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">et \u00e0 mon constructeur les lignes suivantes :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        # Menu de droite\n        \n        Label(text=\"Quel niveau ?\", font=('Helvetica', 12), fg='red').place(x = 420, y = 50)\n        self.LevelList = [ \"?????\" , \"Facile\", \"Difficile\" ]\n        self.LevelVar = StringVar(window)\n        self.LevelVar.set(self.LevelList[0])\n        self.LevelOptions = OptionMenu(window, self.LevelVar, *self.LevelList)\n        self.LevelOptions.config(width = 10, font=('Helvetica', 12))\n        self.LevelOptions.place(x = 600 , y = 44)\n        self.niveau = self.LevelVar.trace(\"w\", self.jeu)\n    \n        Label(text=\"Qui commence \u00e0 jouer ?\", font=('Helvetica', 12), fg='red').place(x = 420, y = 100)\n        self.FirstPlayerList = [ \"?????\" , \"Joueur\", \"Ordinateur\" ]\n        self.FirstPlayerVar = StringVar(window)\n        self.FirstPlayerVar.set(self.FirstPlayerList[0])\n        self.FirstPlayerOptions = OptionMenu(window, self.FirstPlayerVar, *self.FirstPlayerList)\n        self.FirstPlayerOptions.config(width = 10, font=('Helvetica', 12))\n        self.FirstPlayerOptions.place(x = 600 , y = 94)\n        self.player_one = self.FirstPlayerVar.trace(\"w\", self.jeu)\n        \n        # bouton \"rejouer\"\n        \n        self.rejouer = Button(window , text = 'Rejouer' , state=DISABLED , command=self.restart)\n        self.rejouer.place(x = 560 , y = 400)\n        \n        # bouton \"voir les stats\"\n        \n        self.stats = Button(window , text = 'Voir les statistiques'  , command=self.visu_stats)\n        self.stats.place(x = 530 , y = 450)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bien entendu, les m\u00e9thodes appel\u00e9es par les boutons ne sont pas encore \u00e9crites et tel quel, le programme ne tourne pas encore&#8230; Je vais donc ajouter les m\u00e9thodes vides <em>jeu<\/em>, <em>restart<\/em> et <em>visu_stats<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def jeu(self):\n        return None\n    \n    def restart(self):\n        return None\n    \n    def visu_stats(self):\n        return None<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e0, on peut lancer le programme:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"537\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-2.png\" alt=\"\" class=\"wp-image-6457\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-2.png 752w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-2-300x214.png 300w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/image-2-600x428.png 600w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">N&rsquo;essayez pas encore de choisir le niveau du jeu, car cela ne fonctionne pas encore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de d\u00e9finir les m\u00e9thodes vides, j&rsquo;aimerais d\u00e9finir les symboles (croix et cercles). Cela se fait toujours dans le constructeur:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        self.image_croix = Image.open(\"croix.png\")\n        self.croix = ImageTk.PhotoImage(self.image_croix)\n        \n        self.image_cercle= Image.open(\"cercle.png\")\n        self.cercle = ImageTk.PhotoImage(self.image_cercle)\n        \n        self.text_gamer = StringVar()\n        self.texte_joueur = Label(root , textvariable=self.text_gamer , font=('Helvetica', 12), fg='blue').place(x = 420, y = 150)\n        \n        self.text_result = StringVar()\n        self.texte_result = Label(root , textvariable=self.text_result , font=('Helvetica', 12), fg='purple').place(x = 420, y = 200)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bien entendu, les images \u00ab\u00a0croix.png\u00a0\u00bb et \u00ab\u00a0cercle.png\u00a0\u00bb seront \u00e0 placer dans le r\u00e9pertoire courant.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais n&rsquo;oublions pas d&rsquo;appeler le module PIL :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from PIL import Image, ImageTk<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il ne reste plus qu&rsquo;\u00e0 conclure ce constructeur en appelant la m\u00e9thode <em>restart<\/em>, qui initialise (ou r\u00e9initialise selon les cas) la grille.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"droide\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">self.restart() # initialisation<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Le_jeu_du_Morpion_en_Python_initialisation\"><\/span>Le jeu du Morpion en Python: initialisation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut avant tout penser \u00e0 la repr\u00e9sentation de la grille: comme souvent, cette derni\u00e8re pourra \u00eatre repr\u00e9sent\u00e9e par une matrice 3\u00d73, ou si vous le souhaitez un <em>array<\/em> (tableau) \u00e0 deux dimensions.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def restart(self):\n        self.G = [ [0,0,0] , [0,0,0] , [0,0,0] ]\n        self.nb_cercles = 0\n        self.nb_croix = 0\n        self.text_gamer.set(' '*100)\n        self.text_result.set(' '*100)\n        self.draw_grid()\n        self.FirstPlayerVar.set(self.FirstPlayerList[0])\n        self.LevelVar.set(self.LevelList[0])\n        self.rejouer.config(state=DISABLED , bg = 'gray')<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La grille est donc ici repr\u00e9sent\u00e9e par le tableau <em>self.G<\/em>, initialement rempli de 0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On d\u00e9finit par l\u00e0 m\u00eame le nombre de cercles et de croix (0 pour commencer) car cela va nous \u00eatre utile par la suite pour contr\u00f4ler si le jeu est fini ou non.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai aussi choisi de mettre un appel \u00e0 la m\u00e9thode <em>draw_grid<\/em> car c&rsquo;est plus simple (pour rejouer une autre partie, il faudra vider la grille ou plus simplement la redessiner vierge). Il faudra donc supprimer cet appel qui apparaissait dans le constructeur (inutile de faire appel \u00e0 la m\u00eame fonction deux fois de suite).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les autres lignes initialisent les variables <em>self.FirstPlayerVar<\/em> et <em>self.LevelVar<\/em> (le premier joueur et la niveau) \u00e0 \u00ab\u00a0rien\u00a0\u00bb.<br>les variables <em>self.text_gamer<\/em> et <em>self.text_result<\/em> ne servent qu&rsquo;\u00e0 afficher du texte (qui va gagner et s&rsquo;il y a match nul).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Le_jeu_du_Morpion_le_pointeur_de_la_souris\"><\/span>Le jeu du Morpion: le pointeur de la souris<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut bien entendu que le clic du bouton gauche de la souris soit d\u00e9tect\u00e9 et affiche le symbole du cercle (celui du joueur). On \u00e9crit alors une m\u00e9thode pour cela:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def valid_pointeur(self,event):\n        if self.gameOn == True:\n            x , y = event.x\/\/135, event.y\/\/135\n            self.G[y][x] = 'O'\n            self.nb_cercles += 1\n            \n            self.game.create_image(68 + x * 135 , 68 + y * 135, anchor = 'center', image = self.cercle)\n            \n            if self.fin_partie()[0] == True:       \n                self.final(self.fin_partie()[1])\n            else:\n                self.play(1 , self.LevelVar.get() )<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai ajout\u00e9 une petite variable bool\u00e9enne <em>self.gameOn<\/em> histoire de le pas pouvoir ajouter de cercle apr\u00e8s que le jeu soit fini&#8230; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 chaque clic, on doit contr\u00f4ler si le jeu est fini ou pas; c&rsquo;est la mission de la m\u00e9thode <em>fin_partie<\/em> qui renvoie un couple (bool , who): le premier nombre dit si la partie est finie (True) ou pas (False) et le second, qui a gagn\u00e9 (ordinateur ou joueur).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def fin_partie(self):\n        # on teste s'il y a alignement\n        if ( self.G[0][0] == self.G[1][0] and self.G[1][0] == self.G[2][0] and self.G[0][0] != 0) \\\n                   or ( self.G[0][1] == self.G[1][1] and self.G[1][1] == self.G[2][1] and self.G[0][1] != 0) \\\n                   or ( self.G[0][2] == self.G[1][2] and self.G[1][2] == self.G[2][2] and self.G[0][2] != 0) \\\n                   or ( self.G[0][0] == self.G[0][1] and self.G[0][1] == self.G[0][2] and self.G[0][0] != 0) \\\n                   or ( self.G[1][0] == self.G[1][1] and self.G[1][1] == self.G[1][2] and self.G[1][0] != 0) \\\n                   or ( self.G[2][0] == self.G[2][1] and self.G[2][1] == self.G[2][2] and self.G[2][0] != 0) \\\n                   or ( self.G[0][0] == self.G[1][1] and self.G[1][1] == self.G[2][2] and self.G[0][0] != 0) \\\n                   or ( self.G[0][2] == self.G[1][1] and self.G[1][1] == self.G[2][0] and self.G[0][2] != 0):\n            if self.FirstPlayerVar.get() == 'Ordinateur' and self.nb_croix > self.nb_cercles:\n                return ( True , \"Ordinateur\" )\n            elif self.FirstPlayerVar.get() == 'Ordinateur' and self.nb_croix &lt; self.nb_cercles:\n                return ( True , \"Joueur\" )\n            elif self.FirstPlayerVar.get() == 'Joueur' and self.nb_croix &lt; self.nb_cercles:\n                return ( True , \"Joueur\" )\n            else:\n                return (True , \"Ordinateur\")\n        # sinon on teste si la grille est pleine\n        elif self.nb_croix + self.nb_cercles == 9:\n            return (True , None)\n        else:\n            return ( False , None )<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Pour_le_reste%E2%80%A6\"><\/span>Pour le reste&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La m\u00e9thode du jeu \u00e0 proprement parl\u00e9 est propre \u00e0 chaque programmeur. Il y a quelque part de l&rsquo;IA derri\u00e8re le mode \u00ab\u00a0difficile\u00a0\u00bb. Je ne suis pas un expert en IA et ma fa\u00e7on de programmer cette partie est propre \u00e0 ma fa\u00e7on de penser. Elle n&rsquo;est pas optimale&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les abonn\u00e9\u00b7e\u00b7s de ce site trouveront les images et le code source Python du programme complet ci-dessous:<\/p>\n\n\n\n<div class=\"wp-block-file aligncenter um_article\"><a href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/Morpion.zip\">Morpion<\/a><a href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/Morpion.zip\" class=\"wp-block-file__button\" download>T\u00e9l\u00e9charger<\/a><\/div>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"536\" style=\"aspect-ratio: 752 \/ 536;\" width=\"752\" autoplay controls loop src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/Morpion.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m&rsquo;y suis coll\u00e9&#8230; et ce ne fut pas de tout repos! Mais comme je suis tr\u00e8s gentil, je vous explique tout !<\/p>\n","protected":false},"author":1,"featured_media":6492,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-6454","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr<\/title>\n<meta name=\"description\" content=\"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m&#039;y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr\" \/>\n<meta property=\"og:description\" content=\"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m&#039;y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Mathweb.fr\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-13T14:48:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-26T14:00:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"740\" \/>\n\t<meta property=\"og:image:height\" content=\"198\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"St\u00e9phane Pasquet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"St\u00e9phane Pasquet\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/\"},\"author\":{\"name\":\"St\u00e9phane Pasquet\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"headline\":\"Cr\u00e9er le jeu du Morpion en Python\",\"datePublished\":\"2021-09-13T14:48:15+00:00\",\"dateModified\":\"2021-10-26T14:00:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/\"},\"wordCount\":771,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/head-articles-python-morpion.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/\",\"name\":\"Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/head-articles-python-morpion.jpg\",\"datePublished\":\"2021-09-13T14:48:15+00:00\",\"dateModified\":\"2021-10-26T14:00:50+00:00\",\"description\":\"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m'y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/head-articles-python-morpion.jpg\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/head-articles-python-morpion.jpg\",\"width\":740,\"height\":198,\"caption\":\"python jeu morpion\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2021\\\/09\\\/13\\\/creer-le-jeu-du-morpion-en-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cr\u00e9er le jeu du Morpion en Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\",\"name\":\"Mathweb.fr\",\"description\":\"Math\u00e9matiques, LaTeX et Python\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\",\"name\":\"St\u00e9phane Pasquet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"width\":74,\"height\":77,\"caption\":\"St\u00e9phane Pasquet\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr","description":"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m'y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/","og_locale":"fr_FR","og_type":"article","og_title":"Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr","og_description":"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m'y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...","og_url":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/","og_site_name":"Mathweb.fr","article_published_time":"2021-09-13T14:48:15+00:00","article_modified_time":"2021-10-26T14:00:50+00:00","og_image":[{"width":740,"height":198,"url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg","type":"image\/jpeg"}],"author":"St\u00e9phane Pasquet","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"St\u00e9phane Pasquet","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#article","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/"},"author":{"name":"St\u00e9phane Pasquet","@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"headline":"Cr\u00e9er le jeu du Morpion en Python","datePublished":"2021-09-13T14:48:15+00:00","dateModified":"2021-10-26T14:00:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/"},"wordCount":771,"commentCount":4,"publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg","articleSection":["Python"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/","url":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/","name":"Cr\u00e9er le jeu du Morpion en Python - Mathweb.fr","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#primaryimage"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg","datePublished":"2021-09-13T14:48:15+00:00","dateModified":"2021-10-26T14:00:50+00:00","description":"Vous souhaitez cr\u00e9er le jeu du Morpion en Python ? Je m'y suis coll\u00e9... et ce ne fut pas de tout repos! Allez ! Regardons cela ensemble...","breadcrumb":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#primaryimage","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2021\/09\/head-articles-python-morpion.jpg","width":740,"height":198,"caption":"python jeu morpion"},{"@type":"BreadcrumbList","@id":"https:\/\/www.mathweb.fr\/euclide\/2021\/09\/13\/creer-le-jeu-du-morpion-en-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mathweb.fr\/euclide\/"},{"@type":"ListItem","position":2,"name":"Cr\u00e9er le jeu du Morpion en Python"}]},{"@type":"WebSite","@id":"https:\/\/www.mathweb.fr\/euclide\/#website","url":"https:\/\/www.mathweb.fr\/euclide\/","name":"Mathweb.fr","description":"Math\u00e9matiques, LaTeX et Python","publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mathweb.fr\/euclide\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69","name":"St\u00e9phane Pasquet","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","width":74,"height":77,"caption":"St\u00e9phane Pasquet"},"logo":{"@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp"}}]}},"_links":{"self":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/6454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/comments?post=6454"}],"version-history":[{"count":0,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/6454\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media\/6492"}],"wp:attachment":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media?parent=6454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/categories?post=6454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/tags?post=6454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}