牛骨文教育服务平台(让学习变的简单)

生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:

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

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

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

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

#include <iostream>
#include <time.h>
using namespace std;

#define		ROW    10
#define		COLUMN 10
#define     ALIVE   1
#define     DEAD    0

int nCellSta[ROW][COLUMN];
int nTempSta[ROW][COLUMN];

int CellCount(int nRow, int nColumn)
{
	int nSum = 0;
	for (int i = nRow-1; i< nRow +2; i++)
	{
		for (int j = nColumn -1; j< nColumn +2 ; j++)
		{
			if (i < 0 || i >ROW-1 || j<0 || j>COLUMN -1)
			{
				continue;
			}

			if (nCellSta[i][j] == ALIVE)
			{
				nSum++;
			}
		}
	}

	switch(nSum)
	{
	case 0:
	case 1:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
		return DEAD;
	case 2:
		return nCellSta[ROW][COLUMN];
	case 3:
		return ALIVE;
	}
}

int PrintValue()
{
	int nSum = 0;
	for (int i = 0; i< COLUMN; i++)
	{
		for (int j = 0; j< ROW; j++)
		{
			cout<<nCellSta[i][j]<<" "; 
			nSum += nCellSta[i][j];
		}
		cout<<endl<<endl;
	}
	return nSum;

}

int main()
{
	int nFlag = 0;

	memset(nCellSta, 0, sizeof(nCellSta));
	memset(nTempSta, 0, sizeof(nTempSta));
	srand(time(NULL));
	for (int i = 0; i< COLUMN; i++)
	{
		for (int j = 0; j< ROW; j++)
		{
			nCellSta[i][j] = rand() % 2;
		}
	}

	PrintValue();
	while (1)
	{
		cout<<"新一轮游戏进化开始"<<endl;
		for (int i = 0; i< COLUMN; i++)
		{
			for (int j = 0; j< ROW; j++)
			{
				nTempSta[i][j] = CellCount(i, j);

			}
		}
		memcpy(nCellSta,nTempSta,sizeof(nCellSta));
		if(!PrintValue())
		{
			cout<<"全部死亡,进化结束"<<endl;
			break;
		}

		cout<<"是否开启下一轮进化,1继续,0退出"<<endl;
		cin>>nFlag;
		if (nFlag)
		{
			continue;
		}
		else
			break;

	}
	system("pause");

}