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:
LordOf20th 2019-06-11 23:08:53 +02:00
parent 532a25873d
commit 39655bf040

View file

@ -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
@ -86,7 +102,7 @@ def propager2(F, k, i, j):
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,6 +122,7 @@ 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]:
@ -120,7 +137,27 @@ def feuDeForet(F):
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))
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)) print(F[k], "Rang : {}".format(k))
k = k+1 k = k+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
@ -165,3 +212,5 @@ def tracerRectangles(F, canvas):
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)