DataMuseum.dk

Presents historical artifacts from the history of:

MIKADOS

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about MIKADOS

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦ee1a9e024⟧

    Length: 7616 (0x1dc0)
    Notes: Mikados TextFile, Mikados_K
    Names: »LIFE«

Derivation

└─⟦ec8c1e0b0⟧ Bits:30007442 8" floppy ( MIKPROG vol. 1-3, MIKREL vol. 1-3, PCSE 4.7.80 vol 1-3, GL.SYS )
    └─ ⟦this⟧ »LIFE« 

Text

PROGRAM LIFE;
 
               (***************************************)
               (*                                     *)
               (*     G A M E   O F   L I F E         *)
               (*                                     *)
               (***************************************)
 
CONST
   ON      = 9;        (* LIVING CELL SIGN *)
   MAXROW  = 22;
   MAXROW1 = 23;
   MAXCOL  = 40;
   MAXCOL1 = 41;
 
TYPE
   STATE       = (DEAD,STABLE,STABLE2,GROWING);
   NEIGHBORS   = 0 .. 17;   (* 0 TO 8 = DEAD CELL *)
                            (* 9 = CELL ALIVE WITH NO NEIGBORS *)
                            (* 10 - 17 = CELL ALIVE WITH NEIGBORS *)
   COLINDEX    = 0 .. MAXCOL1;
   ROWINDEX    = 0 .. MAXROW1;
   BOARD       = PACKED ARRAY( ROWINDEX,COLINDEX ) OF NEIGHBORS;
  
VAR
   BOARDSTATE  : STATE;
   ACTBOARD    : BOARD;
   SAVBOARD    : BOARD;
   SAV2BOARD   : BOARD;
   GENERATION  : INTEGER;
   ALIVECOUNT  : INTEGER;
   OUTCOUNT    : INTEGER;
  
                       (* C L E A R B O A R D *)
 
PROCEDURE CLEARBOARD(VAR B: BOARD);
VAR ROW,COL: INTEGER;
BEGIN
   FOR ROW := 0 TO MAXROW1 DO
       FOR COL := 0 TO MAXCOL1 DO
           B( ROW,COL ) := 0;
END (*CLEARBOARD*);
  
                       (* S E T C E L L *)
 
PROCEDURE SETCELL(VAR B: BOARD; ROW: ROWINDEX; COL: COLINDEX) ;
BEGIN
   B( ROW-1,COL-1 ) := B( ROW-1,COL-1 ) + 1;
   B( ROW-1,COL   ) := B( ROW-1,COL   ) + 1;
   B( ROW-1,COL+1 ) := B( ROW-1,COL+1 ) + 1;
   B( ROW  ,COL-1 ) := B( ROW  ,COL-1 ) + 1;
   B( ROW  ,COL   ) := B( ROW  ,COL   ) + ON;
   B( ROW  ,COL+1 ) := B( ROW  ,COL+1 ) + 1;
   B( ROW+1,COL-1 ) := B( ROW+1,COL-1 ) + 1;
   B( ROW+1,COL   ) := B( ROW+1,COL   ) + 1;
   B( ROW+1,COL+1 ) := B( ROW+1,COL+1 ) + 1;
 
   ALIVECOUNT         := ALIVECOUNT+1;
END (* SETCELL *);
  
                       (* R E M O V E C E L L *)
 
PROCEDURE REMOVECELL(VAR B: BOARD; ROW: ROWINDEX; COL: COLINDEX);
BEGIN
   B( ROW-1,COL-1 ) := B( ROW-1,COL-1 ) - 1;
   B( ROW-1,COL   ) := B( ROW-1,COL   ) - 1;
   B( ROW-1,COL+1 ) := B( ROW-1,COL+1 ) - 1;
   B( ROW  ,COL-1 ) := B( ROW  ,COL-1 ) - 1;
   B( ROW  ,COL   ) := B( ROW  ,COL   ) - ON;
   B( ROW  ,COL+1 ) := B( ROW  ,COL+1 ) - 1;
   B( ROW+1,COL-1 ) := B( ROW+1,COL-1 ) - 1;
   B( ROW+1,COL   ) := B( ROW+1,COL   ) - 1;
   B( ROW+1,COL+1 ) := B( ROW+1,COL+1 ) - 1;
 
   ALIVECOUNT         := ALIVECOUNT-1;
END (* REMOVECELL *);
 
                       (* R E A D G E N E R A T I O N *)
 
PROCEDURE READGENERATION;
VAR TEST       : BOOLEAN;
    CH         : CHAR;
    ROW,ROWMIN,ROWMAX,ROW0 : ROWINDEX;
    COL,COLMIN,COLMAX,COL0 : COLINDEX;
BEGIN
   GENERATION := 0;
   ALIVECOUNT := 0;
   CLEARBOARD(ACTBOARD);
   SAVBOARD := ACTBOARD;
   SAV2BOARD := ACTBOARD;
   ROWMIN := MAXROW; ROWMAX := 0;
   COLMIN := MAXCOL; COLMAX := 0;
   ROW    := 0;
   TEST   := FALSE;
   WRITELN;
   WRITELN('****** GAME OF LIFE ******');
   WRITELN('PLEASE ENTER COLONY');
   WRITELN('NONBLANK INDICATES LIVING CELL, BLANK IS DEAD CELL');
   WRITELN('TERMINATE INPUT BY ENTERING BLANK LINE');
   WRITELN('TERMINATE GAME OF LIFE BY ENTERING   >.BR');
   WHILE (ROW < MAXROW) AND NOT TEST DO
   BEGIN
      READLN;
      TEST := EOLN;
      ROW  := ROW+1;
      COL  := 0;
      WHILE (COL < MAXCOL) AND NOT EOLN DO
      BEGIN
         COL := COL+1;
         READ(CH);
         IF CH <> ' ' THEN
         BEGIN
            SETCELL(SAVBOARD,ROW,COL);
            IF ROW < ROWMIN THEN ROWMIN := ROW;
            IF COL < COLMIN THEN COLMIN := COL;
            IF ROW > ROWMAX THEN ROWMAX := ROW;
            IF COL > COLMAX THEN COLMAX := COL;
         END;
      END;
   END;
   (* PUT THE FIGURE IN THE MIDDLE *)
   ROW0 := (MAXROW1-ROWMIN-ROWMAX) DIV 2;
   COL0 := (MAXCOL1-COLMIN-COLMAX) DIV 2;
   FOR ROW := ROWMIN-1 TO ROWMAX+1 DO
      FOR COL := COLMIN-1 TO COLMAX+1 DO
         ACTBOARD( ROW+ROW0,COL+COL0 ) := SAVBOARD( ROW,COL );
   CLEARBOARD(SAVBOARD);
END (* READGENERATION *);
  
                  (* C E L L O N *)
 
PROCEDURE CELLON(Y,X: INTEGER);
BEGIN
   GOTOXY( X+1, Y+3 );
   WRITE('*')
END (* CELLON *);
 
                       (* C E L L O F F *)
 
PROCEDURE CELLOFF(Y,X: INTEGER);
BEGIN
   GOTOXY( X+1,Y+3 );
   WRITE(' ')
END (* CELLOFF *);
  
                       (* N E X T G E N E R A T I O N *)
 
PROCEDURE NEXTGENERATION;
VAR ROW: ROWINDEX;
    COL: COLINDEX;
BEGIN
   GENERATION := GENERATION+1;
   SAV2BOARD  := SAVBOARD;
   SAVBOARD   := ACTBOARD;
   GOTOXY( 35, 1 );
   WRITE(GENERATION:3);
   OUTCOUNT   := 0;
   FOR ROW := 1 TO MAXROW DO
      FOR COL := 1 TO MAXCOL DO
         CASE SAVBOARD( ROW,COL ) OF
            3 : BEGIN
                   (* A NEW CELL IS BORN! *)
                   SETCELL(ACTBOARD,ROW,COL);
                   CELLON(ROW-1,(COL-1)*2);
                END;
            9,10,13,14,15,16,17 :
                BEGIN
                   (* A CELL DIES. IF 9 OR 10 FOR LONELINESS *)
                   (*        IF 13 TO 17 BECAUSE TOO CROWDED *)
                   REMOVECELL(ACTBOARD,ROW,COL);
                   CELLOFF(ROW-1,(COL-1)*2);
                END;
         END (* CASE *);
END (* NEXTGENERATION *);
  
                       (* P R I N T G E N E R A T I O N *)
 
PROCEDURE PRINTGENERATION;
VAR ROW: ROWINDEX;
    COL: COLINDEX;
BEGIN
   OUTCOUNT := 0;
   FOR ROW := 1 TO MAXROW DO
      FOR COL := 1 TO MAXCOL DO
         IF ACTBOARD( ROW,COL ) > 8 THEN
            CELLON(ROW-1,(COL-1)*2);
END (* PRINTGENERATION *);
 
               (* M A I N *)
BEGIN
   READGENERATION;
   CLEARSCREEN;
   GOTOXY( 20, 1 );
   WRITELN('GENERATION NO.   0    GROWING');
   PRINTGENERATION;
   REPEAT
      NEXTGENERATION;
      IF EOF(OUTPUT) THEN
        BEGIN
          GOTOXY( 1, MAXROW );
          WRITELN('COLONY KILLED BY OPERATOR');
          EXIT(LIFE)
        END;
      IF ALIVECOUNT = 0 THEN
         BOARDSTATE := DEAD
      ELSE
         IF SAVBOARD = ACTBOARD THEN
            BOARDSTATE := STABLE
         ELSE
            IF SAV2BOARD = ACTBOARD THEN
               BOARDSTATE := STABLE2
            ELSE
               BOARDSTATE := GROWING;
   UNTIL (BOARDSTATE <> GROWING);
   IF BOARDSTATE = STABLE THEN
   BEGIN
     GOTOXY( 42, 1 );
     WRITELN('STABLE ');
   END
   ELSE
     IF BOARDSTATE = DEAD THEN
     BEGIN
       GOTOXY( 42, 1 );
       WRITELN('DEAD   ')
     END
     ELSE
        IF BOARDSTATE = STABLE2 THEN
        BEGIN
          GOTOXY( 42, 1 );
          WRITELN('STABLE OVER 2 GENERATIONS')
        END;
  GOTOXY( 1, MAXROW )
END (* MAIN *).