生命游戏的三种玩法

 生命游戏

规则

每个细胞有两种状态——存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动。

当细胞为死亡状态,若周围有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代:\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 }
 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

谢宾斯基三角形

柔和的曲线

 

 

参考链接:维基百科-康威生命游戏

posted @ 2018-10-01 11:53  Rogn  阅读(40055)  评论(1编辑  收藏  举报