Formino

Professeurs référents :

M FAURY (ISN)

Jeu de société FORMINO

Inès BLANCO-MAZIN et Agathe LORAIN, TS5, 2017-2018

Projet : Réaliser le jeu formino.

Règles du jeu : FORMN_RG

Compétences :

Dimension algorithmique  Créer les cartes qui donnent les formes
Générer un plateau de jeu
Éléments de programmation Déplacer ses pions
Comparer les cartes au plateau de jeu
Utilisation des réseaux Éventuellement créer le jeu en réseau
Représentation de l’information Créer une interface graphique

Contraintes : Il faut s’approprier Tkinter.

Répartition des tâches :

Inès

Agathe

Générer les cartes

Programme qui compare la carte au plateau de jeu en cours

Faire le décompte des points

Créer le plateau plus une partie propre à chaque joueur

Changer les pions de place

« Traduire » les cartes visuellement

Cahier des charges :

Chaque joueur a devant lui le plateau de jeu et les cartes avec les formes qu’il doit réaliser. L’ordinateur doit reconnaître les formes faites et compter les points. Lorsqu’un joueur arrive au nombre de points déterminés le jeu s’arrête.

Ressources documentaires :

Site « L’informatique c’est fantastique ! »

Règle du jeu (source personnelle)

Avancement du projet :

Date

Inès

Agathe

30/01

Liste des tâches à réaliser, répartition du travail. Première approche de Tkinter.

7/02

Création des cartes (début)

Apprendre à utiliser Tkinter

Vacances de février

Création de la fenêtre, du plateau. Mise en page.

28/02

Création des cartes (suite) Affichage des cartes pour un joueur.

entre le 20 et le 28/03

Optimisation du code du plateau et de l’affichage d’une carte. Amélioration de la lisibilité du code.

02/04

Recherche de l’introduction d’un évènement pour déplacer les pions. Optimisation de ce code pour modifier le plateau.

04/04

 Fonction pour faire tourner les cartes

Fonction pour comparer deux cartes

Création des cartes (suite)

Fin de l’optimisation de la fonction « bouger pions ».

Réorganisation du code avec l’introduction de la fonction application.

Vacances d’avril

Organisation du plateau avec la méthode grid, redimension du plateau.

Affichage de la main de chaque joueur dans une fenêtre à part.

25/04 Modification du programme pour créer les cartes (la première façon n’étant pas pratique) Réglage des problèmes pour qu’un évènement déplace les pions et modifie la liste du plateau.

 

08/05 Création d’un canvas pour afficher le score des joueurs et déterminer à qui est-ce le tour de jouer.

[reveal heading= »%image% Programme »]

Programme principal

from tkinter import *
from creer_cartes import *


class AppFormino(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.geometry("%dx%d+%d+%d" % (800, 600, 400, 0))
        
        self.plateau = [0,0,0,0,1,2,2,2,2] # Disposition par defaut du plateau
        self.joueur_courant = 1 # A qui de jouer


        self.texte = StringVar() # pour afficher a qui le tour
        self.texte.set("C'est au tour du joueur Bleu")
        self.instruct1=Label(self, textvariable=self.texte, fg="blue", cursor="circle", font="bold", relief="raised")
        self.instruct1.grid(row=2, column=3, columnspan=10)

        self.score= StringVar()
        self.score.set("Score")
        self.afscore=Label(self, textvariable=self.score, fg="grey", cursor="circle", font="bold", relief="raised")
        self.afscore.grid(row=1, column=15)
        
        self.minsize(800,250) # taille de la fenetre
        self.title("Formino")# titre
        self['bg']='white' # couleur fond
        self.resizable(width=False, height=False)# taille fixe
        
        self.grid()
        self.createWidgets()
          
        # Generation du paquet de cartes
        self.cartes = creer_cartes()
        print(self.cartes)
        
        # get screen width and height
        ws = self.winfo_screenwidth() # width of the screen
        hs = self.winfo_screenheight() # height of the screen
        self.mainJB = MainJoueur(self, 0, "Joueur 1")
        w = 250
        h = 250
        self.mainJB.geometry("%dx%d+%d+%d" % (w, h, 10, 0))
        self.mainJR = MainJoueur(self, 2, "Joueur 2")
        self.mainJR.geometry("%dx%d+%d+%d" % (w, h, ws-w-20, 0))
        
        
        # Dit qui doit commencer a jouer
        self.d1=0 # le JB commence
        self.d2=1
    
    def bouger_pionJoueurB(self, event):
            global c #position du pion cliqué dans la grille
            global u # = indice du "1" ds la liste
            c=0
            u=0
            x=event.x ; y=event.y # coordonnées du lieu cliqué
            a=10; b=10 
            for g in range(3):
                b=10
                if a<=y<=a+100: #si le pion est sur la première ligne
                    for q in range(3):
                        if b<=x<=b+100: # si le pion est dans la deuxième colonne
                            u=self.plateau.index(1)
                            self.cliq_trouJB()
                        c+=1 ; b+=125
                else:
                    c+=3
                a+=125 
            
    def cliq_trouJB(self): # Verifie si on clique a l'emplacement libre
        if c==u:
            self.cliq_bon_color()
        elif self.plateau[c]==2: # Le JB a clique sur les pions du JR
            self.cliq_bon_color()
        else:
            self.plateau[c]=1 # le pion cliqué devient le trou
            self.plateau[u]=0 # le trou est comblé par le pion du JB
            self.affiplat()
            self.d2=0 ; self.d1=1
            self.texte.set("C'est au tour du joueur Rouge !")
            self.instruct1.configure(fg = "red")

        
    def bouger_pionJoueurR(self, event):
            global c
            global u # = indice du "1" ds la liste
            c=0
            u=0
            x=event.x ; y=event.y
            a=10; b=10
            for g in range(3):
                b=10
                if a<=y<=a+100:
                    for q in range(3):
                        if b<=x<=b+100:
                            u=self.plateau.index(1)
                            self.cliq_trouJR()
                        c+=1 ; b+=125
                else:
                    c+=3
                a+=125 
    
    
    def cliq_trouJR(self): # Verifie si on clique a l'emplacement libre
            if c==u: #ca veut dire qu'on a clique sur le trou
                self.cliq_bon_color()
            elif self.plateau[c]==0: # Le JR a clique sur pions du JB
                self.cliq_bon_color()
            else:
                self.plateau[c]=1
                self.plateau[u]=2
                self.affiplat()
                self.d1=0 ; self.d2=1
                self.texte.set("C'est au tour du joueur Bleu !")
                self.instruct1.configure(fg = "blue")
    
    def cliq_bon_color(self): # Le joueur ne peut pas deplacer les pions d'un autre
            self.texte.set("VOUS N'AVEZ PAS CLIQUE SUR VOS PIONS ! ! ! ")
            self.instruct1.grid(row=2, column=4, columnspan=5)
            if self.d1==0:
                self.d1=0 ; self.d2=1
            elif self.d2==0 :
                self.d2=0 ; self.d1=1
    

    def a_qui_le_tour (self, event):
        self.affiplat()
        if self.d1==0:
            self.bouger_pionJoueurB(event)
            #comparer_plateau(self.d1, self.plateau, self.cartes)
        elif self.d2==0:
            self.bouger_pionJoueurR(event)
            #comparer_plateau(self.d1, self.plateau, self.cartes)
            
        
        
    def createWidgets(self):
        # Creation du plateau
        self.plat=Canvas(self, width="370",height="370",background="grey")
        self.plat.grid(row=5, column=5, columnspan=15, rowspan=10, padx=10)
        self.plat.bind('<Button-1>', self.a_qui_le_tour)
        self.affiplat()
        
        self.quitButton = Button(self, text='Quit',command=self.destroy) # Use destroy instead of quit
        self.quitButton.grid(row=20, column=20)

    def affiplat(self): # Afficher le plateau
        x, y =10, 10
        for i in range(0,8,3):
            a=i
            x=10
            for j in self.plateau[a:a+3]:
                if j==0:
                    self.plat.create_oval(x,y,x+100,y+100, fill="blue")
                elif j==2:
                    self.plat.create_oval(x,y,x+100,y+100, fill="red")
                else:
                    self.plat.create_oval(x,y,x+100,y+100, fill="black")
                x+=125
            y+=125


class MainJoueur(Toplevel):
    def __init__(self, parent, couleur, nom):
        Toplevel.__init__(self, parent)
        self.parent = parent
        self.couleur = couleur
        self.minsize(250,250)
        self.title(nom)
        self.grid()
        self.cartes = []  # Cartes dans la main du joueur
        self.createWidgets()
        
        
    def createWidgets(self):
        #Affichage d'une carte
        self.afcarte=Canvas(self, width="200",height="200",background="grey")
        self.afficart()
        self.afcarte.grid()
        self.quitButton = Button(self, text='Quit',command=self.destroy) # Use destroy instead of quit
        self.quitButton.grid()

    def afficart(self): # Afficher la carte pour le joueur
        self.cartes.append(tirage(self.parent.cartes))
        self.cartes=self.cartes[0]
        y=10; x=5
        for i in range(0,3):
            x=5
            for j in self.cartes[i]:
                if j==0:
                    self.afcarte.create_oval(x,y,x+35,y+35, fill="green")
                else :
                    self.afcarte.create_oval(x,y,x+35,y+35, fill="black")
                x+=45
            y+=45


app = AppFormino()
app.mainloop()

Module creer_cartes.py

from random import randint

def comparer(L1,L2):
    q=0
    i=0
    for i in range(3):
        
        if L1[i]==L2[i]:
            q+=1
    if q==3:
        q=1
    else:
        q=0
    return q
    
def tourner(L):
    L[0][0],L[0][1],L[0][2],L[1][0],L[1][2],L[2][0],L[2][1],L[2][2] = L[0][2],L[1][2],L[2][2],L[0][1],L[2][1],L[0][0],L[1][0],L[2][0]

def creer_cartes():
    cartes=[] # paquet de cartes au final
    carte=[] 
    
    
    lot=[[0,0,0],[0,0,1],[0,1,0],[1,0,0],[0,1,1],[1,0,1],[1,1,0],[1,1,1]]
    for i in range(8):
        carte=[]
        carte.append(lot[i])
        for j in range(8):
            carte_w=list(carte)
            carte_w.append(lot[j])
            for k in range(8):
                carte_x=list(carte_w)
                carte_x.append(lot[k])
                cartes.append(carte_x)
    
    
    
    cartef=[] 
    for c in cartes:
        n = 0
        for l in c:
            n += sum(l)
        if n == 5:
            cartef.append(c)
    print(cartef)
    
    
    # 
    # for y in range(len(cartes)):
    #     test=[]
    #     test=cartes[y]
    #     n=0
    #     for z in range(3):
    #         tes=test[z]
    #         for a in range(3):
    #             if tes[a]==1:
    #                 n+=1
    #     print(n)
    #     if n==5:
    #         cartef.append(cartes[y])
    
    
    
    cartes=[]
    q=0
    for y in range(len(cartef)):
        tri=[]
        m=0
        tri = cartef[y][:]
        for z in range(y+1,len(cartef)):
            for i in range(4):
                tourner(tri)
                q = comparer(tri,cartef[z])
                if q==1:
                    m+=1
        
        if m==0:
            cartes.append(tri)
    
    return cartes


def tirage(cartes):
    a=(randint(0, len(cartes)))
    b=cartes[a]
    del cartes[a]
    return b


def comparer_plateau(d1, plateau, cartes):
    if d1==0:#joueur bleu
        for i in range(4):
            complat= plateau
            complat[complat.index(2)]=1
        for i in range(4):
            tourner(cartes)
            comparer(complat,cartes)
        if q==1:
            bleu+=1
    else :
        for i in range(4):
            complat= plateau
            complat[complat.index(0)]=1
        for i in range(4):
            tourner(cartes)
            comparer(complat,cartes)
        if q==1:
            rouge+=1
            

if __name__ == "__main__":
    cartes = creer_cartes()
    tirage(cartes)
    comparer_plateau(0)
    

 

[/reveal]

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *