!***********************************!
!                                   !
!             LIFE4A.BAS            !
!        Conway's Game of Life      !
!    Implemented under AlphaBASIC   !
!          By Trygve Lode           !
!                                   !
!-----------------------------------!
!                                   !
!          Modified 8/8/85          !
!          By Brad Horine           !
!   To allow inputting the 'seed'   !
!         pattern from disk         !
!                                   !
!***********************************!

       MAP1 FILENAME$,S,24
       MAP1 A(20),S,40
       MAP1 XXX,X,5000
       MAP1 XXX1,X,5000
       MAP1 ADJ(20,40),F,6,@XXX
       MAP1 ADJ1(20,40),F,6,@XXX1
       MAP1 ADJI(40,8),F,6
       MAP1 ADJJ(20,8),F,6
       MAP1 RC(20),F,6
       MAP1 RC1(20),F,6

INIT:  ? TAB(-1,0);"Initializing....Please wait.";
       FOR I = 1 TO 40
         ADJI(I,1)=I-1
         ADJI(I,2)=I
         ADJI(I,3)=I+1
         ADJI(I,4)=I+1
         ADJI(I,5)=I+1
         ADJI(I,6)=I
         ADJI(I,7)=I-1
         ADJI(I,8)=I-1
       NEXT I
       ADJI(1,1)=40
       ADJI(40,3)=1
       ADJI(40,4)=1
       ADJI(40,5)=1
       ADJI(1,7)=40
       ADJI(1,8)=40

       FOR J = 1 TO 20
         ADJJ(J,1)=J-1
         ADJJ(J,2)=J-1
         ADJJ(J,3)=J-1
         ADJJ(J,4)=J
         ADJJ(J,5)=J+1
         ADJJ(J,6)=J+1
         ADJJ(J,7)=J+1
         ADJJ(J,8)=J
         RC(J)=1
       NEXT J
       ADJJ(1,1)=20
       ADJJ(1,2)=20
       ADJJ(1,3)=20
       ADJJ(20,5)=1
       ADJJ(20,6)=1
       ADJJ(20,7)=1

       FOR J = 1 TO 20
         A(J)="                                         "
       NEXT J
       FOR I = 1 TO 40
         FOR J = 1 TO 20
           ADJ(J,I)=0
         NEXT J
       NEXT I
       GEN = 0
       POP = 0
       BIRTHS = 0
       DEATHS = 0
       PRINT TAB(-1,0);
       FIRSTCOL = 1
       LASTCOL  = 40
       FIRSTROW = 1
       LASTROW  = 20

SCREEN: PRINT TAB(-1,11);
       FOR I = 1 TO 20
           PRINT TAB(I+1,1); "|";
           PRINT TAB(1,I+1); "-";
           PRINT TAB(1,I+21); "-";
           PRINT TAB(I+1,42); "|";
           PRINT TAB(22,I+1); "-";
           PRINT TAB(22,I+21); "-";
           NEXT I
       PRINT TAB(1,1); "+"; TAB(1,42); "+";
       PRINT TAB(22,1); "+"; TAB(22,42); "+";
       PRINT TAB(-1,12);
       PRINT TAB(3,52); "==  LIFE  ==";

ENTRY:  PRINT TAB(5,50); "Enter name of file containing";
       PRINT TAB(7,50); "'seed' pattern   "; TAB(-1,9);
       INPUT LINE FILENAME$
       IF FILENAME$ = "END" THEN PRINT : END

       LOOKUP FILENAME$, FOUND
       IF FOUND<=0 THEN PRINT TAB(9,50); "File not found!"; CHR(7); &
               TAB(10,50); "Hit RETURN to retry ";: INPUT LINE XX$:  &
               PRINT TAB(9,50); TAB(-1,9); TAB(10,50); TAB(-1,9);:  &
               GOTO ENTRY

       OPEN #1, FILENAME$, INPUT
       FOR FN = 1 TO 20
         INPUT LINE #1, A(FN)
         IF EOF(1) THEN FN=30
       NEXT FN
       CLOSE #1

       FOR I = 1 TO 40
         FOR J = 1 TO 20
           IF A(J)[I,I]=" " THEN GOTO Z1
             POP = POP + 1
             ADJ(ADJJ(J,1),ADJI(I,1)) = ADJ(ADJJ(J,1),ADJI(I,1))+1
             ADJ(ADJJ(J,2),ADJI(I,2)) = ADJ(ADJJ(J,2),ADJI(I,2))+1
             ADJ(ADJJ(J,3),ADJI(I,3)) = ADJ(ADJJ(J,3),ADJI(I,3))+1
             ADJ(ADJJ(J,4),ADJI(I,4)) = ADJ(ADJJ(J,4),ADJI(I,4))+1
             ADJ(ADJJ(J,5),ADJI(I,5)) = ADJ(ADJJ(J,5),ADJI(I,5))+1
             ADJ(ADJJ(J,6),ADJI(I,6)) = ADJ(ADJJ(J,6),ADJI(I,6))+1
             ADJ(ADJJ(J,7),ADJI(I,7)) = ADJ(ADJJ(J,7),ADJI(I,7))+1
             ADJ(ADJJ(J,8),ADJI(I,8)) = ADJ(ADJJ(J,8),ADJI(I,8))+1
Z1:       NEXT J
       NEXT I
       ?TAB(-1,29);
       BIRTHS = POP
       XXX1=XXX

       ?TAB(5,50);"Generation"; TAB(-1,9); TAB(7,50);"Population"; TAB(-1,9);
       ?TAB(9,50);"                    ";
       ?TAB(15,50);"Births";TAB(17,50);"Deaths";



DISPLAY:
       FOR J = 1 TO 20:?TAB(J+1,2);A(J);:NEXT J
       ?TAB(5,63);GEN;TAB(7,63);POP;"    ";
       ?TAB(15,59);BIRTHS;"    ";TAB(17,59);DEATHS;"    ";
       IF POP=0 THEN ?TAB(9,54);"ALL DEAD";TAB(-1,28):END
       IF BIRTHS+DEATHS=0 THEN ?TAB(9,54);"STABILIZED";TAB(-1,28);: END

NEWGEN:
       GEN=GEN+1
       DEATHS=0
       BIRTHS=0
       FOR J=1 TO 20 : RC1(J) = RC(J) : RC(J)=0 : NEXT J
       FOR J = 1 TO 20
         IF RC1(J)=0 THEN GOTO Z4
         FOR I = 1 TO 40
           IF A(J)[I,I] = " " THEN GOTO Z2
           IF (ADJ1(J,I) = 2) OR (ADJ1(J,I) = 3) THEN GOTO Z3
             POP = POP - 1
             DEATHS = DEATHS + 1
             A(J)[I,I] = " "
             ADJ(ADJJ(J,1),ADJI(I,1)) = ADJ(ADJJ(J,1),ADJI(I,1))-1
             ADJ(ADJJ(J,2),ADJI(I,2)) = ADJ(ADJJ(J,2),ADJI(I,2))-1
             ADJ(ADJJ(J,3),ADJI(I,3)) = ADJ(ADJJ(J,3),ADJI(I,3))-1
             ADJ(ADJJ(J,4),ADJI(I,4)) = ADJ(ADJJ(J,4),ADJI(I,4))-1
             ADJ(ADJJ(J,5),ADJI(I,5)) = ADJ(ADJJ(J,5),ADJI(I,5))-1
             ADJ(ADJJ(J,6),ADJI(I,6)) = ADJ(ADJJ(J,6),ADJI(I,6))-1
             ADJ(ADJJ(J,7),ADJI(I,7)) = ADJ(ADJJ(J,7),ADJI(I,7))-1
             ADJ(ADJJ(J,8),ADJI(I,8)) = ADJ(ADJJ(J,8),ADJI(I,8))-1
             RC(ADJJ(J,2)) = 1
             RC(J)=1
             RC(ADJJ(J,6)) = 1
             GOTO Z3
Z2:         IF ADJ1(J,I) <> 3 THEN GOTO Z3
             POP = POP + 1
             BIRTHS = BIRTHS + 1
             A(J)[I,I] = "*"
             ADJ(ADJJ(J,1),ADJI(I,1)) = ADJ(ADJJ(J,1),ADJI(I,1))+1
             ADJ(ADJJ(J,2),ADJI(I,2)) = ADJ(ADJJ(J,2),ADJI(I,2))+1
             ADJ(ADJJ(J,3),ADJI(I,3)) = ADJ(ADJJ(J,3),ADJI(I,3))+1
             ADJ(ADJJ(J,4),ADJI(I,4)) = ADJ(ADJJ(J,4),ADJI(I,4))+1
             ADJ(ADJJ(J,5),ADJI(I,5)) = ADJ(ADJJ(J,5),ADJI(I,5))+1
             ADJ(ADJJ(J,6),ADJI(I,6)) = ADJ(ADJJ(J,6),ADJI(I,6))+1
             ADJ(ADJJ(J,7),ADJI(I,7)) = ADJ(ADJJ(J,7),ADJI(I,7))+1
             ADJ(ADJJ(J,8),ADJI(I,8)) = ADJ(ADJJ(J,8),ADJI(I,8))+1
             RC(ADJJ(J,2)) = 1
             RC(J)=1
             RC(ADJJ(J,6)) = 1
Z3:       NEXT I
Z4:     NEXT J
       XXX1=XXX
       GOTO DISPLAY

END