BBC 生命大设计
BBC霍金的生命的意义一视频中,有一段图案特别漂亮,于是我就写了一下,具体的繁殖规则是这样的:有存活体和死方格两个部分构成,我分别用 ' * ' 和 ‘ ’ 表示。当一个存活体周围有超过三个存活体时,这个存活体就会因为过度拥挤而死亡,当一个死方格周围有三个存活体时,这个死方格就会产生新的生命。
这里我使用了滚动数组,从而优化了代码。
不过在运行的时候发现,死亡率依旧很高,并没有达到视频中那么漂亮的图案,而是很快就死了。我分析了一下,觉得是繁殖生长的条件太苛刻了,从而并没有较好的生长出来,而死亡相对比较容易发生。所以看到的图案是,一开始有很多很多的细胞,没过多久就死光了。
#include <cstdio> #include <iostream> #include <cstring> #include <stdlib.h> #include <time.h> using namespace std; #define LLEN 100 char map[2][LLEN][LLEN]; int point[8][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}, {1,1}, {1,-1}, {-1,-1}, {-1,1}}; void _print(int index) { for(int i = 0; i < LLEN; i++) { for(int j = 0; j < LLEN; j++) { printf("%c", map[index][i][j]); } printf("\n"); } } int find(int index, int x, int y) { int res = 0; for(int i = 0; i < 8; i++) { int xx = x + point[i][0]; int yy = y + point[i][1]; if(xx >= 0 && xx < LLEN && yy >= 0 && yy < LLEN) { if('*' == map[index][xx][yy]) res++; } } return res; } void init(int index) { for(int i = 0; i < LLEN; i++) { for(int j = 0; j < LLEN; j++) { map[index][i][j] = ' '; } } } int main(int argc, char* argv[]) { int a, b; a = 0; b = 1; system("clear"); srand((int)time(0)); for(int i = 0; i < LLEN; i++) { for(int j = 0; j < LLEN; j++) { int t = random()%2; if(0 == t) { map[a][i][j] = '*'; } else { map[a][i][j] = ' '; } map[b][i][j] = ' '; } } _print(a); while(1) { sleep(1); system("clear"); swap(a, b); init(a); for(int i = 0; i < LLEN; i++) { for(int j = 0; j < LLEN; j++) { if('*' == map[b][i][j] && find(b, i, j) > 3) { // 死亡规则 map[a][i][j] = ' '; } else if(' ' == map[b][i][j] && find(b, i, j) == 3) { // 繁殖规则 map[a][i][j] = '*'; } } } _print(a); } }