Forest fire: Difference between revisions
m
fixed "copy pasta" link in Commodore BASIC
m (fixed "copy pasta" link in Commodore BASIC) |
|||
(22 intermediate revisions by 11 users not shown) | |||
Line 26:
=={{header|6502 Assembly}}==
<
; SYS 17239 or CALL 17239
Line 447:
; end COMMODORE 64 specific
</syntaxhighlight>
=={{header|8086 Assembly}}==
Line 454:
It uses a field size of 320x200 (the CGA screen) and runs at about one frame per second on a 20mhz 286.
<
probF: equ 7 ; P(spontaneous combustion) ~= 0.0001
probP: equ 655 ; P(spontaneous growth) ~= 0.01
Line 642:
rnddat: resb 4 ; RNG state
stack: resw 128 ; Stack space
.top: equ $</
=={{header|Ada}}==
<
with Ada.Text_IO; use Ada.Text_IO;
Line 714:
Put (Forest);
end loop;
end Forest_Fire;</
Sample output:
<pre style="height:30ex;overflow:scroll">
Line 815:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
<
f prob = 0.01, # new combustion probability #
p prob = 0.01; # tree creation probability #
Line 873:
printf(($gl$, 2 UPB world * "-"))
OD
)</
Output:
<pre>
Line 916:
This implementation uses AutoHotkey's pseudo-arrays to contain each cell.
The size of the (square) map, probabilities, and characters which correspond to burning, tree, or empty can be edited at the beginning of the script.
<syntaxhighlight lang="autohotkey">
; The array Frame1%x%_%y% holds the current frame. frame2%x%_%y%
; is then calculated from this, and printed. frame2 is then copied to frame1.
Line 1,069:
return 0
}
</syntaxhighlight>
Sample Output using the default settings:
<pre style="height:35ex;overflow:scroll;">
Line 1,130:
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
{{trans|6502 Assembly}}
<syntaxhighlight lang="gwbasic"> 100 FOR I = 17239 TO 17493
110 READ B
120 POKE I,B
130 NEXT
140 CALL 17239
150 END
160 DATA162,23,138,32,71,248,165,38,157,60,3,165,39,157,84,3,202,16,239,162,96
170 DATA134,249,134,1,160,0,132,0,152,145,0,200,208,251,232,134,1,224,128,208
180 DATA244,44,86,192,44,82,192,44,84,192,44,80,192,32,50,248,162,0,134,0,169
190 DATA41,133,2,133,254,169,83,133,4,165,249,133,1,133,3,133,5,73,16,133,255
200 DATA133,249,138,134,45,74,168,169,15,144,2,105,224,133,46,185,60,3,133,38
210 DATA185,84,3,133,39,160,1,132,44,177,2,145,254,240,79,16,93,169,0,164,44
220 DATA145,254,136,81,38,37,46,81,38,145,38,164,44,200,192,41,208,224,165,2
230 DATA133,0,165,3,133,1,165,4,133,2,133,254,24,105,42,133,4,165,5,73,16
240 DATA133,255,73,16,133,3,105,0,133,5,166,45,232,224,48,208,159,44,0,192
250 DATA48,3,76,144,67,44,16,192,44,81,192,96,198,8,208,190,169,101,133,8,169
260 DATA68,208,169,169,153,208,165,198,6,208,14,198,7,208,10,169,23,133,6,169
270 DATA39,133,7,208,234,177,0,17,4,136,17,0,17,2,17,4,200,200,17,0,17,2,17,4
280 DATA48,213,16,137,41</syntaxhighlight>
==={{header|BASIC256}}===
[[File:Forest fire BASIC-256.gif|right|thumb|Forest fire animation: p=0.03, p/f=1000]]
<
dim f(N+2,M+2) # 1 tree, 0 empty, 2 fire
Line 1,169 ⟶ 1,191:
next y
next x
end while</
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<
OFF
Line 1,208 ⟶ 1,230:
NEXT x%
old&() = new&()
UNTIL FALSE</
Output:
<p>
[[File:Forestbbc.gif|200px]]
==={{header|Commodore BASIC}}===
{{trans|6502 Assembly}}
With the keyword CALL changed to SYS, the [[Forest_fire#Applesoft_BASIC|Applesoft BASIC]] code works in Commodore BASIC.
<syntaxhighlight lang="gwbasic"> 100 FOR I = 17239 TO 17493
110 READ B
120 POKE I,B
130 NEXT
140 SYS 17239
150 END
160 DATA162,23,138,32,71,248,165,38,157,60,3,165,39,157,84,3,202,16,239,162,96
170 DATA134,249,134,1,160,0,132,0,152,145,0,200,208,251,232,134,1,224,128,208
180 DATA244,44,86,192,44,82,192,44,84,192,44,80,192,32,50,248,162,0,134,0,169
190 DATA41,133,2,133,254,169,83,133,4,165,249,133,1,133,3,133,5,73,16,133,255
200 DATA133,249,138,134,45,74,168,169,15,144,2,105,224,133,46,185,60,3,133,38
210 DATA185,84,3,133,39,160,1,132,44,177,2,145,254,240,79,16,93,169,0,164,44
220 DATA145,254,136,81,38,37,46,81,38,145,38,164,44,200,192,41,208,224,165,2
230 DATA133,0,165,3,133,1,165,4,133,2,133,254,24,105,42,133,4,165,5,73,16
240 DATA133,255,73,16,133,3,105,0,133,5,166,45,232,224,48,208,159,44,0,192
250 DATA48,3,76,144,67,44,16,192,44,81,192,96,198,8,208,190,169,101,133,8,169
260 DATA68,208,169,169,153,208,165,198,6,208,14,198,7,208,10,169,23,133,6,169
270 DATA39,133,7,208,234,177,0,17,4,136,17,0,17,2,17,4,200,200,17,0,17,2,17,4
280 DATA48,213,16,137,41</syntaxhighlight>
==={{header|FreeBASIC}}===
<
'written for FreeBASIC
'Program code based on BASIC256 from Rosettacode website
Line 1,321 ⟶ 1,366:
Print " You entered ESC - goodbye "
Print " Press any key to exit "
Sleep</
==={{header|GFA Basic}}===
<
width%=80
height%=50
Line 1,464 ⟶ 1,509:
CLOSEW 1
RETURN
</syntaxhighlight>
==={{header|PureBasic}}===
<
; This may likely be due to the graphic driver used in the
; 2D-function Plot().
Line 1,633 ⟶ 1,678:
ForEver
EndIf
EndIf</
[[Image:Forest_Fire_in_PureBasic,_frame_300.png]]
==={{header|REALbasic}}===
This example puts all of the forestry logic into a Thread class. This allows the UI to remain responsive while the Thread does all the work in the background. We create a Thread by subclassing the Thread object in the IDE, in this case creating ''forestfire'' as a subclass of the Thread object and put the following code in its ''Run()'' event:
<
Sub Run()
//Handy named constants
Line 1,704 ⟶ 1,749:
Wend
End Sub
</syntaxhighlight>
As you can see, this Thread is expecting a Window object called Window1 with several other objects within it. The IDE will automatically create a Window object called Window1 when a new GUI application is created. Our Window1 has 5 objects (widgets) in it: a Canvas (for displaying graphics), three sliders, and a pushbutton.
<
Sub Open()
//First method to run on the creation of a new Window. We instantiate an instance of our forestFire thread and run it.
Line 1,718 ⟶ 1,763:
stop = True
End Sub
</syntaxhighlight>
[[Image:ForestFireRB.PNG]]
==={{header|Run BASIC}}===
<
dim preGen(200,200)
dim newGen(200,200)
Line 1,746 ⟶ 1,791:
next x
next gen
render #g</
[[File:ForestFire.png]]
Line 1,761 ⟶ 1,806:
(2) this program differs from most BASIC examples on Rosetta Code, but resembles most real BASIC programs of more than about 20 lines, in that the line numbers do not always go up smoothly in multiples of ten.
<
20 DIM N$(20,30)
30 LET INIT=.5
Line 1,832 ⟶ 1,877:
1030 LET I$=I$+CHR$ (128+CODE S$(K))
1040 NEXT K
1050 RETURN</
{{out}}
Screenshot [http://www.edmundgriffiths.com/zx81forest.jpg here].
Line 1,840 ⟶ 1,885:
This program sits behind a Windows form with fixed borders, the only component of which is a timer (named Timer1, set to something like 50 or 100ms depending on the speed the user wants to see it). Other constant values (the probabilities and the window dimensions) can be set at the top of the code.
<
Private _forest(,) As ForestState
Private _isBuilding As Boolean
Line 1,943 ⟶ 1,988:
Me.Text = "Gen " & _gen.ToString() & " @ " & (_gen / (_sw.ElapsedMilliseconds / 1000)).ToString("F02") & " FPS: Forest Fire"
End Sub
End Class</
==={{header|ZX Spectrum Basic}}===
Line 1,949 ⟶ 1,994:
A screenshot of the program running can be found [http://www.edmundgriffiths.com/spectrumforestfire.jpg here].
<
20 DIM n$(20,30)
30 LET init=.5
Line 2,004 ⟶ 2,049:
540 NEXT j
550 NEXT i
560 GO TO 260</
=={{header|Batch File}}==
Line 2,015 ⟶ 2,060:
</pre>
Default is <code> 10 50 5 5 </code>
<
@echo off
setlocal enabledelayedexpansion
Line 2,132 ⟶ 2,177:
)
exit /b
</syntaxhighlight>
{{out}}
'''Sample Default Output'''
Line 2,221 ⟶ 2,266:
{{libheader|SDL}}
<
#include <stdlib.h>
#include <stdint.h>
Line 2,468 ⟶ 2,513:
free(field[0]); free(field[1]);
exit(EXIT_SUCCESS);
}</
===Console version===
C99. Uncomment srand() for variaty, usleep() for slower speed.
<
#include <stdlib.h>
#include <unistd.h>
Line 2,536 ⟶ 2,581:
evolve(w, h);
}</
=={{header|C sharp|C#}}==
<
using System.Drawing;
using System.Drawing.Drawing2D;
Line 2,700 ⟶ 2,745:
}
}
}</
=={{header|C++}}==
[[File:ForestFireCpp.png|300px]]
<
#include <windows.h>
#include <string>
Line 2,985 ⟶ 3,030:
}
//--------------------------------------------------------------------------------------------------
</syntaxhighlight>
=={{header|Ceylon}}==
<
abstract class Cell() of tree | dirt | burning {}
Line 3,111 ⟶ 3,156:
forest.evolve();
}
}</
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">
(def burn-prob 0.1)
(def new-tree-prob 0.5)
Line 3,193 ⟶ 3,238:
(forest-fire)
</syntaxhighlight>
example output
Line 3,212 ⟶ 3,257:
=={{header|COBOL}}==
{{works with|OpenCOBOL}}
<
PROGRAM-ID. forest-fire.
Line 3,379 ⟶ 3,424:
COMPUTE rand-num =
FUNCTION MOD(FUNCTION RANDOM * 100000, 10000)
.</
=={{header|Common Lisp}}==
<
(defvar *prob-t* 0.5)
(defvar *prob-f* 0.1)
Line 3,455 ⟶ 3,500:
(progn (format t "~%------ Generation ~d ------~%" (1+ i))
(print-forest forest)))))
</syntaxhighlight>
Example results:
<
CL-USER>(simulate *forest* 5)
------ Initial forest ------
Line 3,531 ⟶ 3,576:
TTT TTT T
NIL
</syntaxhighlight>
=={{header|D}}==
===Textual Version===
<
enum treeProb = 0.55; // Original tree probability.
Line 3,588 ⟶ 3,633:
world.swap(nextWorld);
}
}</
{{out}}
<pre> T T T#TT T TT TT TTTT TT TTT T TT T# T T TT TT TTTTT
Line 3,629 ⟶ 3,674:
===Graphical Version===
{{libheader|simpledisplay}}
<
simpledisplay;
Line 3,696 ⟶ 3,741:
painter.drawImage(Point(0, 0), img);
});
}</
=={{header|Déjà Vu}}==
<
set :p 0.004
#chance of spontaneous tree combustion
Line 3,775 ⟶ 3,820:
step
run</
{{out}}
<pre>T.T.T...T..T..TT.T.T.
Line 3,815 ⟶ 3,860:
=={{header|EasyLang}}==
[https://easylang.
<syntaxhighlight lang="text">
p_fire = 0.00002
p_tree = 0.002
#
len
len p[] len f[]
background 100
clear
for r = 0 to
for c = 0 to 99
i = r * 102 + c + 104
if randomf < 0.5
f[i] = 1
.
.
timer 0
#
subr show
for r
for c
i = r * 102 + c +
h = f[i]
if h <> p[i]
move c + 0.5 r + 0.5
if h = 0
color
color 9 * 100 + (18 - 2 * h) * 10
circle 0.5
.
.
.
.
subr update
swap f[] p[]
for r
for c
i = r * 102 + c +
if p[i] = 0
f[i] = 0
if randomf <
f[i] = 1
.
elif p[i] =
f[i] =
s = p[i - 103] + p[i - 102] + p[i - 101]
s +=
f[i] =
f[i] = p[i] - 1
.
.
.
on timer
timer 0.2
.
</syntaxhighlight>
=={{header|Emacs Lisp}}==
<
;; -*- lexical-binding: t -*-
;; run: ./forest-fire forest-fire.config
Line 3,982 ⟶ 4,032:
(simulate-forest (elt command-line-args-left 0))
</syntaxhighlight>
The configuration file controls the simulation.
<
(cols . 45)
(time . 100)
Line 3,991 ⟶ 4,041:
(f . 0.001) ;; probability tree ignites
(p . 0.01) ;; probability empty space fills with a tree
(tree . 0.5)) ;; initial probability of tree in a new world</
{{out}}
Line 4,110 ⟶ 4,160:
Not even text graphics. Notice the use of random:seed/1 when creating a tree. Without it all calls to random:uniform/1 gave the same result for each tree.
<syntaxhighlight lang="erlang">
-module( forest_fire ).
Line 4,183 ⟶ 4,233:
tree_init( Tree_probalility, Random ) when Tree_probalility > Random -> tree;
tree_init( _Tree_probalility, _Random ) -> empty.
</syntaxhighlight>
{{out}}
Line 4,266 ⟶ 4,316:
{burning,{5,5}}]
</pre>
=={{header|Evaldraw}}==
[[File:Evaldrawforest.gif|right|thumb|Forest fire animation]]
Creates a 256x256 pixel forest, try adjusting the probability for ignite, spread, sprout and max neighbors.
<syntaxhighlight lang="c">
enum{XSIZ=255, YSIZ=XSIZ} // size of forest
enum{EMPTY=0, TREE=1, BURN=2} // possible states of a cell
static prob_ignite = .000001; // very rare, but remember we have many trees.
static prob_spread = .25; // Fire spread speed/probability if neighbor on fire
static prob_sprout = 0.25; // probability of new tree to sprout
static MAX_NEIGHBORS = 6; // tree refuses to sprout if overcrowded
static forest[2][YSIZ][XSIZ]; // state of pixel
static fuel[2][YSIZ][XSIZ]; // stores fuel (wood) 0-255
static heat[2][YSIZ][XSIZ]; // tree refuses to spout if heat!=0, also, sets draw color.
static arr_numburn[YSIZ][XSIZ]; // number of burning trees for this cell
static arr_numtree[YSIZ][XSIZ]; // number of neighbor trees for this cell
static xoff[8] = {-1,+0,+1,-1,/*NA*/1,-1,+0,+1}; // offsets to find 8-connected neighbors
static yoff[8] = {-1,-1,-1,+0,/*NA*/0,+1,+1,+1};
() { // Main in evaldraw scripts is a unnamed function.
static otim;
tim = klock(); // Time since program start in seconds.
dt=tim-otim; // Deltatime. 1/dt is FPS. 0 in first frame.
otim=tim; // store old time for next dt.
simulate(); // simulate and draw are coupled, since draw also ping-pongs state.
draw();
setcol(0); fillrect(0,YSIZ,XSIZ,15);
setcol(0xffffff); moveto(0,YSIZ); printf("%4.0ffps generation %5.0f", 1 /dt, numframes);
if (bstatus>0) setFire(mousx,mousy);
}// end main
draw() {
for(y=0; y<YSIZ; y++)
for(x=0; x<XSIZ; x++)
{
cell = forest[1][y][x];
if (cell == EMPTY) setcol(0);
else if(cell==BURN) setcol(511-.25*fuel[0][y][x],255-3*heat[0][y][x],33);
else if(cell==TREE) setcol(0,64+fuel[0][y][x],0);
setpix(x,y);
// Transfer next simulation state into current ready for next frame
forest[0][y][x] = forest[1][y][x];
heat[0][y][x] = heat[1][y][x];
fuel[0][y][x] = fuel[1][y][x];
// Count neighbors burning and not
numburn = 0; numtree = 0;
for(n=0; n<8; n++) {
ypos=y+yoff[n];
xpos=x+xoff[n];
if (xpos<0 || xpos > XSIZ-1)continue;
if (ypos<0 || ypos > YSIZ-1)continue;
cell = forest[1][ypos][xpos];
if (cell==BURN) numburn++;
else if (cell==TREE) numtree++;
}
arr_numburn[y][x] = numburn;
arr_numtree[y][x] = numtree;
}
}
fillrect(x0,y0,w,h) {
x0=int(x0); y0=int(y0); w=int(w) + 1; h=int(h);
for(y=y0;y<=y0+h;y++) { moveto(x0,y); lineto(x0+w,y); }
}
simulate() {
for(y=0; y<YSIZ; y++)
for(x=0; x<XSIZ; x++) {
cell = forest[0][y][x];
cellfuel = fuel[0][y][x];
celltemp = heat[0][y][x];
rand=rnd;
numburn = arr_numburn[y][x];
numtree = arr_numtree[y][x];
if (cell == BURN) {
if (cellfuel <= 0) {
forest[1][y][x] = EMPTY;
}
else {
fuel[1][y][x] = cellfuel - 1;
heat[1][y][x] = celltemp + 1;
}
}
else if (cell == TREE) {
if (numburn == 0 && rand < prob_ignite) setFire(x,y);
else if (numburn > 0 && rand < prob_spread) setFire(x,y);
else if(cellfuel < 255) fuel[1][y][x] = cellfuel + 1;
}
else if (cell == EMPTY) {
if ( celltemp > 0 ) heat[1][y][x] = celltemp - 1;
else if (numburn==0 && rand < prob_sprout && numtree <= MAX_NEIGHBORS) setTree(x,y);
}
}
} // end sim
setFire(x,y) {
forest[1][y][x] = BURN;
}
setTree(x,y) {
forest[1][y][x] = TREE;
}
</syntaxhighlight>
=={{header|F_Sharp|F#}}==
This implementation can be compiled or run in the interactive F# shell.
<
open System.Diagnostics
open System.Drawing
Line 4,358 ⟶ 4,517:
[<EntryPoint>]
let main args = ForestFire.main args
#endif</
[[File:ForestFire-FSharp.png]]
=={{header|Factor}}==
{{works with|Factor|0.99 Development version 2019-07-10}}
<
math.vectors prettyprint random raylib.ffi sequences ;
IN: rosetta-code.forest-fire
Line 4,447 ⟶ 4,606:
end-drawing
next-forest
] until drop close-window</
{{out}}
[https://gfycat.com/boilingenviousboto]
Line 4,453 ⟶ 4,612:
=={{header|Forth}}==
{{works with|Gforth|0.7.3}}
<
30 CONSTANT HEIGHT
WIDTH HEIGHT * CONSTANT SIZE
Line 4,516 ⟶ 4,675:
DUP .FOREST \ print the current state
SWAP ; \ prepare for next iteration
: GO A B BEGIN (GO) AGAIN ;</
=={{header|Fortran}}==
{{works with|Fortran|95 and later}}
<
implicit none
Line 4,703 ⟶ 4,862:
end subroutine forestfire_print
end module ForestFireModel</
<
use ForestFireModel
implicit none
Line 4,722 ⟶ 4,881:
call forestfire_destroy(f)
end program ForestFireTest</
=={{header|Go}}==
Text. The program prints the configuration, waits for the Enter key, and prints the next. It makes a pretty good animation to just hold down the Enter key.
<
import (
Line 4,809 ⟶ 4,968:
}
}
}</
=={{header|Haskell}}==
<
import Data.List (tails, transpose)
import System.Random (randomRIO)
Line 4,870 ⟶ 5,029:
main :: IO ()
main = evolveForest 6 50 3</
{{Out}} Sample:
<pre>>>>>>> 1:
Line 4,897 ⟶ 5,056:
=={{header|Icon}} and {{header|Unicon}}==
[[File:Forestfire-Unicon.png|400px|thumb|right|Forest fire 400 x 400 rounds=500 p.initial=0.100000 p/f=0.010000/0.000200 fps=1.495256]]
<
$define EDGE 0
Line 4,969 ⟶ 5,128:
procedure probability(P) #: succeed with probability P
if ?0 <= P then return
end</
{{libheader|Icon Programming Library}}
Line 4,976 ⟶ 5,135:
=={{header|J}}==
<
dims =:10 10
Line 4,996 ⟶ 5,155:
smoutput ' #o' {~ forest=. step forest
end.
)</
Example use:
<
##### #
Line 5,019 ⟶ 5,178:
## # #
o #
o# # </
Note that I have used an artificially small grid here, and that I ran this several times until I could find one that had a fire from the start. Also, the current revision of this code does not show the starting state, though that would be easily changed.
Line 5,028 ⟶ 5,187:
=={{header|JAMES II/Rule-based Cellular Automata}}==
<
dimensions 2;
Line 5,044 ⟶ 5,203:
// a tree is hit by lightning with a change of f = 0.006 %
rule{TREE} [0.00006] : -> BURNING;</
The starting configuration cannot be given in the modeling language since the concepts of the ''model'' and its ''parameters'' (which includes the starting configuration) are separate in JAMES II.
Line 5,050 ⟶ 5,209:
{{works with|Java|1.5+}}
===Text===
<
import java.util.LinkedList;
import java.util.List;
Line 5,186 ⟶ 5,345:
processNPrint(land, 10);
}
}</
===Graphics===
See: [[Forest fire/Java/Graphics]]
=={{header|JavaScript}}
===JavaScript Node===
Functional approach using [https://lodash.com/ lodash]
<
const _ = require('lodash');
Line 5,262 ⟶ 5,423:
}, 20);
</syntaxhighlight>
===JavaScript===
<syntaxhighlight lang="javascript">var forest = {
X: 50,
Y: 50,
Line 5,326 ⟶ 5,490:
afterLoad(forest);
}, 100);
</syntaxhighlight>
To actually see it work we need a small demo page with HTML5 compliant code:
<
<html>
<head>
Line 5,344 ⟶ 5,508:
</body>
</html>
</syntaxhighlight>
The output is a (mostly fluent) animation of the area.
=={{header|Julia}}==
<
@enum State empty tree fire
Line 5,409 ⟶ 5,573:
end
evolution()</
{{out}}
Line 5,448 ⟶ 5,612:
=={{header|Lua}}==
This program uses the Lua Curses library for graphics, although changing the code to avoid such dependency is easy.
<syntaxhighlight lang="lua">
-- ForestFire automaton implementation
-- Rules: at each step:
Line 5,546 ⟶ 5,710:
socket.sleep(naptime)
until false
</syntaxhighlight>
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Mathematica is good at working with cellular automata -- especially 2-color 1-dimensional cellular automata. The automaton function is awkward yet very powerful. This code implements a 3-color 2-dimensional cellular automaton with 9-cell neighbourhoods using a custom cell evolution function. There is probably a rule number specification that can replace the custom evolution function and make this simpler and faster. But this works well enough. The last line of code plots the state of the forest after the 300th step.
<
evolve[nbhd_List, k_] := 2 /; nbhd[[2, 2]] == 1 && Max@nbhd == 2 (*near_burning&nonempty->burning*)
evolve[nbhd_List, k_] := RandomChoice[{f, 1 - f} -> {2, nbhd[[2, 2]]}] /; nbhd[[2, 2]] == 1 && Max@nbhd < 2 (*spontaneously combusting tree*)
Line 5,558 ⟶ 5,722:
r = 100; c = 100; p = 10^-2; f = 10^-4;
init = RandomInteger[BernoulliDistribution[0.05], {r, c}];
MatrixPlot[CellularAutomaton[{evolve, {}, {1, 1}}, {init, 0}, {{{300}}}], ColorRules -> {0 -> White, 1 -> Green, 2 -> Red}, Frame -> False]</
[[File:ForestFire-Mathematica.png]]
=={{header|MATLAB}} / {{header|Octave}}==
<
% Forest fire
if nargin<4;
Line 5,590 ⟶ 5,754:
G = G + (F==3); % empty after burn
F = G;
end; </
=={{header|Nim}}==
{{trans|C}}
<
randomize()
type State {.pure.} = enum Empty, Tree, Fire
const
proc chance(prob: float): bool {.inline.} =
# Set the size
var w, h: int
if paramCount() >= 2:
w =
h =
if w <= 0: w = 30
if h <= 0: h = 30
iterator fields(a = (0, 0), b = (h-1, w-1)): tuple[y, x: int] =
## Iterate over fields in the universe
for y in max(a[0], 0) .. min(b[0], h-1):
for x in max(a[1], 0) .. min(b[1], w-1):
yield (y, x)
# Initialize
var univ, univNew = newSeqWith(h, newSeq[State]
while true:
# Show.
stdout.write "\e[H"
for y, x in fields():
stdout.write
if x == 0: stdout.write "\e[E"
stdout.flushFile
# Evolve.
for y, x in fields():
case univ[y][x]
of Fire:
univNew[y][x] = Empty
of Empty:
if chance
of Tree:
for y1, x1 in fields((y-1, x-1), (y+1, x+1)):
if univ[y1][x1] == Fire:
break
if chance(BurnProb): univNew[y][x] = Fire
univ = univNew
sleep 200</
=={{header|OCaml}}==
Line 5,656 ⟶ 5,818:
This example uses a curses display (with the [http://www.nongnu.org/ocaml-tmk/ ocaml-curses] bindings).
<
let ignite_prob = 0.02
Line 5,728 ⟶ 5,890:
Unix.sleep 1;
done;
endwin()</
You can execute this script with:
Line 5,734 ⟶ 5,896:
=={{header|Ol}}==
<
(import (lib gl))
(import (otus random!))
Line 5,787 ⟶ 5,949:
(glEnd)
(gl:set-userdata step))))
</syntaxhighlight>
=={{header|PARI/GP}}==
<
my(m=matsize(M)[1],n=matsize(M)[2]);
matrix(m,n,i,j,
Line 5,814 ⟶ 5,976:
while(1,print(M=step(M,p,f)))
};
burn(5,.1,.03)</
=={{header|Perl}}==
Requires terminal that understands ANSI escape sequences:<
use 5.10.0;
Line 5,880 ⟶ 6,042:
}
forest while (1);</
===Alternate Perl Solution===
<syntaxhighlight lang="perl">use strict;
use warnings;
use feature 'bitwise';
my $p = 0.01; # probability of empty -> tree
Line 5,899 ⟶ 6,060:
print "\e[H", $forest =~ tr/0123/ ^#/r, "\n"; # ^=tree #=burning tree
my $n = $forest =~ tr/123/004/r; # 4=a neighbor is burning
$forest |.= 0 x $_ . $n |. substr $n, $_ for 1, $wide - 1 .. $wide + 1;
$forest &.= $mask;
$forest =~ tr/1-7/et10e31/; # step to next generation
$forest =~ s/t/ rand() < $f ? 3 : 2 /ge; # rule 3) tree cell to burning
$forest =~ s/e/ rand() < $p ? 2 : 1 /ge; # rule 4) empty cell to tree
select undef, undef, undef, 0.1; # comment out for full speed
}</
=={{header|Phix}}==
{{libheader|Phix/pGUI}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Forest_fire.exw
-- ============================
--
-- A burning cell turns into an empty cell
-- A tree will burn if at least one neighbor is burning
-- A tree ignites with probability F even if no neighbor is burning
-- An empty space fills with a tree with probability P
--
-- Draws bigger "pixels" when it feels the need to.
--</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hTimer</span>
<span style="color: #004080;">cdCanvas</span> <span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">TITLE</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Forest Fire"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">P</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0.03</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- probability of new tree growing</span>
<span style="color: #000000;">F</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0.00003</span> <span style="color: #000080;font-style:italic;">-- probability of new fire starting</span>
<span style="color: #008080;">enum</span> <span style="color: #000000;">EMPTY</span><span style="color: #0000FF;">,</span><span style="color: #000000;">TREE</span><span style="color: #0000FF;">,</span><span style="color: #000000;">FIRE</span> <span style="color: #000080;font-style:italic;">-- (1,2,3)</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">colours</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #004600;">CD_BLACK</span><span style="color: #0000FF;">,</span><span style="color: #004600;">CD_GREEN</span><span style="color: #0000FF;">,</span><span style="color: #004600;">CD_YELLOW</span><span style="color: #0000FF;">}</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> <span style="color: #000080;font-style:italic;">-- the forest</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">randomf</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1000000</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">1000000</span> <span style="color: #000080;font-style:italic;">-- returns 0.000001..1.000000</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">redraw_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">width</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetIntInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DRAWSIZE"</span><span style="color: #0000FF;">),</span>
<span style="color: #000080;font-style:italic;">-- limit to 40K cells, otherwise it gets too slow.
-- n here is the cell size
-- Note you
-- in js even with the limit
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">ceil</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">width</span><span style="color: #0000FF;">*</span><span style="color: #000000;">height</span><span style="color: #0000FF;">/</span><span style="color: #000000;">40000</span><span style="color: #0000FF;">)),</span>
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">width</span><span style="color: #0000FF;">/</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (see cx below)</span>
<span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">height</span><span style="color: #0000FF;">/</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">2</span>
<span style="color: #7060A8;">cdCanvasActivate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">w</span>
<span style="color: #008080;">or</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])!=</span><span style="color: #000000;">h</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_rand</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">h</span><span style="color: #0000FF;">),</span><span style="color: #000000;">w</span><span style="color: #0000FF;">))</span> <span style="color: #000080;font-style:italic;">-- (EMPTY or TREE)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--
-- There is a "dead border" of 1 cell all around the edge of f (& fn) which
-- we never display or update. If we have got this right/an exact fit, then
-- w*n should be exactly 2n too wide, whereas in the worst case there is an
-- (2n-1) pixel border, which we split between left and right, ditto cy.
--</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">cx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">width</span><span style="color: #0000FF;">-</span><span style="color: #000000;">w</span><span style="color: #0000FF;">*</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">cy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">+</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">height</span><span style="color: #0000FF;">-</span><span style="color: #000000;">h</span><span style="color: #0000FF;">*</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">h</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">fnxy</span>
<span style="color: #008080;">switch</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">case</span> <span style="color: #000000;">EMPTY</span><span style="color: #0000FF;">:</span>
<span style="color: #000000;">fnxy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">EMPTY</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">randomf</span><span style="color: #0000FF;">()<</span><span style="color: #000000;">P</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (EMPTY or TREE)</span>
<span style="color: #008080;">case</span> <span style="color: #000000;">TREE</span><span style="color: #0000FF;">:</span>
<span style="color: #000000;">fnxy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">TREE</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span>
<span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span> <span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">randomf</span><span style="color: #0000FF;">()<</span><span style="color: #000000;">F</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span> <span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span>
<span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">or</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">FIRE</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">fnxy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">FIRE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">case</span> <span style="color: #000000;">FIRE</span><span style="color: #0000FF;">:</span>
<span style="color: #000000;">fnxy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">EMPTY</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
<span style="color: #000000;">fn</span><span style="color: #0000FF;">[</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fnxy</span>
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">colours</span><span style="color: #0000FF;">[</span><span style="color: #000000;">fnxy</span><span style="color: #0000FF;">])</span>
<span style="color: #7060A8;">cdCanvasBox</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cy</span><span style="color: #0000FF;">+</span><span style="color: #000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cy</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">n</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">cx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">n</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fn</span>
<span style="color: #7060A8;">cdCanvasFlush</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">map_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cdcanvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_IUP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cddbuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_DBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupUpdate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_IGNORE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">canvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupCanvas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"RASTERSIZE=225x100"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallbacks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"MAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"map_cb"</span><span style="color: #0000FF;">),</span>
<span style="color: #008000;">"ACTION"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"redraw_cb"</span><span style="color: #0000FF;">)})</span>
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">`TITLE="%s", MINSIZE=245x140`</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">TITLE</span><span style="color: #0000FF;">})</span>
<span style="color: #000080;font-style:italic;">-- (above MINSIZE prevents the title from getting squished)</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">hTimer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (10 fps)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
=={{header|PHP}}==
<
define('WIDTH', 10);
Line 6,110 ⟶ 6,294:
return rand(0, 100) < $prob;
}
</syntaxhighlight>
=={{header|PicoLisp}}==
<
(scl 3)
Line 6,155 ⟶ 6,339:
(put This @ T)
(=: burn)
(=: tree) ) ) ) ) ) )</
Use:
<pre>(forestFire 26 0.5 0.01 0.001)</pre>
=={{header|PostScript}}==
<
%%BoundingBox: 0 0 400 400
Line 6,223 ⟶ 6,407:
1000 { drawforest showpage iter } repeat
%%EOF</
=={{header|Python}}==
Just hit return to advance the simulation, or enter an integer to advance that integer amount of 'frames'.
Entering 'p' will print the grid, and 'q' will quit. A summary of the grids status is printed before each prompt for input.
<
Forest-Fire Cellular automation
See: http://en.wikipedia.org/wiki/Forest-fire_model
Line 6,310 ⟶ 6,494:
break
grid = gnew(grid)
iter +=1</
'''Sample output'''
Line 6,370 ⟶ 6,554:
=={{header|Racket}}==
<
(require 2htdp/universe)
(require 2htdp/image)
Line 6,429 ⟶ 6,613:
[to-draw render-forest]))
(forest-fire 0 1/8 1/1024 50)</
I'll tweak with the parameters for a bit, and when I have some nice
Line 6,440 ⟶ 6,624:
{{works with|rakudo|2015-10-04}}
This version saves a lot of looking around by using four states instead of three; the <tt>Heating</tt> state does a lookahead to track trees that are being heated up by burning trees, so we only ever have to traverse the neighbors of burning trees, not all trees. Also, by only checking the list of burning trees, we can avoid copying the entire forest each iteration, since real forests are mutable.
<syntaxhighlight lang="raku"
# make sure we clear colors at the end
END print $CLEAR;
enum Cell-State <Empty Tree Heating Burning>;
Line 6,510 ⟶ 6,696:
$forest.step;
}
}</
===SDL2 Animation===
An alternate version implemented in SDL2.
<syntaxhighlight lang="raku"
use SDL2::Raw;
Line 6,641 ⟶ 6,827:
}
$fps
}</
=={{header|REXX}}==
Line 6,660 ⟶ 6,846:
└───────────────────────────────────────────────────────────────────┘
</pre>
<
parse value scrSize() with sd sw . /*the size of the terminal display. */
parse arg generations birth lightning rSeed . /*obtain the optional arguments from CL*/
Line 6,709 ⟶ 6,895:
return random(1, field) <= lightning /*lightning ignition*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
p: return word(arg(1), 1) /*pick─a─word: first or second word.*/</
This REXX program makes use of '''scrSize''' REXX program (or BIF) which is used to determine the screen size of the terminal (console).
<br>The '''SCRSIZE.REX''' REXX program is included here ──► [[SCRSIZE.REX]]. <br><br>
Line 6,772 ⟶ 6,958:
=={{header|Ring}}==
<
# Project : Forest fire
Line 6,857 ⟶ 7,043:
label1 { setpicture(p1) show() }
return
</syntaxhighlight>
Output:
Line 6,863 ⟶ 7,049:
=={{header|Ruby}}==
<
Neighborhood = [-1,0,1].product([-1,0,1]) - [0,0]
States = {empty:" ", tree:"T", fire:"#"}
Line 6,906 ⟶ 7,092:
forest.evolve
forest.display
end</
Sample Output:
<pre style="height:64ex;overflow:scroll">
Line 7,025 ⟶ 7,211:
{{libheader|rand}}
{{libheader|ansi_term}}
<
extern crate ansi_term;
Line 7,183 ⟶ 7,369:
write!(writer, "{}", String::from_utf8_lossy(&output.stdout)).unwrap();
}
</syntaxhighlight>
=={{header|Sather}}==
<
private attr fields:ARRAY{ARRAY{INT}};
private attr swapu:INT;
Line 7,381 ⟶ 7,567:
end;
end;</
=={{header|Scala}}==
<
class Forest(matrix:Array[Array[Char]]){
Line 7,411 ⟶ 7,597:
val EMPTY='.'
def apply(x:Int=30, y:Int=15)=new Forest(Array.tabulate(y, x)((y,x)=> if (Random.nextDouble<0.5) TREE else EMPTY))
}</
<
def main(args: Array[String]): Unit = {
var l=Forest()
Line 7,421 ⟶ 7,607:
}
}
}</
Sample output:
<pre>.T..TTT.TT .T..TTT.TT TT..TTT.TT TT..TTTTTT TT..TTTTTT
Line 7,436 ⟶ 7,622:
=={{header|Sidef}}==
{{trans|Perl}}
<
define h = `tput lines`.to_i-1
define r = "\033[H"
Line 7,496 ⟶ 7,682:
}
loop { init_forest() }</
{{trans|Raku}}
OO approach:
<
define YELLOW = "\e[1;33m"
define GREEN = "\e[1;32m"
Line 7,571 ⟶ 7,757:
forest.show
forest.step
}</
=={{header|Tcl}}==
<
# Build a grid
Line 7,651 ⟶ 7,837:
printGrid
if {[gets stdin line] < 0} break
}</
Sample output:
<pre>
Line 7,702 ⟶ 7,888:
=={{header|uBasic/4tH}}==
It's a small forest, since it's a small interpreter.
<syntaxhighlight lang="text">B = 1 ' A burning tree
E = 16 ' An empty space
T = 256 ' A living tree
Line 7,808 ⟶ 7,994:
Next ' Try next row
Return (T) ' No burning trees found</
{{out}}
<pre> @ @ @ @
Line 7,845 ⟶ 8,031:
Note: In order to display the graphics characters correctly, use DOS (OEM) font such as "Terminal".
<
#2 = 60 // width of the grid
#3 = 2 // probability of random fire, per 1000
Line 7,919 ⟶ 8,105:
#93 = 0x7fffffff % 48271
#90 = (48271 * (#90 % #92) - #93 * (#90 / #92)) & 0x7fffffff
return ((#90 & 0xffff) * #91 / 0x10000)</
Sample output, 10th generation:
Line 7,951 ⟶ 8,137:
--------------------------------------------------------------
</pre>
=={{header|V (Vlang)}}==
Text. The program prints the configuration, waits for enter key, and prints the next. It makes a pretty good animation to just hold down the enter key.
{{trans|go}}
<syntaxhighlight lang="v (vlang)">import rand
import strings
import os
const (
rows = 20
cols = 30
p = .01
f = .001
)
const rx = rows + 2
const cx = cols + 2
fn main() {
mut odd := []string{len: rx*cx}
mut even := []string{len: rx*cx}
for r := 1; r <= rows; r++ {
for c := 1; c <= cols; c++ {
if rand.intn(2) or {1} == 1 {
odd[r*cx+c] = 'T'
}
}
}
mut _ := ''
for {
print_row(odd)
step(mut even, odd)
_ = os.input('')
print_row(even)
step(mut odd, even)
_ = os.input('')
}
}
fn print_row(model []string) {
println(strings.repeat_string("__", cols))
println('')
for r := 1; r <= rows; r++ {
for c := 1; c <= cols; c++ {
if model[r*cx+c] == '0' {
print(" ")
} else {
print(" ${model[r*cx+c]}")
}
}
println('')
}
}
fn step(mut dst []string, src []string) {
for r := 1; r <= rows; r++ {
for c := 1; c <= cols; c++ {
x := r*cx + c
dst[x] = src[x]
match dst[x] {
'#' {
// rule 1. A burning cell turns into an empty cell
dst[x] = '0'
}
'T' {
// rule 2. A tree will burn if at least one neighbor is burning
if src[x-cx-1]=='#' || src[x-cx]=='#' || src[x-cx+1]=='#' ||
src[x-1] == '#' || src[x+1] == '#' ||
src[x+cx-1]=='#' || src[x+cx]=='#' || src[x+cx+1] == '#' {
dst[x] = '#'
// rule 3. A tree ignites with probability f
// even if no neighbor is burning
} else if rand.f64() < f {
dst[x] = '#'
}
}
else {
// rule 4. An empty space fills with a tree with probability p
if rand.f64() < p {
dst[x] = 'T'
}
}
}
}
}
}</syntaxhighlight>
=={{header|Wren}}==
{{trans|Go}}
<syntaxhighlight lang="wren">import "random" for Random
import "io" for Stdin
var rand = Random.new()
var rows = 20
var cols = 30
var p = 0.01
var f = 0.001
var rx = rows + 2
var cx = cols + 2
var step = Fn.new { |dst, src|
for (r in 1..rows) {
for (c in 1..cols) {
var x = r*cx + c
dst[x] = src[x]
if (dst[x] == "#") {
// rule 1. A burning cell turns into an empty cell
dst[x] = " "
} else if(dst[x] == "T") {
// rule 2. A tree will burn if at least one neighbor is burning
if (src[x-cx-1] == "#" || src[x-cx] == "#" || src[x-cx+1] == "#" ||
src[x-1] == "#" || src[x+1] == "#" ||
src[x+cx-1] == "#" || src[x+cx] == "#" || src[x+cx+1] == "#") {
dst[x] = "#"
// rule 3. A tree ignites with probability f
// even if no neighbor is burning
} else if (rand.float() < f) {
dst[x] = "#"
}
} else {
// rule 4. An empty space fills with a tree with probability p
if (rand.float() < p) dst[x] = "T"
}
}
}
}
var print = Fn.new { |model|
System.print("__" * cols)
System.print()
for (r in 1..rows) {
for (c in 1..cols) System.write(" %(model[r*cx+c])")
System.print()
}
}
var odd = List.filled(rx*cx, " ")
var even = List.filled(rx*cx, " ")
for (r in 1 ..rows) {
for (c in 1..cols) {
if (rand.int(2) == 1) odd[r*cx+c] = "T"
}
}
while (true) {
print.call(odd)
step.call(even, odd)
Stdin.readLine()
print.call(even)
step.call(odd, even)
Stdin.readLine()
}</syntaxhighlight>
|