70 lines
2.4 KiB
Plaintext
70 lines
2.4 KiB
Plaintext
to wireworld :filename :speed ;speed in n times per second, approximated
|
|
Make "speed 60/:speed
|
|
wireworldread :filename
|
|
Make "bufferfield (mdarray (list :height :width) 0)
|
|
for [i 0 :height-1] [for [j 0 :width-1] [mdsetitem (list :i :j) :bufferfield mditem (list :i :j) :field]]
|
|
pu ht
|
|
Make "gen 0
|
|
while ["true] [ ;The user will have to halt it :P
|
|
;clean
|
|
seth 90
|
|
setxy 0 20
|
|
;label :gen
|
|
sety 0
|
|
for [i 0 :height-1] [for [j 0 :width-1] [mdsetitem (list :i :j) :field mditem (list :i :j) :bufferfield]]
|
|
for [i 0 :height-1] [
|
|
for [j 0 :width-1] [
|
|
if (mditem (list :i :j) :field)=[] [setpixel [255 255 255]] ;blank
|
|
if (mditem (list :i :j) :field)=1 [setpixel [0 0 0] if wn :j :i 2 [mdsetitem (list :i :j) :bufferfield 2]] ;wire
|
|
if (mditem (list :i :j) :field)=2 [setpixel [0 0 255] mdsetitem (list :i :j) :bufferfield 3] ;head
|
|
if (mditem (list :i :j) :field)=3 [setpixel [255 0 0] mdsetitem (list :i :j) :bufferfield 1] ;tail
|
|
setx xcor+1
|
|
]
|
|
setxy 0 ycor-1
|
|
]
|
|
Make "gen :gen+1
|
|
wait :speed
|
|
]
|
|
end
|
|
|
|
to wireworldread :filename
|
|
local [line]
|
|
openread :filename
|
|
setread :filename
|
|
Make "width 0
|
|
Make "height 0
|
|
; first pass, take dimensions
|
|
while [not eofp] [
|
|
Make "line readword
|
|
if (count :line)>:width [Make "width count :line]
|
|
Make "height :height+1
|
|
]
|
|
; second pass, load data
|
|
setreadpos 0
|
|
Make "field (mdarray (list :height :width) 0)
|
|
for [i 0 :height-1] [
|
|
Make "line readword
|
|
foreach :line [
|
|
if ?=char 32 [mdsetitem (list :i #-1) :field []]
|
|
if ?=". [mdsetitem (list :i #-1) :field 1]
|
|
if ?="H [mdsetitem (list :i #-1) :field 2]
|
|
if ?="t [mdsetitem (list :i #-1) :field 3]
|
|
]
|
|
]
|
|
setread []
|
|
close :filename
|
|
end
|
|
|
|
to wn :x :y :thing ;WireNeighbourhood
|
|
Make "neighbours 0
|
|
if (mditem (list :y-1 :x) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y-1 :x+1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y :x+1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y+1 :x+1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y+1 :x) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y+1 :x-1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y :x-1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
if (mditem (list :y-1 :x-1) :field)=:thing [Make "neighbours :neighbours+1]
|
|
ifelse OR :neighbours=1 :neighbours=2 [op "true] [op "false]
|
|
end
|