每个细胞有两种状态——存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动。
当细胞为死亡状态,若周围有3个存活细胞,则该细胞变成存活状态(模拟繁殖)
当细胞为存活状态,若周围有2个或3个存活细胞,保持原样
若周围有3个以上存活细胞,该细胞变成死亡(模拟极度拥挤)
若周围有低于2个一下存活细胞,该细胞死亡(模拟人口稀疏)
这个游戏也叫康威生命游戏、细胞自动机、元胞自动机等。
“脉冲星”:它周期为3,看起来像一颗爆发的星星
“滑翔者”:每4个回合它会延右下方移动一格,虽然细胞早就不是原来的细胞,但它能保持原来额形状
“轻量级飞船”:它周期为4,每两个“回合”向右走一格
“滑翔者枪”:它会不断的产生一个有一个“滑翔者”
“繁殖者”:它会向右进行,留下一个接一个的“滑翔者枪”
C/C++实现
用C/C++模拟了最简单的规则,代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
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 };
11 int map[maxr][maxl], newmap[maxr][maxl];
12 int m, n, general = 0;;
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 }
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;
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;
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;
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 }
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 }
62 //打印第i代的结果
63 void print_general()
64 {
65 printf("第%d代:\n", 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("\n");
72 }
73 }
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 }
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 }
100 general++;
101 print_general();
102 }
104 int main()
105 {
106 scanf("%d%d", &m, &n);
107 rule1();
108 print_general();
109 while (1)
110 iteration();
112 return 0;
113 }
View Code
Excel中的VBA实现
某位大神写的,自带滑翔机,
链接
模拟软件Golly
自带各种规则和图案,体验感极好,当然也可以编写规则和图案,贴吧里有一些教程,
链接
各种版本的下载链接:
http://golly.sourceforge.net/
附(其生成的一些有趣图片):
官网logo
谢宾斯基三角形
柔和的曲线
参考链接:
维基百科-康威生命游戏
个性签名:时间会解决一切