Update genForet.py
Respect norme PEP 8
This commit is contained in:
parent
c763e17923
commit
489a8bbb21
1 changed files with 67 additions and 61 deletions
122
genForet.py
122
genForet.py
|
|
@ -7,7 +7,6 @@ Created on Fri Feb 1 11:30:02 2019
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import random
|
import random
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from PIL import Image
|
|
||||||
"""
|
"""
|
||||||
Les états possibles de nos cases :
|
Les états possibles de nos cases :
|
||||||
- 0 : pas d'arbre
|
- 0 : pas d'arbre
|
||||||
|
|
@ -15,97 +14,104 @@ from PIL import Image
|
||||||
- -1 : un arbre en feu
|
- -1 : un arbre en feu
|
||||||
- -2 : un arbre mort
|
- -2 : un arbre mort
|
||||||
"""
|
"""
|
||||||
#Fonctions agissant sur la matrice
|
# Fonctions agissant sur la matrice
|
||||||
def genForet(n,p):
|
|
||||||
if n>=2:
|
|
||||||
foret=np.full(shape=(n,n), fill_value=0)
|
def genForet(n, p):
|
||||||
for i in range(0,foret.shape[0]):
|
if n >= 2:
|
||||||
for j in range(0,foret.shape[1]):
|
foret = np.full(shape=(n, n), fill_value=0)
|
||||||
|
for i in range(0, foret.shape[0]):
|
||||||
|
for j in range(0, foret.shape[1]):
|
||||||
if random.random() <= p:
|
if random.random() <= p:
|
||||||
foret[i,j]=1
|
foret[i, j] = 1
|
||||||
return foret
|
return foret
|
||||||
else:
|
else:
|
||||||
raise ValueError("n doit prendre une valeur de 2 au moins")
|
raise ValueError("n doit prendre une valeur de 2 au moins")
|
||||||
|
|
||||||
def enflammer(foret,x,y): #Fonction mettant le feu aléatoirement à une case
|
|
||||||
if x==-1:
|
def enflammer(foret, x, y): # Fonction mettant le feu aléatoirement à une case
|
||||||
x=random.randint(0, foret.shape[0]-1)
|
if x == -1:
|
||||||
if y==-1:
|
x = random.randint(0, foret.shape[0]-1)
|
||||||
y=random.randint(0, foret.shape[1]-1)
|
if y == -1:
|
||||||
|
y = random.randint(0, foret.shape[1]-1)
|
||||||
foretEnflammée = np.copy(foret)
|
foretEnflammée = np.copy(foret)
|
||||||
foretEnflammée[x,y]=-1
|
foretEnflammée[x, y] = -1
|
||||||
return foretEnflammée
|
return foretEnflammée
|
||||||
|
|
||||||
def propager(F,k,i,j):
|
def propager(F, k, i, j):
|
||||||
try:
|
try:
|
||||||
if F[k-1][i-1,j] == 1: #Si la case au dessus est un arbre
|
if F[k-1][i-1, j] == 1: # Si la case au dessus est un arbre
|
||||||
F[k][i-1,j] = -1 #La case au dessus brûle
|
F[k][i-1, j] = -1 # La case au dessus brûle
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
if F[k-1][i+1,j] == 1: #Si la case au dessous est un arbre
|
if F[k-1][i+1, j] == 1: # Si la case au dessous est un arbre
|
||||||
F[k][i+1,j] = -1 #La case en dessous brûle
|
F[k][i+1, j] = -1 # La case en dessous brûle
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
if F[k-1][i,j-1] == 1: #Si la case à gauche est un arbre
|
if F[k-1][i, j-1] == 1: # Si la case à gauche est un arbre
|
||||||
F[k][i,j-1] = -1 #La case à gauche brûle
|
F[k][i, j-1] = -1 # La case à gauche brûle
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
if F[k-1][i,j+1] ==1: #Si la case à droite est un arbre
|
if F[k-1][i, j+1] == 1: # Si la case à droite est un arbre
|
||||||
F[k][i,j+1] = -1 #La case à droite brûle
|
F[k][i, j+1] = -1 # La case à droite brûle
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def feuDeForet(F):
|
def feuDeForet(F):
|
||||||
k=2
|
k = 2
|
||||||
while -1 in F[k-1]:
|
while -1 in F[k-1]:
|
||||||
F.append(np.copy(F[k-1])) #On copie la forêt du tour précédent
|
F.append(np.copy(F[k-1])) # On copie la forêt du tour précédent
|
||||||
|
|
||||||
for i in range(0,F[k].shape[0]):
|
for i in range(0, F[k].shape[0]):
|
||||||
for j in range(0,F[k].shape[1]):
|
for j in range(0, F[k].shape[1]):
|
||||||
if F[k-1][i,j]==-1:#Si la case est en feu au rang k
|
if F[k-1][i, j] == -1: # Si la case est en feu au rang k
|
||||||
if F[k-1][i,j]==0: #Si cette case ne portait pas d'arbre au rang k-1 alors on propage le feu et la case s'éteint
|
if F[k-1][i, j] == 0: # Si cette case ne portait pas d'arbre au rang k-1 alors on propage le feu et la case s'éteint
|
||||||
propager(F,k,i,j)
|
propager(F, k, i, j)
|
||||||
F[k][i,j]=0
|
F[k][i, j] = 0
|
||||||
elif F[k-2][i,j]==-1: #Si la case était en feu au tour précédent : propage et mort de l'arbre
|
elif F[k-2][i, j] == -1: # Si la case était en feu au tour précédent : propage et mort de l'arbre
|
||||||
propager(F,k,i,j)
|
propager(F, k, i, j)
|
||||||
F[k][i,j]=-2
|
F[k][i, j] = -2
|
||||||
else: #La case a été mise en feu, elle propage le feu
|
else: # La case a été mise en feu, elle propage le feu
|
||||||
propager(F,k,i,j)
|
propager(F, k, i, j)
|
||||||
print(F[k], "Rang : {}".format(k))
|
print(F[k], "Rang : {}".format(k))
|
||||||
k = k+1
|
k = k+1
|
||||||
|
|
||||||
|
|
||||||
def wildfire(n, p, x=-1, y=-1):
|
def wildfire(n, p, x=-1, y=-1):
|
||||||
F=[genForet(n,p)] #Génération de la forêt selon les paramètres voulus
|
F = [genForet(n, p)] # Génération de la forêt selon les paramètres voulus
|
||||||
print(F[0], "Instant initial")
|
print(F[0], "Instant initial")
|
||||||
F.append(enflammer(F[0],x,y)) #La forêt est enflammée puis stockée
|
F.append(enflammer(F[0], x, y)) # La forêt est enflammée puis stockée
|
||||||
print(F[1], "Rang : 1 (Départ de feu)")
|
print(F[1], "Rang : 1 (Départ de feu)")
|
||||||
feuDeForet(F)
|
feuDeForet(F)
|
||||||
return F
|
return F
|
||||||
|
|
||||||
def affichage(F):
|
|
||||||
for k in range(0,len(F)):
|
|
||||||
fenetre = tk.Tk() #Crée la fenêtre que l'on va modifier
|
|
||||||
label = tk.Label(fenetre, text="Wildfire") #Met en place le titre
|
|
||||||
label.pack()
|
|
||||||
canvas = tk.Canvas(fenetre, width=(F[k].shape[0]+2)*10, height=(F[k].shape[1]+2)*10,background='#c0c0c0') #On définit le canevas qui affiche notre forêt
|
|
||||||
canvas.create_rectangle(10,10,(F[k].shape[0]+1)*10,(F[0].shape[1]+1)*10,fill='#c68c53')
|
|
||||||
for i in range(0,F[k].shape[0]):
|
|
||||||
for j in range(0,F[k].shape[1]):
|
|
||||||
if F[k][i,j]== 1:
|
|
||||||
canvas.create_rectangle((i+1)*10,(j+1)*10,(i+2)*10,(j+2)*10,fill='green',width=0)
|
|
||||||
elif F[k][i,j]==-1:
|
|
||||||
canvas.create_rectangle((i+1)*10,(j+1)*10,(i+2)*10,(j+2)*10,fill='red',width=0)
|
|
||||||
elif F[k][i,j]==-2:
|
|
||||||
canvas.create_rectangle((i+1)*10,(j+1)*10,(i+2)*10,(j+2)*10,fill='black',width=0)
|
|
||||||
canvas.pack()
|
|
||||||
bouton = tk.Button(fenetre, text="Suivant", command=fenetre.destroy )
|
|
||||||
bouton.pack()
|
|
||||||
fenetre.mainloop() #affiche la fenêtre
|
|
||||||
|
|
||||||
#Fonctions utiles à l'affichage
|
def affichage(F):
|
||||||
|
for k in range(0, len(F)):
|
||||||
|
fenetre = tk.Tk() # Crée la fenêtre que l'on va modifier
|
||||||
|
label = tk.Label(fenetre, text="Wildfire") # Met en place le titre
|
||||||
|
label.pack()
|
||||||
|
canvas = tk.Canvas(fenetre, width=(F[k].shape[0]+2)*10, height=(F[k].shape[1]+2)*10, background='#c0c0c0') # On définit le canevas qui affiche notre forêt
|
||||||
|
canvas.create_rectangle(10, 10, (F[k].shape[0]+1)*10, (F[0].shape[1]+1)*10, fill='#c68c53')
|
||||||
|
for i in range(0, F[k].shape[0]):
|
||||||
|
for j in range(0, F[k].shape[1]):
|
||||||
|
if F[k][i, j] == 1:
|
||||||
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='green', width=0)
|
||||||
|
elif F[k][i, j] == -1:
|
||||||
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='red', width=0)
|
||||||
|
elif F[k][i, j] == -2:
|
||||||
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='black', width=0)
|
||||||
|
canvas.pack()
|
||||||
|
bouton = tk.Button(fenetre, text="Suivant", command=fenetre.destroy)
|
||||||
|
bouton.pack()
|
||||||
|
fenetre.mainloop() # Affiche la fenêtre
|
||||||
|
|
||||||
|
|
||||||
|
# Fonctions utiles à l'affichage
|
||||||
|
|
||||||
def pause():
|
def pause():
|
||||||
input("Appuyer sur Entrée pour continuer . . .")
|
input("Appuyer sur Entrée pour continuer . . .")
|
||||||
Loading…
Add table
Reference in a new issue