生命游戏的三种玩法
Posted lfri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生命游戏的三种玩法相关的知识,希望对你有一定的参考价值。
生命游戏
每个细胞有两种状态——存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动。
当细胞为死亡状态,若周围有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 }
Excel中的VBA实现
某位大神写的,自带滑翔机,链接
模拟软件Golly
自带各种规则和图案,体验感极好,当然也可以编写规则和图案,贴吧里有一些教程,链接
各种版本的下载链接:http://golly.sourceforge.net/
附(其生成的一些有趣图片):
官网logo
谢宾斯基三角形
柔和的曲线
以上是关于生命游戏的三种玩法的主要内容,如果未能解决你的问题,请参考以下文章
字符串类型1strip,lstrip,rstrip 2lower,upper 3startswith,endswith 4format的三种玩法 5split,rsplit 6j