Ajout de version tenant compte d'une bordure
Implémentation non complète de la bordure reste à régler des problèmes de propagation !
This commit is contained in:
parent
532a25873d
commit
39655bf040
1 changed files with 76 additions and 27 deletions
103
genForet.py
103
genForet.py
|
|
@ -4,9 +4,13 @@ Created on Fri Feb 1 11:30:02 2019
|
||||||
|
|
||||||
@author: LordOf20th
|
@author: LordOf20th
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import random
|
import random
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Les états possibles de nos cases :
|
Les états possibles de nos cases :
|
||||||
- -1 : un arbre en feu
|
- -1 : un arbre en feu
|
||||||
|
|
@ -15,6 +19,7 @@ import tkinter as tk
|
||||||
- 1 : un arbre sain
|
- 1 : un arbre sain
|
||||||
- 2 : bordure
|
- 2 : bordure
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Fonctions agissant sur la matrice
|
# Fonctions agissant sur la matrice
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -35,8 +40,8 @@ def genForetBordure(n, p):
|
||||||
foret = np.full(shape=(n+1, n+1), fill_value=0)
|
foret = np.full(shape=(n+1, n+1), fill_value=0)
|
||||||
for i in range(0, foret.shape[0]):
|
for i in range(0, foret.shape[0]):
|
||||||
for j in range(0, foret.shape[1]):
|
for j in range(0, foret.shape[1]):
|
||||||
if i == 0 or j == 0 or j == n+1 or i == n+1:
|
if i == 0 or j == 0 or j == n or i == n:
|
||||||
foret[i, j] = 1
|
foret[i, j] = 2
|
||||||
else:
|
else:
|
||||||
if random.random() <= p:
|
if random.random() <= p:
|
||||||
foret[i, j] = 1
|
foret[i, j] = 1
|
||||||
|
|
@ -54,6 +59,17 @@ def enflammer(foret, x, y): # Fonction mettant le feu aléatoirement à une cas
|
||||||
foretEnflammée[x, y] = -1
|
foretEnflammée[x, y] = -1
|
||||||
return foretEnflammée
|
return foretEnflammée
|
||||||
|
|
||||||
|
|
||||||
|
def enflammerBordure(foret, x, y): # Fonction mettant le feu aléatoirement à une case
|
||||||
|
if x == -1 or x == 0:
|
||||||
|
x = random.randint(1, foret.shape[0]-1)
|
||||||
|
if y == -1 or x == 0:
|
||||||
|
y = random.randint(1, foret.shape[1]-1)
|
||||||
|
foretEnflammée = np.copy(foret)
|
||||||
|
foretEnflammée[x, y] = -1
|
||||||
|
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
|
||||||
|
|
@ -79,14 +95,14 @@ def propager(F, k, i, j):
|
||||||
|
|
||||||
def propager2(F, k, i, j):
|
def propager2(F, k, i, j):
|
||||||
''' Propage le feu au k ieme tour '''
|
''' Propage le feu au k ieme tour '''
|
||||||
print("rang :"+str(k)+" ("+str(i)+","+str(j)+")")
|
print("rang :" + str(k) + " (" + str(i) + "," + str(j) + ")")
|
||||||
# On ajuste les indices pour rester dans les index
|
# On ajuste les indices pour rester dans les index
|
||||||
i = i-1
|
i = i-1
|
||||||
j = j-1
|
j = j-1
|
||||||
if i == 0: # On est sur la ligne du haut
|
if i == 0: # On est sur la ligne du haut
|
||||||
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
|
||||||
elif i == F[k].shape[0]: # On est sur la ligne du bas
|
elif i == F[k].shape[0]-1: # On est sur la ligne du bas
|
||||||
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
|
||||||
else:
|
else:
|
||||||
|
|
@ -97,7 +113,7 @@ def propager2(F, k, i, j):
|
||||||
if j == 0: # On est sur la colonne de gauche
|
if j == 0: # On est sur la colonne de gauche
|
||||||
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
|
||||||
elif j == F[k].shape[1]: # On est sur la colonne de droite
|
elif j == F[k].shape[1]-1: # On est sur la colonne de droite
|
||||||
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
|
||||||
else: # On est sur aucune des colonnes latérales
|
else: # On est sur aucune des colonnes latérales
|
||||||
|
|
@ -106,23 +122,44 @@ def propager2(F, k, i, j):
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
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
|
||||||
propager2(F, k, i, j)
|
propager2(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
|
||||||
propager2(F, k, i, j)
|
propager2(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)
|
propager2(F, k, i, j)
|
||||||
print(F[k], "Rang : {}".format(k))
|
print(F[k], "Rang : {}".format(k))
|
||||||
k = k+1
|
k = k+1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def feuDeForetBordure(F):
|
||||||
|
k = 2
|
||||||
|
while -1 in F[k-1]:
|
||||||
|
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 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] == 0: # Si cette case ne portait pas d'arbre au rang k-1 alors on propage le feu et la case s'éteint
|
||||||
|
propager2(F, k, i, j)
|
||||||
|
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
|
||||||
|
propager2(F, k, i, j)
|
||||||
|
F[k][i, j] = -2
|
||||||
|
else: # La case a été mise en feu, elle propage le feu
|
||||||
|
propager2(F, k, i, j)
|
||||||
|
print(F[k], "Rang : {}".format(k))
|
||||||
|
k = k+1
|
||||||
|
|
||||||
|
|
||||||
def wildfire(n, p, x=-1, y=-1):
|
def wildfire(n, p, x=-1, y=-1):
|
||||||
|
|
@ -133,6 +170,16 @@ def wildfire(n, p, x=-1, y=-1):
|
||||||
feuDeForet(F)
|
feuDeForet(F)
|
||||||
return F
|
return F
|
||||||
|
|
||||||
|
|
||||||
|
def wildfireBordure(n, p, x=-1, y=-1):
|
||||||
|
F = [genForetBordure(n, p)] # Génération de la forêt selon les paramètres voulus
|
||||||
|
print(F[0], "Instant initial")
|
||||||
|
F.append(enflammerBordure(F[0], x, y)) # La forêt est enflammée puis stockée
|
||||||
|
print(F[1], "Rang : 1 (Départ de feu)")
|
||||||
|
feuDeForetBordure(F)
|
||||||
|
return F
|
||||||
|
|
||||||
|
|
||||||
# Affichage
|
# Affichage
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -157,11 +204,13 @@ def pause():
|
||||||
|
|
||||||
|
|
||||||
def tracerRectangles(F, canvas):
|
def tracerRectangles(F, canvas):
|
||||||
for i in range(0, F.shape[0]):
|
for i in range(0, F.shape[0]):
|
||||||
for j in range(0, F.shape[1]):
|
for j in range(0, F.shape[1]):
|
||||||
if F[i, j] == 1:
|
if F[i, j] == 1:
|
||||||
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='green', width=0)
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='green', width=0)
|
||||||
elif F[i, j] == -1:
|
elif F[i, j] == -1:
|
||||||
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='red', width=0)
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='red', width=0)
|
||||||
elif F[i, j] == -2:
|
elif F[i, j] == -2:
|
||||||
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='black', width=0)
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='black', width=0)
|
||||||
|
elif F[i, j] == 2:
|
||||||
|
canvas.create_rectangle((i+1)*10, (j+1)*10, (i+2)*10, (j+2)*10, fill='brown', width=0)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue