誕生:3つの生命体に囲まれた場所には生命が誕生して増える。(食べ物に余裕があると増える)
| ○ | ○ | ○ |
| ○ | ||
| ○ | ||
| ○ |
維持:2つか3つの生命体に囲まれた場所にいる生命体は生き残る。(食べ物が生命を維持出来るだけある)
| ○ | ○ | ○ |
| ○ | ||
| ○ | ||
| ○ | ||
| ○ |
| ○ | ○ | |
| ○ |
死滅:それ以外の生命体は死ぬ。(多すぎると食べ物が不足するし、少ないと繁殖できない)
| ○ | ○ | ○ |
| ○ | ○ | |
| ○ | ||
| ○ | ○ | |
生命のいるセルをo、いないセルをスペースで表しています。
0: /* ライフゲーム(1) k1101.c */
1: #include <stdio.h>
2: #include <string.h>
3: #define COLS0 41
4: #define COLS 40
5: #define LINES 20
6: char now[LINES][COLS0]=
7: {
8: " ",
9: " ",
10: " ",
11: " ",
12: " ooooo ",
13: " ",
14: " ",
15: " ",
16: " o ",
17: " o ",
18: " ooo ",
19: " oooooo ",
20: " oooooo ",
21: " oo ",
22: " ",
23: " ",
24: " ",
25: " ooo ",
26: " ",
27: " "
28: };
29: char nxt[LINES][COLS0];
30: int setnxt()
31: {
32: int x,y,i,j,jb,ib,je,ie,alivect;
33: char alive='o';
34: char dead =' ';
35: int ylast=LINES-1;
36: int xlast=COLS-1;
37: for(y=0; ylast>=y; y++){
38: for(x=0; xlast>=x; x++){
39: jb = y-1;
40: je = y+1;
41: ib = x-1;
42: ie = x+1;
43: if(y==0) {jb = 0;}
44: if(y>ylast){je = ylast;}
45: if(x==0) {ib = 0;}
46: if(x>xlast){ie = xlast;}
47: alivect=0;
48: for(j=jb; je>=j; j++){
49: for(i=ib; ie>=i; i++){
50: if (now[j][i]==alive) alivect++;
51: }
52: }
53: if(now[y][x]==alive){
54: alivect--;
55: if(alivect==2 || alivect==3) {
56: nxt[y][x]=alive;
57: }
58: else {
59: nxt[y][x]=dead;
60: }
61: }
62: else{
63: if(alivect==3) {nxt[y][x]=alive;} else {nxt[y][x]=dead;}
64: }
65: }/* x */
66: nxt[y][COLS0-1]='\0';
67: }/* y */
68: return 0;
69: }
70:
71: int main()
72: {
73: int ct,y;
74: char a;
75: for(ct=0;1000>ct;ct++){
76: printf("\e[0;0H"); /* カーソルを左上に \e はエスケープ*/
77: for(y=0;LINES>y;y++){
78: printf("%s*\n",now[y]);
79: }
80: if( setnxt() ) return 1;
81: for(y=0;LINES>y;y++){
82: strcpy(now[y],nxt[y]);
83: }
84: printf("%d",ct);
85: sleep(1);
86: /*scanf("%c", &a);*/
87: }
88: return 0;
89: }
実行結果はこうなります。
o *
o *
o *
*
ooo ooo *
*
o *
o *
o *
*
*
*
*
o o *
oo *
o *
o *
o *
o *
*
世代数:17 ←世代数(何回繰り返したか)
終了するには [Ctrl]+[c] を押してください。
Ctrlキーを押しながら c を押す
半角英字の表示だと升目が縦長になるので、全角の文字を使ってみました。結果の表示部分のみ違っています。
1: /* ライフゲーム(2) k1102.c */
2: #include <stdio.h>
3: #include <string.h>
4: #define COLS0 41
5: #define COLS 40
6: #define LINES 30
7: char alive='o';
8: char dead =' ';
9: char now[LINES][COLS0]=
10: {
11: " ",
12: " ",
13: " ",
14: " o ",
15: " o ",
16: " o ",
17: " o ",
18: " ooooo o ",
19: " ",
20: " ",
21: " ",
22: " o ",
23: " o ",
24: " ooo o o ",
25: " oooooooooooooooo ",
26: " ",
27: " ",
28: " ",
29: " ",
30: " ",
31: " ",
32: " ",
33: " ooooo ",
34: " ",
35: " ",
36: " ",
37: " ",
38: " ",
39: " ",
40: " "
41: };
42: char nxt[LINES][COLS0];
43: int setnxt()
44: {
45: int x,y,i,j,jb,ib,je,ie,alivect;
46: int ylast=LINES-1;
47: int xlast=COLS-1;
48: for(y=0; ylast>=y; y++){
49: for(x=0; xlast>=x; x++){
50: jb = y-1;
51: je = y+1;
52: ib = x-1;
53: ie = x+1;
54: if(y==0) {jb = 0;}
55: if(y>ylast){je = ylast;}
56: if(x==0) {ib = 0;}
57: if(x>xlast){ie = xlast;}
58: alivect=0;
59: for(j=jb; je>=j; j++){
60: for(i=ib; ie>=i; i++){
61: if (now[j][i]==alive) alivect++;
62: }
63: }
64: if(now[y][x]==alive){
65: alivect--;
66: if(alivect==2 || alivect==3) {
67: nxt[y][x]=alive;
68: }
69: else {
70: nxt[y][x]=dead;
71: }
72: }
73: else{
74: if(alivect==3) {nxt[y][x]=alive;} else {nxt[y][x]=dead;}
75: }
76: }/* x */
77: nxt[y][COLS0-1]='\0';
78: }/* y */
79: return 0;
80: }
81:
82: int knjdisp()
83: {
84: int x,y;
85: char jalive[]="● ";
86: //char jdead[] ="○ ";
87: char jdead[] =" ";
88: int ylast=LINES-1;
89: int xlast=COLS-1;
90: printf("\e[0;0H"); /* カーソルを左上に */
91: for(y=0; ylast>=y; y++){
92: for(x=0; xlast>=x; x++){
93: if(now[y][x]==alive) printf(jalive); else printf(jdead);
94: }
95: printf("|\n");
96: }
97: for(x=0; xlast>=x; x++){
98: printf("— ");
99: }
100: printf("\n");
101: }
102:
103: int main()
104: {
105: int ct,y;
106: for(ct=0;1000>ct;ct++){
107: /*printf("%c[0;0H",(char)0x1b);*/
108: knjdisp();
109: if( setnxt() ) return 1;
110: for(y=0;LINES>y;y++){
111: strcpy(now[y],nxt[y]);
112: }
113: printf("%d",ct);
114: usleep(50000); /* 0.5sec usleep :マイクロ秒(1/1000000秒)*/
115: /*scanf("%c", &a);*/
116: }
117: return 0;
118: }
実行結果はこうなります。

初期状態と最終状態だけを示しました。最初が少し違うだけでも結果は大きく異なります。また、ルールを変更すれば結果が変わります。
シミュレーションはどういうルールを採用し、どういう初期状態から始めるかで結果が違いますから、実際の現象をシミュレートするにはよくよく研究し検証しなければなりません。コンピュータでシミュレーションをやっただけで結果を信用するのは危険です。
| 個数 | 初期状態 | 最終状態 | 説明 |
|---|---|---|---|
| 3 | ![]() |
![]() |
1,2個はすぐになくなりますが、3個は振動します。 |
| 4 | ![]() |
![]() |
この形で止まります。 |
| 5 | ![]() |
![]() |
再び振動します。 |
| 6 | ![]() |
![]() |
死に絶えます。始めの数が多くても最終的に広がるとは限りません。 |
| 7 | ![]() |
![]() |
この形で止まります。 |
| 8 | ![]() |
![]() |
この形で止まります。 |
| 9 | ![]() |
![]() |
再び振動します。 |