from Tkinter import *
from random import randrange
from time import sleep

#fonction pile ou face avec probabilite p pour cent de tomber sur pile
p = 50 #50 pour un tirage 1/2 1/2
def alea() :
    tirage = randrange(100)
    if tirage<p :
        return(-1)
    else :
        return(1)
#on aurait pu faire return(1-2*int(tirage<p))

fen = Tk()
enhaut=20
tp=15 #taille des pions
step = 12 #hauteur d'un saut
NbBilles = 2000 #nombre de billes envoyees
hauteur=30 #nombre d'etapes en descente
delai = 0.5 #temps pour descente des billes
milieu=hauteur*step
#creation du Canvas
can=Canvas(fen,height=800,width=2*milieu+30,bg='SteelBlue1')
can.pack()

#initialisation des listes
LP = [] #liste des __objets__ pions
Histo = [0 for k in range(2*hauteur+1)] #l'histogramme en bas
Change_k = [2**k for k in range(10)] #pour l'accelartion du tempo

#trace des plots
for n in range(hauteur) :
    for k in range(-n, n+1) :
        x = milieu+(k+1/2)*step
        y = (n+1/2)*step+enhaut
        can.create_oval(x-1,y-1,x+1,y+1,fill='DarkGreen',width=0)

#chute des billes
for k in range(NbBilles) :
    pion = can.create_oval(milieu,enhaut,milieu+tp+5,enhaut+tp,fill='LightBlue')
    LP.append(pion)
    largeur = hauteur
    for desc in range(hauteur) :
        depl = alea()
        can.move(pion,step*depl,step)
        can.create_line(largeur*step,enhaut+desc*step,(largeur+depl)*step,enhaut+(desc+1)*step)
        largeur += depl
        can.update()
        sleep(delai)
    Histo[largeur]+=1
    can.move(pion,0,step*Histo[largeur]/3)
    if k in Change_k :
        delai=delai*0.4


fen.mainloop()
