1 REM WATOR VER 2.3 CIS VERSION 6/3/85 CHRON-FUNCTION KEY; OUTPUT FILE 2 REM DUMMY FILE ALLOWS COMPLETION OF RESULT FILE EVEN WITH MEMORY OVERFLOW 3 REM J HOLOVACS,74756,413 4 CLEAR 500 5 ON KEY GOSUB 800,1100 'PRINT GENERATION #;PREMATURE END 6 ON ERROR GOTO 900 8 DEFINT F,S,N:DIM FI(7,39),SH(7,39),FM(7,39),SM(7,39),ST(7,39):CH%=0 9 CLS:PRINT " * * * WATOR * * *":PRINT"The Ecological Laboratory Simulation" 10 PRINT:PRINT "Based on Scientific American":PRINT"Computer Recreations Column (12/84)" 11 PRINT " by A. K. Dewdney":PRINT:LINE INPUT"hit [enter] to proceed";R$:CLS 15 PRINT "Starting Parameters":INPUT "NO OF FISH";NF:INPUT "NO OF SHARKS";NS 20 INPUT "BREED TIME OF FISH";BF:INPUT "MAX AGE OF FISH";FX 25 INPUT "BREED TIME OF SHARKS";BS:INPUT "MAX AGE OF SHARKS";SX:INPUT "STARVE TIME OF SHARKS";ST! 26 CLS:PRINT "TO GRAPHICALLY SEE THE POPULATION CHANGE";:PRINT"SELECT CENSUS OUTPUT FILE OPTION" 27 PRINT:PRINT "RUN WATPLT.BA TO VIEW THS DATA" 28 PRINT:INPUT "DO YOU WANT CENSUS FILE (Y/N)";OF$:IF OF$="N" OR OF$="n" THEN OF$="N":GOTO 40 30 PRINT "MAX NO OF CHRONONS (years) FOR THIS":INPUT "EXPERIMENT";CX% 31 T$=TIME$ 32 OPEN "DUMMY" FOR OUTPUT AS 1:PRINT #1,SPACE$(250);SPACE$(250):CLOSE 'INCASE OF MEMORY OVERFLOW 33 INPUT "DESCRIPTOR FILE NAME";FD$:OPEN FD$ FOR OUTPUT AS 1:PRINT #1,"* * * WATOR * * *" 34 PRINT #1,"DESCRIPTOR FILE":INPUT "CENSUS RECORD FILE NAME";F$ 35 PRINT #1,"DATA FROM THIS RUN CAN BE FOUND IN:":PRINT #1,F$;".DO" 36 PRINT#1,"*BEGINNGING DATA:":PRINT #1,"NO OF FISH=";NF:PRINT #1,"NO OF SHARKS";NS:CLOSE 37 OPEN F$ FOR OUTPUT AS 1 40 CLS:PRINT"At any time during the experiment, you":PRINT "can Hit [F1] to display current CHRON #" 41 IF OF$<>"N" THENPRINT"hit [F2] to terminate prematurely":PRINT"(Wator will finish out the chronon)" 43 PRINT:PRINT "* * Please wait for Wator to evolve..." 45 FOR R=0 TO 7:FOR C=0 TO 39:FI(R,C)=-1:SH(R,C)=-1:FM(R,C)=-1:SM(R,C)=-1:ST(R,C)=-1:NEXT C,R:CLS 'initialize 50 REM SET UP RANDOM LOCATIONS 55 FOR Q=1 TO NF 'FISH LOCATIONS 60 LO=INT(RND(1)*320):GOSUB 100:IF FI(R,C)<>-1 THEN 60 63 FI(R,C)=INT(RND(1)*FX):RT=R:CT=C:GOSUB 150:NEXT Q 'SETS RANDOM AGE 65 FOR Q=1 TO NS 'SHARK LOCATIONS 68 LO=INT (RND(1)*320):GOSUB 100:IF SH(R,C)<>-1 OR FI(R,C)<>-1 THEN 68 70 SH(R,C)=INT(RND(1)*SX):RT=R:CT=C:GOSUB 160:NEXT Q 'SETS RANDOM AGES 75 KEY (1) ON:KEY (2) STOP 80 REM MAIN LOOP 81 IF RND(1)<.3 THEN GOSUB 700 'fish escapes 82 GOSUB 500:NS=0:NF=0:CH%=CH%+1 'RESET ARRAY 83 FOR R=0 TO 7:FOR C=0 TO 39 85 GOSUB 200 'FISH MOVE 88 GOSUB 300 'SHARK MOVE 95 NEXT C,R:IF OF$<>"N" THEN PRINT #1,CH%:PRINT #1,NS:PRINT #1,NF 96 KEY (2) ON:IF NS=0 OR NF=0 OR CH%=CX% THEN 1100 97 KEY (2) STOP:GOTO 80 100 REM CONVERT LO TO R,C 110 R=INT (LO/40):C=LO MOD 40:RETURN 120 REM CONVERT R,C TO LO 125 LO=R*40+C:RETURN 140 REM FISH DELETE AT R,C 145 FI(R,C)=-1:GOSUB 120:IF LO=319 THEN RETURN ELSE PRINT @LO," ";:RETURN 150 REM ADD FISH AT RT,CT 155 LO=RT*40+CT:IF LO=319 THEN RETURN ELSE PRINT @LO,CHR$(155);:RETURN 160 REM ADD SHARK 165 LO=RT*40+CT:IF LO=319 THEN RETURN ELSE PRINT @LO,CHR$(252);:RETURN 170 REM SHARK DELETE AT R,C 175 SH(R,C)=-1:ST(R,C)=-1:GOSUB 120:IF LO=319 THEN RETURN ELSE PRINT @LO," ";:RETURN 200 REM FISH MOVE 202 IF FI(R,C)=-1 OR FM(R,C)=0 THEN RETURN 'RETURN IF EMPTY OR PREV. MOVED 203 NF=NF+1 'COUNT FISH 204 IF FI(R,C)>=FX THEN GOSUB 140:RETURN 'FISH DIES 205 IF FI(RT,CT)MOD BF=0 THEN GOSUB 400 ELSE 209 'FIND LOC FOR OFFSPRING 206 IF NB=0 THEN 209 207 N=INT(RND(1)*NB)+1:RT=ER%(N):CT=EC%(N):FI(RT,CT)=0:GOSUB 150 'LOCATE OFFSPRING 209 FI(R,C)=FI(R,C)+1:GOSUB 400 'INC AGE;FIND BLANKS 210 IF NB=0 THEN 240 215 N=INT(RND(1)*NB)+1:RT=ER%(N):CT=EC%(N):FI(RT,CT)=FI(R,C)+1:GOSUB 140:GOSUB 150:FM(RT,CT)=0 'DELETE & ADD 240 RETURN 300 REM SHARK MOVE 302 IF SH(R,C)=-1 OR SM(R,C)=0 THEN RETURN 'RETURN IF EMPTY OR PREV MOVED 303 NS=NS+1 'COUNT SHARK 304 IF SH(R,C)>=SX OR ST(R,C)>=ST! THEN GOSUB 170:RETURN 'SHARK DIES 305 GOSUB 600 'FIND FOOD 310 IF NB=0 THEN ST(R,C)=ST(R,C)+1 ELSE ST(R,C)=0:GOTO 313 'INC STARVE TIME IF NO FOOD 311 GOSUB 400 IF NB=0 THEN 340 'FIND BLANKS IF NO FOOD;RETURN IF NO ROOM 313 N=INT(RND(1)*NB)+1:RT=ER%(N):CT=EC%(N):SH(RT,CT)=SH(R,C):GOSUB 140:GOSUB 160:SM(RT,CT)=0 314 ST(RT,CT)=ST(R,C):ST(R,C)=0:GOSUB 170: FI(RT,CT)=-1 'MOVE SHARK 315 IF SH(RT,CT)MOD BS<>0 OR SH(RT,CT)=ST(RT,CT) THEN 340 316 GOSUB 400:IF NB=0 THEN GOSUB 600 :IF NB=0 THEN 340 'FIND LOC FOR OFFSPRING; PREFERRABLY EMPTY 317 N=INT(RND(1)*NB)+1:RT=ER%(N):CT=EC%(N):SH(RT,CT)=0:SM(RT,CT)=0: GOSUB 160 'LOCATE OFFSPRING 340 SH(RT,CT)=SH(RT,CT)+1:RETURN 'INC AGE 400 REM FIND BLANKS ENTER WITH R,C RETURNS OPEN IN ARRAYS ER%,EC%,NB=NUMBER 410 NB=0:RESTORE 480 'COUNTER FOR BLANKS 420 FOR N=1 TO 8:READ RT,CT 425 RT=(R+RT)MOD 8:CT=(CT+C)MOD 40 430 IF FI(RT,CT)=-1 AND SH(RT,CT)=-1 THEN NB=NB+1:ER%(NB)=RT:EC%(NB)=CT 'SAVE EMPTY ROW&COL 435 NEXT N 440 RETURN 480 DATA 7,39,7,40,7,41,0,39,0,41,9,39,9,40,9,41 500 REM CLEAN UP MOVED RECORD 510 FOR R=0 TO 7:FOR C=0 TO 39 512 SM(R,C)=-1:FM(R,C)=-1 525 NEXT C,R 530 RETURN 600 REM FIND FOOD ENTER WITH R,C RETURNS OPEN IN ARRAYS ER%,EC%,NB=NUMBER 610 NB=0:RESTORE 480 'COUNTER FOR BLANKS 620 FOR N=1 TO 8:READ RT,CT 625 RT=(R+RT)MOD 8:CT=(CT+C)MOD 40 630 IF FI(RT,CT)<>-1 THEN NB=NB+1:ER%(NB)=RT:EC%(NB)=CT 'SAVE FOOD ROW&COL 635 NEXT N 640 RETURN 700 REM fish escapes 710 RT=INT(8*RND(1)):CT=INT(40*RND(1)) 720 IF FI(RT,CT)=-1 AND SH(RT,CT)=-1 THEN FI(RT,CT)=0:GOSUB 150 730 RETURN 800 REM GENERATION OUTPUT 810 PRINT @0,"CHRON ";CH%:RETURN 900 REM ERROR CLOSEOUT 905 IF OF$="N" THEN BEEP:PRINT @1,"Error=";ERR;" in line ";ERL:END ELSE CLOSE#1:GOSUB 1000 907 KILL "DUMMY.DO" 908 IF ERR<>7 THEN PRINT #1,"ERROR=";ERR,"LINE=";ERL 915 CLOSE:POWER OFF:END 1000 REM WRITE DESCRIPTOR FILE 1003 OPEN FD$ FOR APPEND AS 1 1005 PRINT #1,"BREED TIME OF FISH";BF:PRINT #1, "MAX AGE OF FISH";FX 1008 PRINT #1,"BREED TIME OF SHARKS";BS:PRINT #1,"STARVE TIME";ST!:PRINT #1, "MAX AGE OF SHARKS";SX 1010 PRINT#1,"*CLOSING DATA:":PRINT #1,"START TIME=";T$:PRINT #1,"END TIME=";TIME$ 1015 PRINT #1,"SHARK POPULATION=";NS:PRINT #1,"FISH POPULATION=";NF 1020 PRINT #1,"CHRONONS=";CH%:RETURN 1100 REM END ROUTINE (W/O ERROR) 1103 IF OF$="N" THEN END 1105 KILL "DUMMY.DO":CLOSE#1:GOSUB1000:CLOSE:END