from math import * from kandinsky import * from random import * from time import * # couleurs et dessin du coeur BLA=(255,255,255) ROS=(210,130,180) ROU=(210,30,60) NOI=(0,0,0) coul = [BLA, ROS, ROU, NOI] cases = [ [0,0,1,1,1,1,0,0,0,1,1,1,1,0,0], [0,1,1,1,1,1,1,0,1,1,1,1,1,1,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,3,3,1,3,3,1,1,1,1,1], [1,1,1,1,3,2,2,3,2,0,3,1,1,1,1], [0,1,1,1,3,2,2,2,2,2,3,1,1,1,0], [0,1,1,1,1,3,2,2,2,3,1,1,1,1,0], [0,0,1,1,1,1,3,2,3,1,1,1,1,0,0], [0,0,0,1,1,1,1,3,1,1,1,1,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0] ] # dimensions et position du coeur largeur, hauteur = len(cases[0]), len(cases) gauche, haut = 8, 4 class balle(): def __init__(self): self.x = randint(1,20) self.y = randint(15,20) # direction deplacement self.vx = 1 if random() < 0.5 else -1 self.vy = 1 def aff(self,x1,y1,x2,y2): # si deplacement, on efface case precedente et affiche suivante fill_rect(10 * x1, 10 * y1, 10, 10, BLA) fill_rect(10 * x2, 10 * y2, 10, 10, NOI) self.x = x2 self.y = y2 def bouge(self): # position suivante avec effet aleatoire xx = max(0, min(31,self.x + self.vx + randint(-1,1))) yy = max(0, min(21,self.y + self.vy)) # bords ? Si oui rebond if xx == 0 or xx == 31: self.vx *= -1 if yy == 0 or yy == 21: self.vy *= -1 # On est dans le cadre du dessin ? try: # La case n'est pas vide ? if cases[yy - haut][xx - gauche] > 0: # rebond self.vx *= -1 self.vy *= -1 # si c'est du rose, on efface if cases[yy - haut][xx - gauche] == 1: cases[yy - haut][xx - gauche] = 0 else: # la case est vide, on deplace la balle self.aff(self.x, self.y, xx, yy) # on est a l'exterieur du cadre donc deplacement except: self.aff(self.x, self.y, xx, yy) def plateau(cases): for l, t in enumerate(cases): for c, v in enumerate(t): # la couleur depend de la valeur de la case 0 = BLA, 1 = ROS... fill_rect(10 * gauche + 10 * c, 10 * haut + 10 * l, 10, 10, coul[v]) plateau(cases) # creation de 5 balles balles = [] for k in range(12): balles.append(balle()) depart = monotonic() while True: for b in balles: b.bouge() sleep(0.03) s = sum([r.count(0) for r in cases]) if s==169: fill_rect(0,0,320,222,BLA) plateau(cases) break #calcul du nb de jours et affichage jours = int((monotonic() - depart) / 3) draw_string(str(jours)+" jours",120,180,ROS)