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]