Feu de foret langage Python (tkinter)

binbindu84 - 20 avril 2013 à 18:19
 senneville - 16 mai 2013 à 17:23
bonjour, je suis éleve de terminale S SI et j'ai pour projet en Information Sciences du Numérique (ISN) de programmer un feu de foret sous Python , voici mon programme pour l'instant:
from tkinter import *

def damier(): #fonction dessinant le damier
ligne_vert()
ligne_hor()


def ligne_vert():
c_x = 0
while c_x != width:
can1.create_line(c_x,0,c_x,height,width=1,fill='black')
c_x+=c

def ligne_hor():
c_y = 0
while c_y != height:
can1.create_line(0,c_y,width,c_y,width=1,fill='black')
c_y+=c


def click_gauche(event): #fonction rendant vivante la cellule cliquée donc met la valeur 1 pour la cellule cliquée au dico_case
x = event.x -(event.x%c)
y = event.y -(event.y%c)
can1.create_rectangle(x, y, x+c, y+c, fill='red')
dico_case[x,y]=1

def click_droit(event): #fonction tuant la cellule cliquée donc met la valeur 0 pour la cellule cliquée au dico_case
x = event.x -(event.x%c)
y = event.y -(event.y%c)
can1.create_rectangle(x, y, x+c, y+c, fill='green')
dico_case[x,y]=0

def change_vit(event): #fonction pour changer la vitesse(l'attente entre chaque étape)
global vitesse
vitesse = int(eval(entree.get()))
print(vitesse)

def go():
"démarrage de l'animation"
global flag
if flag ==0:
flag =1
play()

def stop():
"arrêt de l'animation"
global flag
flag =0

def play(): #fonction comptant le nombre de cellules vivantes autour de chaque cellule
global flag, vitesse
v=0
while v!= width/c:
w=0
while w!= height/c:
x=v*c
y=w*c

# cas spéciaux:
# les coins
if x==0 and y==0: #coin en haut à gauche
compt_viv=0
if dico_case[x, y+c]==1:
compt_viv+=1
if dico_case[x+c, y]==1:
compt_viv+=1
if dico_case[x+c, y+c]==1:
compt_viv+=1
dico_etat[x, y]=compt_viv
elif x==0 and y==int(height-c): #coin en bas à gauche
compt_viv=0
if dico_case[x, y-c]==1:
compt_viv+=1
if dico_case[x+c, y-c]==1:
compt_viv+=1
if dico_case[x+c, y]==1:
compt_viv+=1
dico_etat[x, y]=compt_viv
elif x==int(width-c) and y==0: #coin en haut à droite
compt_viv=0
if dico_case[x-c, y]==1:
compt_viv+=1
if dico_case[x-c, y+c]==1:
compt_viv+=1
if dico_case[x, y+c]==1:
compt_viv+=1
dico_etat[x, y]=compt_viv
elif x==int(width-c) and y==int(height-c): #coin en bas à droite
compt_viv=0
if dico_case[x-c, y-c]==1:
compt_viv+=1
if dico_case[x-c, y]==1:
compt_viv+=1
if dico_case[x, y-c]==1:
compt_viv+=1
dico_etat[x, y]=compt_viv

# cas spéciaux:
# les bords du tableau (sans les coins)
elif x==0 and 0<y0:
fen1.after(vitesse,play)



def redessiner(): #fonction redessinant le tableau à partir de dico_etat
can1.delete(ALL)
damier()
t=0
while t!= width/c:
u=0
while u!= height/c:
x=t*c
y=u*c
if dico_etat[x,y]==3:
dico_case[x,y]=1
can1.create_rectangle(x, y, x+c, y+c, fill='red')
elif dico_etat[x,y]==2:
if dico_case[x,y]==1:
can1.create_rectangle(x, y, x+c, y+c, fill='red')
else:
can1.create_rectangle(x, y, x+c, y+c, fill='red')
elif dico_etat[x,y]<2 or dico_etat[x,y]>3:
dico_case[x,y]=0
can1.create_rectangle(x, y, x+c, y+c, fill='green')
u+=1
t+=1


#les différentes variables:

# taille de la grille
height = 600
width = 600

#taille des cellules
c = 20

#vitesse de l'animation (en réalité c'est l'attente entre chaque étapes en ms)
vitesse=50

flag=0
dico_etat = {} #dictionnaire contenant le nombre de cellules vivantes autour de chaque cellule
dico_case = {} #dictionnaire contenant les coordonnées de chaques cellules et une valeur 0 ou 1 si elles sont respectivement mortes ou vivantes
i=0
while i!= width/c: #assigne une valeur 0(morte) a chaque coordonnées(cellules) (valeur par défault en quelque sorte ^^)
j=0
while j!= height/c:
x=i*c
y=j*c
dico_case[x,y]=0
j+=1
i+=1

#programme "principal"
fen1 = Tk()

can1 Canvas(fen1, widthwidth, height =height, bg ='green')
can1.bind("", click_gauche)
can1.bind("", click_droit)
can1.pack(side =TOP, padx =5, pady =5)

damier()

b1 Button(fen1, text'Commencer', command =go)
b2 Button(fen1, text'Pause', command =stop)
b3 = Button(fen1, text='Fin du jeu', command=fen1.quit)
b4 = Button(fen1, text='Reinitialisation', command=damier)

b1.pack(side =LEFT, padx =3, pady =3)
b2.pack(side =LEFT, padx =3, pady =3)
b3.pack(side =LEFT, padx =3, pady =3)
b4.pack(side =LEFT, padx =3, pady =3)

entree = Entry(fen1)
entree.bind("<Return>", change_vit)
entree.pack(side =RIGHT)
chaine = Label(fen1)
chaine.configure(text = "Delai de propagation (ms) :")
chaine.pack(side =RIGHT)

fen1.mainloop()
fen1.destroy()
damier()
fen.mainloop()

voila mais je n'arrive pas a imposer des conditions pour qu'une case rouge (arbre en feu) reste rouge (en feu) pouvez vous m'aider svp ?...
merci cordialement .

2 réponses

Je vous en supplie aidez moi je n'en peux plus ....
0
senneville
bonsoir,
je ne suis pas expert en python mais en examinant
la source de ton programme je remarque que tu ne respectes pas les indentations comme par
exemple :
def ligne vert():
c_x = 0
while c_x != width :
can.create_line(c_x,0,c_x,height.
c_x+=0
def ligne_hor():
................
il conviendrait dans un premier temps de respecter cette règle absolument indispensable
0