1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| # -*- coding: cp1252 -*-
# ==============================================================================
# Slidings rows : jeu de puissance 4 améliorer
# ==============================================================================
"""Slidings Rows """
__author__ =
__version__ = "1.0"
__date__ = "14/05/2010"
# ------------------------------------------------------------------------------
from Tkinter import *
class TextGrid(Frame):
"""grille rectangulaire de widget avec la possibilité d'ajouter un texte"""
config = {'border':1, 'widget':Label, 'text':'' , 'size':(2,2), 'command':''}
def __init__(self, master, **keys):
"""initialise la grille de widget"""
for key in self.config:
if key not in keys: keys[key] = self.config[key]
self.grid, self.size, self.init = {}, keys['size'], keys['text']
widget, command, (cols,rows) = keys['widget'], keys['command'], keys['size']
del keys['widget'], keys['command'], keys['size']
Frame.__init__(self, master, border=keys['border'], relief=SOLID)
for col in range(cols):
for row in range(rows):
if command:
keys['command'] = lambda cell=(col,row): command(cell)
self.grid[col,row] = widget(self, keys)
self.grid[col,row].grid(column=col, row=row, sticky=N+S+W+E)
for n in range(cols): self.columnconfigure(n, weight=1)
for n in range(rows): self.rowconfigure(n, weight=1)
def __getitem__(self, key):
if isinstance(key, str):
return Frame.__getitem__(self, key)
col, row = key[:2]; prop = key[2] if len(key) == 3 else 'text'
return self.grid[col,row][prop]
def __setitem__(self, key, val):
if isinstance(key, str):
Frame.__setitem__(self, key, val); return
col, row = key[:2]; prop = key[2] if len(key) == 3 else 'text'
self.grid[col,row][prop] = val
class Initiation(Tk):
"""initialise le jeu"""
def __init__(self,parent):
"""initialise les différentes variables et crée les widgets"""
Tk.__init__(self,parent)
self.parent = parent
self.size, self.fnt = (7,7), "Arial 14" #initialise les variables de taille et d'écriture
self.colors = ('RED','RED','RED','RED','RED','RED','RED') #texte pour initialiser gridB
self.color1 = 'RED' #définie une couleur associée à un joueur
self.color2 = 'BLUE'
self.joueur1 = 0 #initialise le nombre de combinaisons gagnantes à 0
self.joueur2 = 0
self.gridB = TextGrid(self, widget=Button, size=(7,1), font=self.fnt, width=9,
command=Calcul().paint) # création des boutons permettant de commander où
for p, color in enumerate(self.colors): # placer une pièce et quelle couleur doit jouer
self.gridB[p,0] = 'RED'
self.gridB[p,0,'bg'] = 'GREY'
self.gridB.pack(side=TOP, fill=BOTH, padx=5, pady=5)
self.gridA = TextGrid(self, size=self.size, font=self.fnt, width=4, height=2, relief=SOLID) # création de la grille de jeu
for p in range(7): # cette grille est de taille 7x7
for k in range(7): # comme le puissance 4 "classique"
self.gridA[p,k,'bg'] = 'GREY'
self.gridA.pack(side=TOP, fill=BOTH, expand=YES, padx=5, pady=5)
class Calcul():
"""'coeur' du jeu où sont disposées les méthodes permettant le bon fonctionnement"""
def paint(self, button):
"""vérifie si le joueur peut jouer dans une colonne"""
temp,root.temp_gridB=[],[] #initialise des listes
val = button[0]
if root.gridB[val,0] == 'Stop': #si sur le bouton de gridB il est écrit 'Stop', on ne peut pas jouer dans cette colonne
p = [7]
for v in range(7):
if root.gridB[v,0] != 'Stop': #si on peut jouer ( bouton différent de 'Stop')
root.temp_gridB.append(root.gridB[v,0]) #on enregistre la couleur courante ds temp_gridB
if len(root.temp_gridB) != 0: #cette condition permet de jouer si toutes les boutons de gridB n'affiche pas 'Stop'
self.color = root.temp_gridB[0] #on définit la couleur courante permettant de connaitre la couleur pour toutes les méthodes
if len(temp) == 0:
if root.temp_gridB[0] == root.color1: #on définit le joueur courant permettant de connaitre le joueur pour toutes les méthodes
self.joueur=root.joueur1
else:
self.joueur=root.joueur2
self.remplir(button) #on appelle les méthodes remplir et gagner
self.gagner(button)
def remplir(self, button):
"""place une pièce dans la grille de jeu en respectant la gravité"""
val = button[0]
k = 6
while k:
if root.gridA[val,k,'bg'] == 'GREY': #on vérifie si on peut placer une pièce dans une colonne
root.gridA[val,k,'bg'] = self.color #et si on peut, on l'ajoute avec la couleur courante
self.change()
break
else:
k -= 1
if (k == 0) and (root.gridA[val,k,'bg'] == 'GREY'):
root.gridA[val,k,'bg'] = self.color #si la pièce ajoutée est la dernière de la colonne
root.gridB[val,0,'bg'] = 'yellow' #alors on bloque la colonne pour la suite du jeu
root.gridB[val,0] = 'Stop' #en la colorant en jaune et en écrivant 'Stop'
self.change() #et on change de joueur
def change(self):
"""permet de passer d'un joueur à l'autre après une action de jeu"""
if root.temp_gridB[0] == root.color1: #on regarde la couleur courante et
self.color='BLUE' #on la change pour le joueur suivant
else:
self.color='RED'
cols, rows = root.size
for p in range(rows): #on applique le changement sur gridB
if root.gridB[p,0] != 'Stop': #en modifiant le texte des boutons
root.gridB[p,0] = self.color #mais on vérifie avant que les boutons ne soient pas des 'Stop'
# ==============================================================================
if __name__ == "__main__": #on crée notre root
root=Initiation(None)
root.withdraw()
root.title("Sliding Rows")
root.minsize(root.winfo_width(), root.winfo_height())
root.resizable(1,1)
root.deiconify()
root.mainloop() |
Partager