[comp.sys.amiga] Sample HodgePodge program.

jms@antares.UUCP (joe smith) (08/17/88)

After reading the August issue of Scientific American, I had to try writing
a version of HodgePodge just to see it work.  The following is a quick
hack in AmigaBasic, based on the instructions found in the "Computer
Recreations" section.  (If anyone has the full details of this program,
please mail them to me.  I was working from the "brief recipe", and had
to make certain assumptions to get it to work.)

' HodgePodge - as described in Aug-88 Scientific American.
' as interpreted by Joe Smith from the cursory description
' in the "Computer Recreations" section (pages 104-106)
DEFINT a-z
wid=30 : hit=20 :' width & height of board
siz=8 :' size of each square on board
n=100 : k1=2 : k2=3 :' parameters 
PRINT "HodgePodge using N=100, K1=2, K2=3"
INPUT "Enter a number from 1 to 10 for G :";g

DIM b1(wid,hit),b2(wid,hit) :'before and after boards

SCREEN 1,320,200,5,1 :' lores, 32 colors
WINDOW 2,"HodgePodge  G ="+STR$(g),(0,0)-(311,180),0,1
WINDOW OUTPUT 2
GOSUB randomscreen           

looptop:
FOR j=1 TO hit-1
 FOR i=1 TO wid-1
  b=0  : a=0
  IF b1(i-1,j) = n THEN b=b+1
  IF b1(i+1,j) = n THEN b=b+1
  IF b1(i,j-1) = n THEN b=b+1
  IF b1(i,j+1) = n THEN b=b+1
  IF b1(i,j) > 0 THEN a=a+1
  IF b1(i-1,j) > 0 THEN a=a+1
  IF b1(i+1,j) > 0 THEN a=a+1
  IF b1(i,j-1) > 0 THEN a=a+1     
  IF b1(i,j+1) > 0 THEN a=a+1
  s=b1(i-1,j)+b1(i+1,j)+b1(i,j-1)+b1(i,j+1)+b1(i,j)

'"a" is the number of infected cells (including ill ones).
'"b" is the number of ill cells.
'"s" is the sum of states of cells in von Neumann neighborhood.
  
  IF b1(i,j) < 1 THEN b2(i,j) = INT(a/k1)+INT(b/k2) :'healthy->infected
  IF b1(i,j) > 0 THEN b2(i,j) = INT(s/a)+g       :'infected gets sicker
  IF b1(i,j) = n THEN b2(i,j) = 0                :'ill -> healthy
  IF b2(i,j) > n THEN b2(i,j) = n                :'limit on infection
  CALL drawdot(i,j,b2(i,j))                      :'X,Y,COLOR
 NEXT i
NEXT j

sick=0 : ill=0
FOR j=1 TO hit-1                        :'j=0 and j=hit are borders
 FOR i=1 TO wid-1                       :'as are i=0 and i=wid
  b1(i,j)=b2(i,j)                       :' copy new results to board
  IF b1(i,j) = n THEN ill = ill + 1
  IF b1(i,j) > 0 AND b1(i,j) < n THEN sick = sick + 1
 NEXT i  
NEXT j

gens = gens + 1
GOSUB stats                             :'Output sick, ill counts
GOTO looptop

initpalette:
 PALETTE 0,0!,0!,0!  'Black = healthy
 PALETTE 1,0!,1!,0!  'Green
 PALETTE 2,.2,1!,0!
 PALETTE 3,.4,1!,0!
 PALETTE 4,.6,1!,0!
 PALETTE 5,.8,1!,0!
 PALETTE 6,1!,1!,0!  'Yellow
 PALETTE 7,1!,.8,0!
 PALETTE 8,1!,.6,0!
 PALETTE 9,1!,.4,0!
 PALETTE 10,1!,.2,0!
 PALETTE 11,1!,0!,0!  'Red
 PALETTE 12,1!,0!,.2
 PALETTE 13,1!,0!,.4
 PALETTE 14,1!,0!,.6
 PALETTE 15,1!,0!,.8
 PALETTE 16,1!,0!,1!  'Magenta
 PALETTE 17,.8,0!,1!
 PALETTE 18,.6,0!,1!
 PALETTE 19,.4,0!,1!
 PALETTE 20,.2,0!,1!
 PALETTE 21,0!,0!,1!  'Blue
 PALETTE 22,0!,.2,1!
 PALETTE 23,0!,.4,1!
 PALETTE 24,0!,.6,1!
 PALETTE 25,0!,.8,1!
 PALETTE 26,0!,1!,1!  'Cyan
 PALETTE 27,.2,1!,1!
 PALETTE 28,.4,1!,1!
 PALETTE 29,.6,1!,1!
 PALETTE 30,.8,1!,1!
 PALETTE 31,1!,1!,1!  'White = ill
RETURN

randomscreen:
 GOSUB initpalette
 FOR i=0 TO 31             :'draw sample color bar
  LINE (i*siz,(hit+1)*siz)-STEP(siz-1,siz-1),i,bf
 NEXT i
 LINE (siz/2,siz/2)-(wid*siz+siz/2,hit*siz+siz/2),16,b
 
 sick=0 : ill=0 : gens=0
 FOR j=1 TO hit-1
  FOR i=1 TO wid-1
   b1(i,j)=INT(RND*n)
   CALL drawdot(i,j,b1(i,j))
   IF (b1(i,j) > 0) THEN sick=sick+1
  NEXT i
 NEXT j
LOCATE 1,32 : PRINT "Healthy"
LOCATE 3,32 : PRINT "Ill"
LOCATE 5,32 : PRINT "Infected"
LOCATE 7,32 : PRINT "Generation"
GOSUB stats
RETURN

stats:
LOCATE 2,32 : PRINT (wid-1)*(hit-1) - (sick+ill)
LOCATE 4,32 : PRINT ill
LOCATE 6,32 : PRINT sick
LOCATE 8,32 : PRINT gens
RETURN

SUB drawdot(i,j,col) STATIC
 SHARED n,siz
 'Only healthy cells show up a color=0 (black).
 'Only ill cells show up as color=31 (white).
 'The remaining 30 colors are mean infected.
 'if col=0, c=0    : if col=1, c=1
 'if col=n-1, c=30 : if col=n, c=31
 c = INT((col*30 + n-1 - 30)/(n-1))
 LINE (i*siz,j*siz)-STEP(siz-1,siz-1),c,bf
END SUB