生命游戏(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");
}
~~~
![](https://box.kancloud.cn/2016-02-18_56c5c49b8a632.jpg)