auuuw do I have to.. It's bad....and sloooow...
Code:
OPTION EXPLICIT
DECLARE FUNCTION getNumOfNeighbors(x AS INTEGER,y AS INTEGER)
DECLARE SUB drawWorld
DECLARE SUB checkRules
#define SCRWIDTH 320
#define SCRHEIGHT 200
#define ALIVE 1
#define DEAD 0
SCREENRES SCRWIDTH,SCRHEIGHT,32,2,1
DIM SHARED world(1 TO SCRWIDTH, 1 TO SCRHEIGHT) AS INTEGER
DIM SHARED AS INTEGER xlb, xub, yub, ylb, generation
DIM SHARED Birthrule AS STRING, StayRule AS STRING
DIM AS STRING press, rule
DIM AS INTEGER x,y,mouse_btns,mouse_x,mouse_y,tmp,f
DIM AS SINGLE t,delay
xub = UBOUND(world,1):xlb = LBOUND(world,1)
yub = UBOUND(world,2):ylb = LBOUND(world,2)
generation=1
delay=1
rule="23/3"
birthrule=right$(rule$,LEN(rule$)-INSTR(rule$,"/"))
stayrule=left$(rule$,INSTR(rule$,"/")-1)
SETMOUSE ,,0
SCREENSET 1, 0
DO
READ tmp
IF tmp=2 THEN y=y+1:x=0 ELSE IF tmp=3 THEN EXIT DO ELSE x=x+1:world(x+100,y+100)=tmp
LOOP
DATA 1,1,1,2,1,0,0,2,0,1,0,3
'############ 1=Cell is alive
'############ 2=end of line
'############ 3=stop reading
DO
t = TIMER
DO
press=inkey$
drawWorld
IF press="+" THEN delay=delay*2
IF press="-" THEN delay=delay/2
if press="q" then end
LOCATE 3,1: PRINT "Delay:";delay
FLIP
LOOP UNTIL TIMER-t>=delay
checkRules
LOOP
SUB checkRules
generation+=1
DIM AS INTEGER x, y, neighbors,i,okay
DIM tmpworld(xlb TO xub,ylb TO yub) AS INTEGER
FOR y = ylb+1 TO yub-1
FOR x = xlb+1 TO xub-1
neighbors=getNumOfNeighbors(x,y)
DO
FOR i = 1 TO LEN(birthrule)
IF neighbors=VAL(mid$(birthrule,i,1)) THEN tmpworld(x,y)=ALIVE:EXIT DO
NEXT i
FOR i = 1 TO LEN(stayrule)
IF neighbors=VAL(mid$(stayrule,i,1)) THEN tmpworld(x,y)=world(x,y):EXIT DO
NEXT i
tmpworld(x,y)=DEAD
EXIT DO
LOOP
NEXT x
NEXT y
FOR y = ylb TO yub
FOR x = xlb TO xub
world(x,y)=tmpworld(x,y)
NEXT x
NEXT y
END SUB
SUB drawWorld
DIM AS INTEGER x, y, i
FOR y = ylb TO yub
FOR x = xlb TO xub
IF world(x,y)=ALIVE THEN i=i+1: PSET(x,y),RGB(0,0,255):ELSE PSET(x,y),RGB(0,0,0)
NEXT x
NEXT y
LOCATE 1,1: PRINT "Generation:";generation
LOCATE 2,1: PRINT "Cells:";i
IF i=0 THEN PRINT "All life is dead!":SLEEP:END
END SUB
FUNCTION getNumOfNeighbors(x AS INTEGER, y AS INTEGER)
DIM neighbors AS INTEGER, i AS INTEGER
FOR i = 1 TO 8
SELECT CASE i
CASE 1
IF world(x-1,y-1)=ALIVE THEN neighbors=neighbors+1
CASE 2
IF world(x,y-1)=ALIVE THEN neighbors=neighbors+1
CASE 3
IF world(x+1,y-1)=ALIVE THEN neighbors=neighbors+1
CASE 4
IF world(x+1,y)=ALIVE THEN neighbors=neighbors+1
CASE 5
IF world(x+1,y+1)=ALIVE THEN neighbors=neighbors+1
CASE 6
IF world(x,y+1)=ALIVE THEN neighbors=neighbors+1
CASE 7
IF world(x-1,y+1)=ALIVE THEN neighbors=neighbors+1
CASE 8
IF world(x-1,y)=ALIVE THEN neighbors=neighbors+1
END SELECT
NEXT i
getNumOfNeighbors = neighbors
END FUNCTION