Feu de foret langage Python (tkinter)

Signaler
-
 senneville -
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 ....
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