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).
+4
-0