By Thomas Watson, May 10, 2006
See [http://en.wikipedia.org/wiki/Cellular_automaton] for an explanation of cellular automata.
When the program prompts you for a number, try 18, 30, 99, 100
nomainwin
global rule
global wide : wide = 400
global high : high = 400
WindowWidth = wide + 2 : WindowHeight = high + 22
dim a(1000) 'current line
dim b(1000) 'next line
open "Cellular Automaton" for graphics_nsb_nf as #1
#1 "trapclose Quit"
#1 "down"
[again]
#1 "cls"
'set up an initial condition (fill in a(1) through a(wide) with bits 0 or 1):
for i = 1 to wide / 2 - 1
a(i) = 0
next
a(wide / 2) = 1
for i = wide / 2 + 1 to wide
a(i) = 0
next
'end initial condition setup
num = 18
prompt "Pick a number between 0 and 255"; num
if (num<0) or (num>255) then num = 18
rule = num
for j = 1 to high
scan
call DrawLine j
call BfromA
next j
#1 "flush"
confirm "Try again?"; answer$
if answer$ = "yes" then [again]
wait
Sub BfromA
for i = 1 to wide
index = a(i-1) * 4 + a(i) * 2 + a(i+1)
if (rule and (2 ^ index)) = 0 then
b(i) = 0
else
b(i) = 1
end if
next i
for i = 1 to wide
a(i) = b(i)
next i
end sub
Sub DrawLine lineY
for i = 1 to wide
if a(i) then #1 "set "; i - 1; " "; lineY - 1
next i
end sub
Sub Quit handle$
close #handle$
end
end sub