Puissance 4 ?

Voici une approche graphique pour un jeu :

puissance4.py

In [ ]:
from kivy.app import App
from kivy.graphics import Line, Color, Rectangle, Ellipse
from kivy.uix.widget import Widget
from kivy.clock import Clock
from kivy.core.window import Window


class Jeton(Widget):
    def __init__(self,canvas,valeur,ecran):
        self.dx = 0
        self.dy = 0
        self.pos_x=0
        self.pos_y=ecran[1]*5/6
        self.pos=(self.pos_x,self.pos_y)
        self.canvas=canvas
        self.size=(ecran[1]/6,ecran[1]/6)
        self.valeur=valeur #1 pour rouge -1 pour jaune
        self.colonne=0
        self.stop=0 #position Y d'arret du jeton
        with self.canvas:
            
            Color(1,0,0,1)
            
            self.objid=Ellipse(pos=self.pos, size=self.size)

  
    def move(self):
        #On recalcule les positions:
        self.pos_y=self.pos_y+self.dy
        self.pos = (self.pos_x,self.pos_y)
        #On enleve le jeton:
        self.canvas.remove(self.objid)
        #On redessine le jeton:
        with self.canvas:
            
            Color(1,0,0,1)
            
            self.objid=Ellipse(pos=self.pos, size=self.size)

class Jeu(Widget):

    def debut(self):
        #On recupere la taille de l'ecran:
        self.size=Window.size
        #On cree le tableau de valeurs 5x5 pour la structure:
        self.tab=[
        [0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0],
        ]
        #On cree un jeton:
        self.jeton1=Jeton(self.canvas,1,self.size)
        #On dessine la grille:
        with self.canvas:
            
            Color(1,1,1,1)#blanc
            x1, y1=0,0
            x2, y2=0,5*self.height/6
            for i in range(0,6):
                Line(points=(x1, y1, x2, y2),width=4)
                x1=x1 + self.width/5
                x2=x2 + self.width/5
    
    def update(self, dt):
        #On deplace le jeton:
        self.jeton1.move()
        if self.jeton1.pos_y<=self.jeton1.stop:
            self.jeton1.dy=0
            self.affichage(int(self.jeton1.stop/(self.height/6)),self.jeton1.colonne,1)
            #Il faut ici changer la couleur du jeton et le replacer en haut
            #Il faut aussi tester la victoire

    def on_touch_move(self, touch):
        if self.jeton1.collide_point(touch.x,touch.y):
            self.jeton1.pos_x = touch.x - self.jeton1.width/2

    def on_touch_up(self, touch):
        if self.jeton1.collide_point(touch.x,touch.y):
            #On calcule l'index de la bonne colonne:
            self.jeton1.colonne=int((self.jeton1.pos_x+self.jeton1.width/2)//(self.width/5))
            self.chute(self.jeton1.colonne)

    def chute(self,colonne):
        #Il faut calculer la position Y d'arret du jeton
        #avec une boucle sur le tableau :
        
        #Ici on place le jeton dans la bonne colonne:
        self.jeton1.pos_x=(self.width/5)*(colonne) + (self.width/5-self.jeton1.width)/2
        #On commence la chute:
        self.jeton1.dy=-5

    def affichage(self,ligne,colonne,valeur):
        #On remplit le tableau:
        self.tab[ligne][colonne]=valeur
        #On insere le jeton dans l'affichage:
        position = ((self.width/5)*colonne,self.height/6*ligne)
        with self.canvas:
            #Il faut determiner la couleur:
            Color(1,0,0,1)
            
            Ellipse(pos=position, size=self.jeton1.size)

    def test_victoire(self):
        pass

class MyApp(App):

    def build(self):
        Jeu1=Jeu()
        Jeu1.debut()
        #On appelle Jeu1.update() touts les centiemes de seconde
        Clock.schedule_interval(Jeu1.update, 1.0/100.0)
        return Jeu1


if __name__ == '__main__':
    MyApp().run()
  • Complétez la grille en dessinant des lignes horizontales.

  • Modifiez la couleur du jeton (en jaune par exemple) dès le début du programme.

  • Dans la méthode \(\texttt{Jeu.affichage()}\), modifiez la position pour que le jeton créé soit au milieu de la colonne.

  • Dans la méthode \(\texttt{Jeu.update()}\) changez la couleur du jeton et repositionnez-le une fois la chute terminée pour changer de joueur.

  • Dans la méthode \(\texttt{Jeu.chute()}\) calculez la position à laquelle doit s'arrêter le jeton.

  • N'oubliez pas de compléter le tableau de valeurs et testez la victoire.