Défi de Clem // Percolation // un exemple de code dans un langage 'atypique'.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Voici un exemple de solution au défi 'Percolation', en langage Windev :

Code d'initialisation de la fenêtre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
PROCEDURE MaFenêtre()
nlig, ncol est un entier
la0, ha0 est un entier      // utile uniquement pour la représentation dans le champ image. 
n_arbres_initial est un entier
n_arbres_brules est un entier

pct_clairiere est un réel
pct_p est un réel

tb est un tableau dynamique // Etat de chaque case ( ou encore de chaque arbre)

q_etat est une Enumération
    clairiere
    Arbre_sain
    arbre_en_feu
    arbre_en_cendres
FIN
liste_arbres_en_feu est un tableau de 0 par 2 entiers

Code du bouton 'Go' :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
i,j est un entier
r est un réel
i1,j1 , i2,j2  est un entier

nlig = 200 
ncol = 200
la0 = PartieEntière(Image1..Largeur  / ncol)
ha0 = PartieEntière(Image1..Hauteur  / nlig)
Image1..Largeur = la0 * ncol
Image1..Hauteur = ha0 * nlig

pct_p = 0.59
i = Saisie( " Donnez-le pourcentage de propagation du feu d'un arbe à l'autre",pct_p )
SI i = -1 ALORS RENVOYER Faux  // L'utilisateur a cliqué sur Annuler
SI pct_p < 0 _OU_ pct_p > 1 ALORS 
    Erreur ( " Le nombre saisi est uinvalide "," Abandon ") 
    RENVOYER Faux
FIN

pct_clairiere = 0.02
i = Saisie( " Donnez-le pourcentage de clairiere dans la grille ",pct_clairiere )
SI i = -1 ALORS RENVOYER Faux  // L'utilisateur a cliqué sur Annuler
SI pct_clairiere < 0 _OU_ pct_clairiere > 1 ALORS 
    Erreur ( " Le nombre saisi est uinvalide "," Abandon ") 
    RENVOYER Faux
FIN

tb = allouer un tableau de nlig par ncol q_etat
// Initialisation clairiere // Arbre
InitHasard( HeureVersEntier(HeureSys()))
dDébutDessin(Image1)

n_arbres_initial = 0
POUR i = 1 _A_ nlig
    POUR j = 1 _A_ ncol
        r = Hasard()
        SI r > pct_clairiere ALORS 
            tb[i,j]= Arbre_sain
            n_arbres_initial ++
        SINON
            tb[i,j] = clairiere
        FIN
        f_dessine(i,j )
    FIN
FIN
SI n_arbres_initial = 0 ALORS 
    Erreur ( " Aucun arbre, uniquement de la clairiere ! ", "fin du traitement")
    RENVOYER Faux
FIN

// Choisir un arbre  où le feu se déclenche
i1 = Hasard(nlig)
j1 = Hasard(ncol)
TANTQUE tb[i1,j1] <> Arbre_sain  // Boucle 
    i1 = Hasard(nlig)
    j1 = Hasard(ncol)
FIN
tb[i1,j1]= arbre_en_feu
TableauSupprimeTout(liste_arbres_en_feu)
TableauAjouteLigne(liste_arbres_en_feu,i1,j1)
f_dessine(i1,j1)
n_arbres_brules =1


// Et debut de la propagation
TANTQUE TableauOccurrence( liste_arbres_en_feu) > 0
    // Je prends le premier arbre, je prends ses 4 voisins, et je propage le feu, avec une probablilité p
    i1 = liste_arbres_en_feu[1,1]
    j1 = liste_arbres_en_feu[1,2]
    TableauSupprimeLigne(liste_arbres_en_feu,1)
    POUR direction  = 1 A 4
        SELON direction
            CAS 1 
                i2=i1+1  ;  j2= j1
            CAS 2 
                i2=i1-1  ;  j2= j1
            CAS 3 
                i2=i1  ;  j2= j1 -1
            CAS 4 
                i2=i1  ;  j2= j1+1
            AUTRE CAS   
        FIN
        // Ici, on pourrait aménager pour traiter le cas du tore.
        SI i2 > 0 _ET_ i2<= nlig _ET_ j2 > 0 _ET_ j2 <= ncol ALORS
            SI tb[i2,j2] = Arbre_sain ALORS 
                r = Hasard()
                SI r <= pct_p ALORS 
                    tb[i2,j2] = arbre_en_feu
                    f_dessine(i2,j2)
                    TableauAjouteLigne(liste_arbres_en_feu,i2,j2) 
                    n_arbres_brules++
                FIN
            FIN
        FIN
    FIN
    tb[i1,j1]= arbre_en_cendres
    f_dessine(i1,j1)
FIN
Info( n_arbres_brules, n_arbres_initial)

Code de la fonction de dessin, pour visualiser la progression du feu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
PROCEDURE f_dessine(i,j)
coul est un entier
qq est un q_etat
qq= tb[i,j]
SELON qq
    CAS clairiere
        coul = JauneClair
    CAS Arbre_sain
        coul = VertClair
    CAS arbre_en_feu
        coul = RougeClair
    CAS arbre_en_cendres
        coul = GrisFoncé    
FIN
dRectangle(  (j-1)* la0, ( i-1)*ha0, j*la0,i*ha0, coul,coul)
MultitâcheRepeint()
RENVOYER Vrai

Et une image, en cours de traitement (certains arbres sont encore en feu / en rouge sur le dessin). percolation

+4 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte