!***********************************! ! ! ! LIFE.BAS ! ! Conway's Game of Life ! ! Implemented under AlphaBASIC ! ! By David F. Pallmann ! ! ! !***********************************! !Subroutines required: VUE MAP1 A(20,40), S, 1 !source array MAP1 B(20,40), S, 1 !destination array MAP1 I, F, 6 !loop index MAP1 J, F, 6 !loop index MAP1 R, F, 6 !current row MAP1 C, F, 6 !current column MAP1 LR, F, 6 !low row MAP1 HR, F, 6 !high row MAP1 LC, F, 6 !low column MAP1 HC, F, 6 !high column MAP1 COUNT, B, 2 !life count MAP1 TEXT, S, 80 !text line MAP1 GEN, F, 6 !generation MAP1 TOTAL, F, 6 !total number of life units INIT: PRINT TAB(-1,0); FOR I = 1 TO 20 FOR J = 1 TO 40 B(I,J) = " " NEXT J NEXT I 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 pattern"; PRINT TAB(7,50); "Use VUE control chars"; PRINT TAB(9,50); "Hit ESCAPE when done"; XCALL VUE, B(1,1), 20, 40, 1, 1 GET2: PRINT TAB(5,50); TAB(-1,9); PRINT TAB(7,50); TAB(-1,9); PRINT TAB(9,50); TAB(-1,9); CORECT: FOR I = 1 TO 20 FOR J = 1 TO 40 IF B(I,J)="" THEN B(I,J) = " " IF B(I,J)<>" " THEN B(I,J) = "*" A(I,J) = B(I,J) NEXT J NEXT I DISPLAY: LR = 20 : HR = 0 LC = 40 : HC = 0 TOTAL = 0 FOR I = 1 TO 20 FOR J = 1 TO 40 IF B(I,J)="*" THEN TOTAL = TOTAL+1 : CALL WINDOW IF A(I,J)<>B(I,J) THEN PRINT TAB(I+1,J+1); B(I,J); PRINT TAB(I+1,J+1); B(I,J); A(I,J) = B(I,J) NEXT J NEXT I I = GEN+6 IF I>20 THEN I = I-15 PRINT TAB(I,45); IF TOTAL=0 THEN PRINT "** Colony Extinct **"; TAB(22,50); : END PRINT "Generation"; GEN; PRINT " Population"; TOTAL; GEN = GEN+1 GENERATE: FOR I = LR-1 TO HR+1 FOR J = LC-1 TO HC+1 IF I<1 OR I>20 THEN GOTO G'NEXT IF J<1 OR J>20 THEN GOTO G'NEXT CALL SCAN G'NEXT: NEXT J NEXT I GOTO DISPLAY SCAN: COUNT = 0 FOR R = I-1 TO I+1 FOR C = J-1 TO J+1 IF R<1 OR R>20 THEN GOTO NEXT IF C<1 OR C>40 THEN GOTO NEXT IF R=I AND C=J THEN GOTO NEXT IF A(R,C)<>" " THEN COUNT = COUNT+1 NEXT: NEXT C NEXT R B(I,J) = " " IF A(I,J)="*" AND COUNT>1 AND COUNT<4 THEN B(I,J) = "*" IF A(I,J)=" " AND COUNT=3 THEN B(I,J) = "*" RETURN WINDOW: IF IHR THEN HR = I IF JHC THEN HC = J RETURN END