生命游戏的三种玩法
生命游戲
規則
每個細胞有兩種狀態——存活或者死亡,每個細胞只與以其自身為中心的細胞產生互動。
當細胞為死亡狀態,若周圍有3個存活細胞,則該細胞變成存活狀態(模擬繁殖)
當細胞為存活狀態,若周圍有2個或3個存活細胞,保持原樣
若周圍有3個以上存活細胞,該細胞變成死亡(模擬極度擁擠)
若周圍有低于2個一下存活細胞,該細胞死亡(模擬人口稀疏)
這個游戲也叫康威生命游戲、細胞自動機、元胞自動機等。
圖案介紹
“脈沖星”:它周期為3,看起來像一顆爆發的星星
“滑翔者”:每4個回合它會延右下方移動一格,雖然細胞早就不是原來的細胞,但它能保持原來額形狀
“輕量級飛船”:它周期為4,每兩個“回合”向右走一格
“滑翔者槍”:它會不斷的產生一個有一個“滑翔者”
“繁殖者”:它會向右進行,留下一個接一個的“滑翔者槍”
C/C++實現
用C/C++模擬了最簡單的規則,代碼
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4
5 const int DATH = 0;
6 const int ALIVE = 1;
7 const int maxn = 50;
8 const int maxr = 100,maxl = 100;
9 const int dx[] = { -1,-1,-1,0,1,1,1,0 }, dy[] = { -1,0,1,1,1,0,-1,-1 };
10
11 int map[maxr][maxl], newmap[maxr][maxl];
12 int m, n, general = 0;;
13
14 //初始化,生成隨機數(無法避免隨機數的浪費)
15 void rule1()
16 {
17 srand(time(NULL));
18 for(int i = 0;i < m;i++)
19 for (int j = 0; j < n; j++)
20 map[i][j] = rand() % 2; //假設約n/2
21 }
22
23 //"脈沖星",周期為3
24 void rule2()
25 {
26 for (int i = 0; i < m; i++)
27 for (int j = 0; j < n; j++)
28 map[i][j] = 0;
29 map[4][2] = map[5][2] = map[6][2] = 1;
30 map[4][7] = map[5][7] = map[6][7] = 1;
31 map[2][4] = map[2][5] = map[2][6] = 1;
32 map[7][4] = map[7][5] = map[7][6] = 1;
33
34 map[10][2] = map[11][2] = map[12][2] = 1;
35 map[10][7] = map[11][7] = map[12][7] = 1;
36 map[9][4] = map[9][5] = map[9][6] = 1;
37 map[14][4] = map[14][5] = map[14][6] = 1;
38
39 map[4][9] = map[5][9] = map[6][9] = 1;
40 map[4][14] = map[5][14] = map[6][14] = 1;
41 map[2][10] = map[2][11] = map[2][12] = 1;
42 map[7][10] = map[7][11] = map[7][12] = 1;
43
44 map[10][9] = map[11][9] = map[12][9] = 1;
45 map[10][14] = map[11][14] = map[12][14] = 1;
46 map[9][10] = map[9][11] = map[9][12] = 1;
47 map[14][10] = map[14][11] = map[14][12] = 1;
48 }
49
50 //計算(x,y)周圍存活細胞的個數
51 int neighbor_num(int x, int y,int map[][maxl])
52 {
53 int cnt = 0;
54 for (int i = 0; i < 8; i++)
55 {
56 int nx = x + dx[i], ny = y + dy[i];
57 if (nx >= 0 && nx < m && ny >= 0 && ny < n && map[nx][ny]) cnt++;
58 }
59 return cnt;
60 }
61
62 //打印第i代的結果
63 void print_general()
64 {
65 printf("第%d代:
", general);
66 for (int i = 0; i < m; i++)
67 {
68 for (int j = 0; j < n; j++)
69 if (map[i][j]) printf("■");
70 else printf("□");
71 printf("
");
72 }
73 }
74
75 //將map復制到tmp_map
76 void copy_map(int map[][maxl], int tmp_map[][maxl])
77 {
78 for (int i = 0; i < m; i++)
79 for (int j = 0; j < n; j++)
80 tmp_map[i][j] = map[i][j];
81 }
82
83 //得到下一代
84 void iteration()
85 {
86 int tmp_map[maxr][maxl];
87 copy_map(map, tmp_map); //保存之前圖像,使得當前元素狀態的改變還是基于之前的地圖,而不是被修改了的
88 for(int i = 0;i < m;i++)
89 for (int j = 0; j < n; j++)
90 {
91 int cnt = neighbor_num(i, j, tmp_map);
92 switch (cnt)
93 {
94 case 2: continue;
95 case 3: map[i][j] = ALIVE; break;
96 default: map[i][j] = DATH; break;
97 }
98 }
99
100 general++;
101 print_general();
102 }
103
104 int main()
105 {
106 scanf("%d%d", &m, &n);
107 rule1();
108 print_general();
109 while (1)
110 iteration();
111
112 return 0;
113 }
View Code
Excel中的VBA實現
某位大神寫的,自帶滑翔機,鏈接
模擬軟件Golly
自帶各種規則和圖案,體驗感極好,當然也可以編寫規則和圖案,貼吧里有一些教程,鏈接
各種版本的下載鏈接:http://golly.sourceforge.net/
附(其生成的一些有趣圖片):
官網logo
謝賓斯基三角形
柔和的曲線
參考鏈接:維基百科-康威生命游戲
總結
- 上一篇: 富文本(wangEditor框架)的使用
- 下一篇: 补肾宁片_功效作用注意事项用药禁忌用法用