生命游戏

说明:生命游戏为1970年英国数学家J.H.Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上、右下,游戏规则如下:

孤单细胞死亡:如果细胞邻居小于一个,则该细胞在下一状态将死亡。

拥挤死亡:如果细胞的邻居在4个以上,则该细胞在下一状态将死亡。

稳定:如果细胞的邻居为二个或三个,则下一状态为稳定存活:

复活:如果某位置原无细胞存活,而该位置的邻居为3个,则该位置将复活一细胞。

 具体规则:

邻居为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。

邻居个数为2时,则该细胞下次状态为复活。

邻居个数为3时,该细胞下次状态为稳定。

每次输出都是对称的图形

Ss 生命游戏(类似数字电路中的状态机)(读者看完tips之后请试着自己编写程序)

1.    设置两个二维数组map,newmap,分别代表上一状态和当前状态,newmap的值根据map(上一状态)来设置

2.    每当newmap完成并且输出之后,调用copy,将newmap复制到map中(状态机)

3.    注意考虑边界条件,不能超出边界访问。

4.    Case 语句实现更加便捷

#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
const int live = 1;
const int dead = 0;
int cnt;
int map[20][20];
int newmap[20][20];
void init();
int neighbor(int row, int col);
void print();
void copy();
int main(int argv,char**argc){
	cout << "set the initial state" << endl;
	cout << "ps:0<=row<=19,0<=col<=19,1 represents live,0 represents death" << endl;
	init();
	print();
	while (true){
		for (int i = 0; i < 20;i++)
		for (int j = 0; j < 20;j++)
			switch (neighbor(i, j)){
			case 0:
			case 1:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				newmap[i][j] = dead;
				break;
			case 2:
				newmap[i][j] = map[i][j];
				break;
			case 3:
				newmap[i][j] = live;
				break;
		}
		copy();
		print();
		char ch;
		cout << "continue or not" << endl;
		cin >> ch;
		if (ch == '#')break;
	}
	system("pause");
	return 0;
}
void init(){
	ifstream in("input.txt");
	for (int j = 0; j < 20; j++){
		string temp;
		getline(in, temp);
		stringstream str(temp);
		for (int i = 0; i < 20; i++)
			str >> map[j][i];
	}
}
int neighbor(int row, int col){
	int count = 0;
	for (int i = row - 1; i <= row + 1;i++)
	for (int j = col - 1; j <= col + 1; j++)
	{
		if (i < 0 || i >= 20 || j < 0 || j >= 20)continue;
		if (map[i][j] == 1)count++;
	}
	if (map[row][col] == 1)count--;//if the(row,col)one is alive, total number will be minus
	//one,else the count is right
	return count;
}
void print(){
	printf("No.%d time is:\n",++cnt);
	for (int i = 0; i < 20; i++){
	for (int j = 0; j < 20; j++)
		printf("%d ", map[i][j]);
	printf("\n");
	}
}
void copy(){
	for (int i = 0; i < 20;i++)
	for (int j = 0; j < 20; j++)
		map[i][j] = newmap[i][j];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值