62 lines
2.0 KiB
Julia
62 lines
2.0 KiB
Julia
using Printf
|
|
|
|
@enum State empty tree fire
|
|
|
|
|
|
function evolution(nepoch::Int=100, init::Matrix{State}=fill(tree, 30, 50))
|
|
# Single evolution
|
|
function evolve!(forest::Matrix{State}; f::Float64=0.12, p::Float64=0.5)
|
|
dir = [-1 -1; -1 0; -1 1; 0 -1; 0 1; 1 -1; 1 0; 1 1]
|
|
# A tree will burn if at least one neighbor is burning
|
|
for i in 1:size(forest, 1), j in 1:size(forest, 2)
|
|
for k in 1:size(dir, 1)
|
|
if checkbounds(Bool, forest, i + dir[k, 1], j + dir[k, 2]) &&
|
|
get(forest, i + dir[k, 1], j + dir[k, 2]) == fire
|
|
forest[i, j] = fire
|
|
break
|
|
end
|
|
end
|
|
end
|
|
for i in LinearIndices(forest)
|
|
# A burning cell turns into an empty cell
|
|
if forest[i] == fire forest[i] = empty end
|
|
# A tree ignites with probability f even if no neighbor is burning
|
|
if forest[i] == tree && rand() < f forest[i] = fire end
|
|
# An empty space fills with a tree with probability p
|
|
if forest[i] == empty && rand() < p forest[i] = tree end
|
|
end
|
|
end
|
|
|
|
# Print functions
|
|
function printforest(f::Matrix{State})
|
|
for i in 1:size(f, 1)
|
|
for j in 1:size(f, 2)
|
|
print(f[i, j] == empty ? ' ' : f[i, j] == tree ? '🌲' : '🔥')
|
|
end
|
|
println()
|
|
end
|
|
end
|
|
function printstats(f::Matrix{State})
|
|
tot = length(f)
|
|
nt = count(x -> x in (tree, fire), f)
|
|
nb = count(x -> x == fire, f)
|
|
@printf("\n%6i cell(s), %6i tree(s), %6i currently burning (%6.2f%%, %6.2f%%)\n",
|
|
tot, nt, nb, nt / tot * 100, nb / nt * 100)
|
|
end
|
|
|
|
# Main
|
|
printforest(init)
|
|
printstats(init)
|
|
for i in 1:nepoch
|
|
# println("\33[2J")
|
|
evolve!(init)
|
|
# printforest(init)
|
|
# printstats(init)
|
|
# sleep(1)
|
|
end
|
|
printforest(init)
|
|
printstats(init)
|
|
end
|
|
|
|
evolution()
|