Voici une approche graphique pour un jeu :
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.