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);
	}
}


 

 

posted @ 2013-08-12 20:19  pangbangb  阅读(426)  评论(0编辑  收藏  举报