読者です 読者をやめる 読者になる 読者になる

ichirin2501's diary

いっちりーん。

ライフゲームをC言語で書いてみた

とりあえず、
ライフゲーム - Wikipedia


簡単なルール
 ・そのマスに生命体が存在し、周囲8マスに生命体が2体または3体存在するならば生存。
 ・そのマスに生命体が存在し、周囲8マスに生命体が1体以下または4体以上存在するならば死滅。
 ・そのマスに生命体が存在せず、周囲8マスに生命体が3体存在するならば誕生。


このルールは標準ライフゲームらしくて、23/3と表現するらしい。
存在するとき/しないとき = 2か3のとき生存/3のとき誕生。


書いたのはその 23/3 式のライフゲーム
エスケープシーケンスを使ってるから、Cygwin,Linux(未確認)上なら動くかな。
初期値は標準の疑似乱数を使ってるけど、正規乱数とかいう乱数を知ったのでそれを使ってみたい。
眠いからたぶんやらないけどw

とにかく見てて面白い。
40分以上も起動->固定->終了->起動〜を繰り返してたw

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 30

int main()
{
   int map[2][N+2][N+2];
   int i,j,turn,k,tmp;
   
   srand(time(NULL));
   memset(map,0,sizeof(map));
   for(i=1; i<=N; i++)
      for(j=1; j<=N; j++)
         map[0][i][j] = rand()%2;
   
   turn = 0;
   for(k=0;;k++)
   {
      printf("\033[2J");
      printf("k:%d\n",k);
      for(i=1; i<=N; i++){
         for(j=1; j<=N; j++)
            putchar(map[turn][i][j]?'+':' ');
         puts("");
      }
      puts("");
      sleep(1);
      
      for(i=1; i<=N; i++){
         for(j=1; j<=N; j++){
            tmp = map[turn][i+1>N?1:i+1][j          ] +
                  map[turn][i-1?:N     ][j          ] +
                  map[turn][i          ][j+1>N?1:j+1] +
                  map[turn][i          ][j-1?:N     ] +
                  map[turn][i+1>N?1:i+1][j+1>N?1:j+1] +
                  map[turn][i+1>N?1:i+1][j-1?:N     ] +
                  map[turn][i-1?:N     ][j+1>N?1:j+1] +
                  map[turn][i-1?:N     ][j-1?:N     ];
            if( map[turn][i][j] ){
               map[turn^1][i][j] = (tmp==2||tmp==3);
            }else{
               map[turn^1][i][j] = (tmp==3);
            }
         }
      }
      
      turn ^= 1;
   }
   
   return 0;
}