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