ライフゲームを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; }