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

	}

}


 

 

你可能感兴趣的:(设计)