Code Vonc

Morpion

v 1.0

TéléchargerDownload
Faire un donMake a donation
CommentairesComments

Jeu du Morpion réalisé en Python avec la bibliothèque PyGTK, jouable contre l'ordinateur.




Codes sourcesSources code

Morpion.py

#! /usr/bin/python
# coding: utf-8
# GPLv3
# César Guillotel

import random
import gtk

class Morpion() :
    
    dicoCotes = {
        'A' : ['B', 'D', 'E'],
        'B' : ['A', 'C', 'E'],
        'C' : ['B', 'E', 'F'],
        'D' : ['A', 'E', 'G'],
        'E' : ['A', 'B', 'C', 'D', 'F', 'G', 'H', 'I'],
        'F' : ['C', 'E', 'I'],
        'G' : ['D', 'E', 'H'],
        'H' : ['E', 'G', 'I'],
        'I' : ['E', 'F', 'H']
    }
    
    dicoSolutions = [
        'ABC',
        'AEI',
        'ADG',
        'BEH',
        'CEG',
        'CFI',
        'DEF',
        'GHI'
    ]
    
    dicoSolutionsSens = [
        'h',
        'dg',
        'v',
        'v',
        'dd',
        'v',
        'h',
        'h'
    ]
    
    dico = {
        "AB" : "C",
        "AC" : "B",
        "AD" : "G",
        "AE" : "I",
        "AG" : "D",
        "AI" : "E",
        "BC" : "A",
        "BE" : "H",
        "BH" : "E",
        "CE" : "G",
        "CF" : "I",
        "CG" : "E",
        "CI" : "F",
        "DE" : "F",
        "DF" : "E",
        "DG" : "A",
        "EF" : "D",
        "EG" : "C",
        "EH" : "B",
        "EI" : "A",
        "FI" : "C",
        "GH" : "I",
        "GI" : "H",
        "HI" : "G"
    }
    
    dicoJoue = {
        'A' : None,
        'B' : None,
        'C' : None,
        'D' : None,
        'E' : None,
        'F' : None,
        'G' : None,
        'H' : None,
        'I' : None,
    }
    
    tabCases = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
    
    def __init__(soi) :
        soi.joueurActif = 1
        soi.derniereCase = None
        soi.avantDerniereCase = None
       
    def morpionGui(soi) :
    
        fenetre = gtk.Window()
        vb = gtk.VBox()
        fenetre.add(vb)
        
        fenetre.connect("destroy", gtk.main_quit)
        
        hb1 = gtk.HBox()
        hb2 = gtk.HBox()
        hb3 = gtk.HBox()
        hb4 = gtk.HBox()
        
        soi.imA = gtk.Button()
        soi.imB = gtk.Button()
        soi.imC = gtk.Button()
        soi.imD = gtk.Button()
        soi.imE = gtk.Button()
        soi.imF = gtk.Button()
        soi.imG = gtk.Button()
        soi.imH = gtk.Button()
        soi.imI = gtk.Button()
        soi.rejouer = gtk.Button("Rejouer")
        
        soi.imA.props.relief = gtk.RELIEF_NONE
        soi.imB.props.relief = gtk.RELIEF_NONE
        soi.imC.props.relief = gtk.RELIEF_NONE
        soi.imD.props.relief = gtk.RELIEF_NONE
        soi.imE.props.relief = gtk.RELIEF_NONE
        soi.imF.props.relief = gtk.RELIEF_NONE
        soi.imG.props.relief = gtk.RELIEF_NONE
        soi.imH.props.relief = gtk.RELIEF_NONE
        soi.imI.props.relief = gtk.RELIEF_NONE
        
        soi.imTab = {'A' : soi.imA, 
                     'B' : soi.imB,
                     'C' : soi.imC,
                     'D' : soi.imD,
                     'E' : soi.imE,
                     'F' : soi.imF,
                     'G' : soi.imG,
                     'H' : soi.imH,
                     'I' : soi.imI}
        
        vb.add(hb1)
        vb.add(hb2)
        vb.add(hb3)
        vb.add(hb4)
        
        hb1.add(soi.imA)
        hb1.add(soi.imB)
        hb1.add(soi.imC)
        hb2.add(soi.imD)
        hb2.add(soi.imE)
        hb2.add(soi.imF)
        hb3.add(soi.imG)
        hb3.add(soi.imH)
        hb3.add(soi.imI)
        hb4.add(soi.rejouer)
        
        sexy = "s"
        
        soi.cv = gtk.gdk.pixbuf_new_from_file_at_size("case.png", 128, 128)
        soi.cvx = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "casex.png", 128, 128)
        soi.cvo = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "caseo.png", 128, 128)
        soi.cvxh = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "casexh.png", 128, 128)
        soi.cvxv = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "casexv.png", 128, 128)
        soi.cvxdg = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "casexdg.png", 128, 128)
        soi.cvxdd = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "casexdd.png", 128, 128)
        soi.cvoh = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "caseoh.png", 128, 128)
        soi.cvov = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "caseov.png", 128, 128)
        soi.cvodg = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "caseodg.png", 128, 128)
        soi.cvodd = gtk.gdk.pixbuf_new_from_file_at_size(sexy + "caseodd.png", 128, 128)
        
        soi.imA.set_name("A")
        soi.imB.set_name("B")
        soi.imC.set_name("C")
        soi.imD.set_name("D")
        soi.imE.set_name("E")
        soi.imF.set_name("F")
        soi.imG.set_name("G")
        soi.imH.set_name("H")
        soi.imI.set_name("I")
        
        soi.imA.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imB.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imC.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imD.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imE.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imF.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imG.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imH.set_image(gtk.image_new_from_pixbuf(soi.cv))
        soi.imI.set_image(gtk.image_new_from_pixbuf(soi.cv))
        
        # imI.connect("clicked", gtk.main_quit)
        soi.imA.connect("clicked", soi.clique)
        soi.imB.connect("clicked", soi.clique)
        soi.imC.connect("clicked", soi.clique)
        soi.imD.connect("clicked", soi.clique)
        soi.imE.connect("clicked", soi.clique)
        soi.imF.connect("clicked", soi.clique)
        soi.imG.connect("clicked", soi.clique)
        soi.imH.connect("clicked", soi.clique)
        soi.imI.connect("clicked", soi.clique)
        soi.rejouer.connect("clicked", soi.cliqueRejouer)
        
        fenetre.show_all()
        gtk.main()
    
    def cliqueRejouer(soi, arg) :
    
        soi.joueurActif = 1
        soi.derniereCase = None
        soi.avantDerniereCase = None
        
        for clef in soi.dicoJoue.keys() :
            soi.dicoJoue[clef] = None
        
        for clef, img in soi.imTab.items() :
            img.set_image(gtk.image_new_from_pixbuf(soi.cv))
    
    def clique(soi, arg) :
        
        if soi.verifFini() :
            return
        
        case = arg.name
        
        if soi.dicoJoue[case] is not None :
            return
        
        soi.dicoJoue[case] = soi.joueurActif
        soi.derniereCase = case
        
        soi.joueurSuivant()
        
        arg.set_image(gtk.image_new_from_pixbuf(soi.cvx))  
        
        
        if not soi.verifFini() :
            soi.joueOrdi()
    
    def joueurSuivant(soi) :
        
        if soi.joueurActif == 1 :
            soi.joueurActif = 2
        else :
            soi.joueurActif = 1;
    
    def joueOrdiPourGagner(soi) :
        
        case = None
        
        for i, solution in enumerate(soi.dicoSolutions) :
        
            case0 = soi.dicoJoue[solution[0]]
            case1 = soi.dicoJoue[solution[1]]
            case2 = soi.dicoJoue[solution[2]]
            
            if case0 == case1 and case0 == soi.joueurActif and case2 is None :
                return solution[2]
        
            if case0 == case2 and case0 == soi.joueurActif and case1 is None :
                return solution[1]
        
            if case1 == case2 and case1 == soi.joueurActif and case0 is None :
                return solution[0]
        
        return None
        
    def joueOrdiDerniereCase(soi) :
    
        case = None
        
        derniereCaseABC = soi.derniereCase
        valCase = soi.dicoJoue[derniereCaseABC]
        caseCotes = soi.dicoCotes[derniereCaseABC]
        
        for caseCote in caseCotes :
        
            valCaseCote = soi.dicoJoue[caseCote]
            
            # Danger, jouer la case d'en face
            if valCaseCote == valCase :
                casesTries = [derniereCaseABC, caseCote]
                casesTries.sort()
                caseDanger = soi.dico[str(casesTries[0]) + str(casesTries[1])]
                if (soi.dicoJoue[caseDanger] is not None) :
                    return soi.joueOrdiPif()
                    
                return caseDanger
            
        # Pas de danger, mais jouer une case voisine à la dernière case
        caseVoisine = random.choice(caseCotes)
        if (soi.dicoJoue[caseVoisine] is None) :
            case = caseVoisine
            
        if case is None :
            return soi.joueOrdiPif()
            
        return case
    
    def joueOrdiPif(soi) :
        
        case = None
        caseOccupee = True
        
        while caseOccupee :
        
            case = random.choice(soi.tabCases)
        
            caseOccupee = soi.dicoJoue[case] is not None
        
        return case
    
    def joueOrdi(soi) :
        
        case = None
        
        if soi.derniereCase is None :
            case = soi.joueOrdiPif()
        else :
            case = soi.joueOrdiPourGagner()
            if case is None :
                case = soi.joueOrdiDerniereCase()
        
        bouton = soi.imTab[case]
        
        soi.dicoJoue[case] = soi.joueurActif
        bouton.set_image(gtk.image_new_from_pixbuf(soi.cvo))  
        
        
        if not soi.verifFini() :
            soi.joueurSuivant()
        
    
    def verifFini(soi) :
        
        for i, solution in enumerate(soi.dicoSolutions) :
        
            case0 = soi.dicoJoue[solution[0]]
            case1 = soi.dicoJoue[solution[1]]
            case2 = soi.dicoJoue[solution[2]]
            
            if case0 == case1 and case0 == case2 and case0 is not None :
                
                sens = soi.dicoSolutionsSens[i]
                
                if case0 == 1 :
                    image = soi.cvxh
                    if sens == 'v' : image = soi.cvxv
                    if sens == 'dg' : image = soi.cvxdg
                    if sens == 'dd' : image = soi.cvxdd
                    soi.imTab[solution[0]].set_image(gtk.image_new_from_pixbuf(image))  
                    soi.imTab[solution[1]].set_image(gtk.image_new_from_pixbuf(image))  
                    soi.imTab[solution[2]].set_image(gtk.image_new_from_pixbuf(image))  
                
                if case0 == 2 :
                    image = soi.cvoh
                    if sens == 'v' : image = soi.cvov
                    if sens == 'dg' : image = soi.cvodg
                    if sens == 'dd' : image = soi.cvodd
                    soi.imTab[solution[0]].set_image(gtk.image_new_from_pixbuf(image))  
                    soi.imTab[solution[1]].set_image(gtk.image_new_from_pixbuf(image))  
                    soi.imTab[solution[2]].set_image(gtk.image_new_from_pixbuf(image))  
                
                return True
        
        # Vérifie si match nul
        for case in soi.tabCases :
            if soi.dicoJoue[case] is None :
                return False
        
        print "Fini"
        return True
    
    def commencer(soi) :
        soi.morpionGui()
        
if __name__ == '__main__' :
    morpion = Morpion()
    morpion.commencer()