2015年7月24日金曜日

サンプル;ライフゲーム

ライフゲームについてはこちらを参照してください。「ゲーム」とありますが、シミュレーションです。
progloaderで「ライフゲーム」をダウンロードすると、
LigeGame.bas
が追加されます。

RUNするとまずは編集モードになるので、画面内にセルを配置してください。
セルは、任意の座標を直接タッチすることで配置または除去できます。


開始をタップすると実行されます。
基本的には永久に動き続けますが、全てがなくなると自動停止します。
途中で再編集も出来ます。
Wikipediaにあるようなサンプルも実行できますが、フィールドがあまり広くないことと、上下左右がつながってないので結果はちょっと違ってきます。その辺りは適当に改良してください。

このプログラムのオリジナルはOh!X1988年6月号のS-OS上のSLANG用ですが、元ネタはWikipediaにもある通り、別のところにあります。

以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。


// ライフゲーム
// Oh!X 1988-6
//

// 宣言

//WORK  $9888;  (≪ for MZ-88/1268 ≫)

  CONST XX=40-1, YY=25-1,
        X =XX-1, Y =YY-1;

   ARRAY BYTE A[YY][XX],
         BYTE B[YY][XX];

   VAR   GEN;
//
// メイン処理
//
MAIN()
   BEGIN
     WIDTH(48);
     intset();   // 初期画面SET
     PRINT("\C");       // 画面を消す

     FOR GEN=0 TO 100 [
        HYOUJ();  // 画面表示
        COPY();   // 配列コピー
        KOUTAI();  // 世代交代
        KEY();   // キー入力
      ]

   END;
//
//   画面表示
//
HYOUJ()
   VAR   I,J;
   BEGIN
     LOCATE(0,0);
     PRINT("GEN:",DECI$(GEN));

     FOR I=1 TO Y [
        LOCATE(1,I);
        FOR J=1 TO X [

           IF A[I][J]==FALSE [
              PRINT(" ");
           ]
           ELSE [
               PRINT("*");
           ]
         ]
       ]
    END;
 //
 // 配列コピー
 //
 COPY()
    VAR   I,J;

    BEGIN
      FOR I=1 TO Y [
         FOR J=1 TO X [
            B[I][J]=A[I][J];
          ]
       ]
    END;
 //
 // 世代交代
 //
 KOUTAI()
    VAR   I,J;

    BEGIN
       FOR I=1 TO Y [
         FOR J=1 TO X [
            CASE JOUTAI(I,J) [
               0,1 : A[I][J]=FALSE;
               2 : []
               3 : A[I][J]=TRUE;
               OTHERS: A[I][J]=FALSE;
            ]
          ]
       ]
    END;
 //
 // 状態
 //
 JOUTAI(I,J)
    BEGIN
    END(
         B[I-1][J-1]+B[I-1][J]+B[I-1][J+1]
        +B[I  ][J-1]       +B[I  ][J+1]
        +B[I+1][J-1]+B[I+1][J]+B[I+1][J+1]
    ) ;
 //
 //  初期画面SET
 //
 INTSET()
    VAR   I,J,KEY;


    CONST  MSG= [
      "START-[CR]  RESET-[SPC]  SET-[S]",0
    ];

    BEGIN
      PRINT( "\C" );
      LOCATE( 8, 8);  PRINT( MSX$(MSG) );
      LOCATE(16,13);

      WHILE TRUE [
         CASE (KEY=INKEY(1)) [
            $1B:        STOP()
            $0D:        EXIT;
            $21 TO $FF: PRINT("*");
            OTHERS:     PRINT(CHR$(KEY));
         ]
       1

      FOR I=0 TO YY [
         FOR J=0 TO XX [
            A[I][J]=FALSE;
         ]
       ]

      FOR I=1 TO Y [
         FOR J=1 TO X [
            IF SCREEN(J,I)=='*' [
               A[I][J]=TRUE;
            ]
         ]
       ]
   END;
 //
 // キー入力
 //
 KEY()
   BEGIN
      WHILE TRUE [
         CASE INKEY(0) [
 //      $00   : EXIT;
            $1B  : STOP();
                    : [
               BEEP();
               WHILE INKEY(1)==' ' []
            ]
            OTHERS: EXIT;
         ]
      ]
   END;
 //
 //END

0 件のコメント:

コメントを投稿