This implements in Liberty Basic the cellular automaton I first met published in August 1988 Scientific American, in an A K Dewdney article. This was at the time when the game of Life was also being popularised.
In a grid (here I use 100x100) each cell takes values from 0 ( 'uninfected') to say 100 ( 'ill')
Each cell has a 'neighbourhood' of either four orthogonally ( Von Neumann) , or 8, including diagonal neighbours ( Moore).
At each 'tick' of time, the rules are that
My only problem is that I am using a dll to convert bmp to gif (it's free for amateur use) and it pops up a nag screen each time it is called.
nomainwin
WindowWidth = 385
WindowHeight = 480
UpperLeftX =int( ( DisplayWidth -WindowWidth) /2)
UpperLeftY =int( ( DisplayHeight -WindowHeight) /2)
graphicbox #w.graphicbox1, 130, 52, 100, 100
graphicbox #w.graphicbox2, 30, 160, 300, 100
textbox #w.tb1, 110, 10, 140, 30
button #w.exit, "Exit", [quit], LR, 30, 10
statictext #w.st1, "", 110, 320, 300, 40
dim display( 100, 100), scratch( 100, 100)
global i
states =255
g =150 'infectivity constant
k1 = 2 'first constant
k2 = 1
open "Hodgepodge cellular automaton" for window as #w
#w, "trapclose [quit]"
#w.graphicbox1, "down; fill white; flush"
#w.graphicbox2, "down; fill white; flush ; size 1"
#w, "font ms_sans_serif 12"
for x =0 to 99
for y =0 to 99
scan
v =int( states *rnd(1)) 'Seed with values 0... 255
display( x, y) =v
next y
next x
for i =0 to 300
#w.tb1, "Elapsed time ="; i +1
#w.st1, "g =";g; ", k1 ="; k1; ", k2 ="; k2
scan
'Display current states
healthy =0
for x =0 to 99
for y =0 to 99
v =int( display( x, y) /states *255)
if v =0 then healthy =healthy +1
#w.graphicbox1, "color "; v; " 0 "; 255 -v
#w.graphicbox1, "set "; x; " "; y
scan
next y
next x
#w.graphicbox1, "discard"
#w.graphicbox2, "goto "; i; " "; 100 *healthy /10000
#w.graphicbox2, "flush"
'Create new states in scratch
for x =0 to 99
for y =0 to 99
scan
scratch( x, y) =0
nbors =0 '# of neighbouring infection
nsick =0 '# of sick neighbours
if display( x, y) >0 then ' infected cell continues to sicken
for dx =-1 to 1 ' step 2 for Moore rather than Von Neumann neighbourhood
for dy =-1 to 1 ' step 2
'Wrapround
nx =x +dx 'coords of neighbour's x and y
ny =y +dy
if nx > 99 then nx = 0
if nx < 0 then nx = 99
if ny > 99 then ny = 0
if ny < 0 then ny = 99
lv =display( nx, ny)
if lv >0 then nsick =nsick +1
if ( dx <>0) and ( dy <>0) then nbors =nbors +lv ' ignore self
next dy
next dx
scratch( x, y) =int( nbors/ nsick) +g
if scratch( x, y) >=255 then scratch( x, y) = 255
if scratch( x, y) < 0 then scratch( x, y) = 0
end if
if display( x, y) =0 then 'Not yet infected
nill =0
ninf =0
for dx =-1 to 1
for dy =-1 to 1
'Wrapround
nx =x +dx
ny =y +dy
if nx > 99 then nx = 0
if nx < 0 then nx = 99
if ny > 99 then ny = 0
if ny < 0 then ny = 99
lv =display( nx, ny)
if lv =255 then nill =nill +1
if lv>0 and lv <255 then ninf =ninf +1
next dy
next dx
scratch( x, y) =int( ninf /k1 +nill /k2)
if scratch( x, y) >=255 then scratch( x, y) = 255
if scratch( x, y) < 0 then scratch( x, y) = 0
end if
next y
next x
'Copy scratch into display. If fully ill ( =255) then cure ( =0)
for x =0 to 99
for y =0 to 99
scan
if scratch( x, y) <255 then display( x, y) =scratch( x, y) else display( x, y) =0
next y
next x
#w.graphicbox1, "flush"
call savegif ""
next i
wait
sub savegif h$
#w.graphicbox1 "getbmp drawing 1, 1, 100, 100" ' This is where I convert them to gif
ver$ ="v" +str$( i)
bmpsave "drawing", "R:\HodgePodge" +ver$ +".bmp" ' via a (then deleted) bmp.
a$ ="R:\HodgePodge" +ver$ +".bmp"
b$ ="R:\HodgePodge" +ver$ +".gif"
' ** NB I use RamDisk- change as you wish.
open "re_imageconv" for dll as #d
calldll #d, "ConvertImageToGif",_
a$ as ptr,_
b$ as ptr,_
result as long
close #d
kill a$
end sub
[quit]
close #w
end