Un AC qui modélise un feu de forêt par des règles très simples.
La fonction permettant un réglage (assez foireux) de la densité d'arbres a pour but l'étude du seuil de percolation.
Source / Exemple :
PROGRAM feu_de_foret; {by FHR}
USES Crt;
TYPE matrice = ARRAY [1..40,1..40] OF WORD;
VAR t,tab1,tab2:matrice;
s:CHAR;
nbretours:WORD;
bol:BOOLEAN;
dens:WORD;
PROCEDURE Affiche (tab:matrice);
VAR i,j:WORD;
BEGIN
FOR i:=1 TO 40 DO
BEGIN
FOR j:=1 TO 40 DO BEGIN
IF tab[i,j]=0 THEN Write(' ');
IF tab[i,j]=1 THEN Write('X');
IF tab[i,j]=2 THEN
BEGIN
Textcolor(red);
Write('O');
Textcolor(white);
END;
END;
Writeln;
END;
END;
PROCEDURE Aleat (VAR tab:matrice;d:WORD);
VAR i,j,pif:WORD;
BEGIN
Randomize;
FOR i:=1 TO 40 DO
BEGIN
FOR j:=1 TO 40 DO
BEGIN
pif:=Random(101);
IF pif<d THEN tab[i,j]:=1
ELSE tab[i,j]:=0;
END;
Writeln;
END;
tab[Random(41),Random(41)]:=2; {cree un départ de feu}
END;
PROCEDURE Tabnul (VAR tab:matrice);
VAR i,j:WORD;
BEGIN
Randomize;
FOR i:=1 TO 40 DO
BEGIN
FOR j:=1 TO 40 DO tab[i,j]:=0;
Writeln;
END;
END;
FUNCTION Compte(i,j:WORD;tabl:matrice):WORD; {compte le nombre de cellules voisines}
BEGIN
IF (i<>1) AND (i<>40) AND (j<>1) AND (j<>40) THEN {cellule sympa}
Compte:=tabl[i-1,j-1] DIV 2 + tabl[i-1,j] DIV 2 + tabl[i-1,j+1] DIV 2
+tabl[i,j-1] DIV 2 + + tabl[i,j+1] DIV 2
+tabl[i+1,j-1] DIV 2 + tabl[i+1,j] DIV 2 + tabl[i+1,j+1] DIV 2;
IF i=1 THEN
BEGIN
IF j=1 THEN Compte:=tabl[1,2] DIV 2+tabl[2,2] DIV 2+tabl[2,1] DIV 2;
IF j=40 THEN Compte:=tabl[1,39] DIV 2+tabl[2,39] DIV 2+tabl[2,40] DIV 2;
IF (j<>1) AND (j<>40) THEN Compte:=tabl[1,j-1] DIV 2+tabl[1,j+1] DIV 2
+tabl[2,j-1] DIV 2+tabl[2,j] DIV 2+tabl[2,j+1] DIV 2;
END;
IF i=40 THEN
BEGIN
IF j=1 THEN Compte:=tabl[39,1] DIV 2+tabl[39,2] DIV 2+tabl[40,2] DIV 2;
IF j=40 THEN Compte:=tabl[39,40] DIV 2+tabl[39,39] DIV 2+tabl[40,39] DIV 2;
IF (j<>1) AND (j<>40) THEN Compte:=tabl[40,j-1] DIV 2+tabl[40,j+1] DIV 2+
tabl[39,j-1] DIV 2+tabl[39,j] DIV 2+tabl[39,j+1] DIV 2;
END;
IF (j=1) AND ((i<>1) AND (i<>40)) THEN Compte:=tabl[i-1,1] DIV 2+tabl[i+1,1] DIV 2+
tabl[i-1,2] DIV 2+tabl[i,2] DIV 2+tabl[i+1,2] DIV 2;
IF (j=40) AND ((i<>1) AND (i<>40)) THEN Compte:=tabl[i-1,40] DIV 2+tabl[i+1,40] DIV 2
+tabl[i-1,39] DIV 2+tabl[i,39] DIV 2+tabl[i+1,39] DIV 2;
END;
PROCEDURE Evoluer(VAR tab:matrice);
VAR i,j,k:WORD;buff:matrice;
BEGIN
FOR i:=1 TO 40 DO
BEGIN
FOR j:=1 TO 40 DO
BEGIN
k:=compte(i,j,tab);
IF tab[i,j]=0 THEN buff[i,j]:=0;
IF tab[i,j]=1THEN
IF k=0 THEN buff[i,j]:=1
ELSE buff[i,j]:=2;
IF tab[i,j]=2 THEN buff[i,j]:=0;
END;
END;
tab:=buff;
END;
FUNCTION Comp(t1,t2:matrice):BOOLEAN;
VAR i,j:WORD;bol:BOOLEAN;
BEGIN
i:=1;
bol:=TRUE;
WHILE (bol<>FALSE) AND (i<=40) DO
BEGIN
FOR j:=1 TO 40 DO
IF t1[i,j]<>t2[i,j] THEN bol:=FALSE;
i:=i+1;
END;
Comp:=bol;
END;
BEGIN
bol:=FALSE;
Clrscr;
Write('Entree pour commencer');
Readln;
REPEAT
Write('Densit d arbres (%) ?');
readln(dens);
nbretours:=0;
Aleat(t,dens);
REPEAT
Delay(50);
Clrscr;
Writeln('Etape',nbretours);
Writeln;
Affiche(t);
tab1:=t;
nbretours:=nbretours+1;
Evoluer(t);
tab2:=t;
bol:=Comp(tab1,tab2);
UNTIL bol=TRUE;
writeln('Fin.');
writeln('Encore ?');
readln(s);
UNTIL s<>'o';
END.
Conclusion :
Le réglage de la densité est vraiment minable (dû au faible nombre de cellules (1600) !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.