Online File

How to use this page


Rick Aster: Professional SAS Programming Shortcuts: Contents

Chapter 88
Program
Life


FILENAME LIFEINIT CATALOG 'WORK.LIFE.INIT.SOURCE';
DATA _NULL_;
   ARRAY L{1:16} $ 32;
   ARRAY NEW{1:16} $ 32 _TEMPORARY_;

   WINDOW Life ROWS=22 COLUMNS=35 IROW=2 ICOLUMN=10
       #1 L1 $CHAR32. PROTECT=YES
       #2 L2 $CHAR32. PROTECT=YES
       #3 L3 $CHAR32. PROTECT=YES
       #4 L4 $CHAR32. PROTECT=YES
       #5 L5 $CHAR32. PROTECT=YES
       #6 L6 $CHAR32. PROTECT=YES
       #7 L7 $CHAR32. PROTECT=YES
       #8 L8 $CHAR32. PROTECT=YES
       #9 L9 $CHAR32. PROTECT=YES
       #10 L10 $CHAR32. PROTECT=YES
       #11 L11 $CHAR32. PROTECT=YES
       #12 L12 $CHAR32. PROTECT=YES
       #13 L13 $CHAR32. PROTECT=YES
       #14 L14 $CHAR32. PROTECT=YES
       #15 L15 $CHAR32. PROTECT=YES
       #16 L16 $CHAR32. PROTECT=YES
       #17 'Life' COLOR=BLUE
       +5 'Time' COLOR=CYAN +1 TIME F4. COLOR=GREEN PROTECT=YES
       +5 'Live' COLOR=CYAN +1 LIVE F4. COLOR=GREEN PROTECT=YES
       ;

   * Read initial grid from file, converting any nonblank character to X;
   INFILE LIFEINIT TRUNCOVER;
   INPUT (L1-L16) ($CHAR32. /);
   DO Y = 1 TO 16;
      DO X = 1 TO 32;
         IF SUBSTR(L{Y}, X, 1) NE ' ' THEN SUBSTR(L{Y}, X, 1) = 'X';
         END;
      END;

   DO TIME = 0 TO 1000;
      * Count live cells.;
      LIVE = 0;
      DO Y = 1 TO 16;
         DO X = 1 TO 32;
            LIVE + SUBSTR(L{Y}, X, 1) = 'X';
            END;
        END;
      * Display grid and check for end of game. ;
      _MSG_ = 'Press Enter to continue.';
      IF STSTATE THEN _MSG_ = 'Steady state. Press Enter to finish.';
      IF LIVE = 0 THEN _MSG_ = 'Game over. Press Enter to finish.';
      DISPLAY LIFE;
      IF STSTATE OR LIVE = 0 THEN STOP;
      * Recalculate grid. ;
      DO Y = 1 TO 16;
         NEW{Y} = L{Y};
         DO X = 1 TO 32;
            LIVECELL = SUBSTR(L{Y}, X, 1) = 'X';
            * Count surrounding cells. ;
            COUNT = 0;
            DO DX = -1 TO 1;
               DO DY = -1 TO 1;
                  IF DX = 0 AND DY = 0 THEN CONTINUE;
                  IF 1 <= X + DX <= 32 AND 1 <= Y + DY <= 16 THEN 
                      COUNT = COUNT + (SUBSTR(L{Y + DY}, X + DX, 1) = 'X');
                  END;
               END;
            * Change state of cell. ;
            IF NOT LIVECELL AND COUNT = 3 THEN
                SUBSTR(NEW{Y}, X, 1) = 'X'; * New live cell;
            ELSE IF LIVECELL AND COUNT NOTIN (2, 3) THEN
                SUBSTR(NEW{Y}, X, 1) = ' '; * New dead cell;
            END;
         END;
      * Activate new grid and check for steady state.;
      STSTATE = 1;
      DO Y = 1 TO 16;
         IF NEW{Y} NE L{Y} THEN STSTATE = 0;
         L{Y} = NEW{Y};
         END;
      END;
   STOP;
RUN;

 O /\

Global
Statements

RICK ASTER

SAS

BOOKS

Tech | Dictionary

Download | Rastinate

Rick Aster

Professional SAS Programming Shortcuts

Contents/Online Files

Corrections

Catalog Page