1970年英国数学家J.H.CONWAY提出了一种名为Life的趣味游戏,游戏在一个模拟的方格盘上进行,每个方格都有两种可能的状态:存活或死亡。赋予方格一个初始的状态,它将按照一下的规则进行变化:
1:每个方格相邻的八个方格称为方格的邻居。
2:如果一个方格是存活的但是它的邻居数为0或者只有一个,下一代中这个方格由于过于孤独而死亡。
3:如果一个方格是存活的并且有四个或者更多的邻居,下一代中这个方格会由于过于拥挤而死亡。
4:如果一个方格是存活的并且有两个或者三个邻居,下一代中这个方格会继续存活。
5:如果一个方格是死亡的,而它正好有三个邻居,那么下一代中这个方格将复活。
6:所有的死亡和复活事件是同时发生的。
实现思路:用二维数组构造方格,接受用户输入的初始状态,计算每个方格的邻居数,然后根据繁衍规则(总结起来很简单:邻居数为2时状态不变,邻居数为3时下一代总是存活的,其余邻居数下一代总是死亡的)进行改变。
#include<iostream>
#include<conio.h>
using namespace std;
const int Maxline=20;
class life
{public:
void initialize();
void update();
void print();
private:
int grid[Maxline+2][Maxline+2];
int row,col;
};
void life::initialize()
{
for(row=0;row<=Maxline+1;row++)
for(col=0;col<=Maxline+1;col++)
grid[row][col]=0;
cout<<"please input the row and column of the living cells(terminate with 0 0)"<<endl;
cin>>row>>col;
while(row||col)
{if(row>=1&&row<=Maxline&&col>=1&&col<=Maxline)
grid[row][col]=1;
else
cout<<"your input is out of range"<<endl;
cin>>row>>col;}
}
void life::print()
{
for(row=1;row<=Maxline;row++)
{for(col=1;col<=Maxline;col++)
if(grid[row][col])cout<<"*";
else cout<<" ";
cout<<endl;}
}
void life::update()
{
int newgrid[Maxline+2][Maxline+2];
int count=0,i,j;
for(row=1;row<=Maxline;row++)
for(col=1;col<=Maxline;col++)
{
for(i=row-1;i<=row+1;i++)
for(j=col-1;j<=col+1;j++)
count+=grid[i][j];
count-=grid[row][col];
if(count==2)newgrid[row][col]=grid[row][col];
else if(count==3)newgrid[row][col]=1;
else newgrid[row][col]=0;
count=0;
}
for(row=1;row<=Maxline;row++)
for(col=1;col<=Maxline;col++)
grid[row][col]=newgrid[row][col];
}
bool user_says_yes()
{
char choice;
cin>>choice;
while(choice!='y'&&choice!='Y'&&choice!='n'&&choice!='N')
cin>>choice;
return (choice=='y'||choice=='Y');
}
int main()
{
life configuration;
configuration.initialize();
configuration.print();
cout<<"continue viewing new generations?(y/n)"<<endl;
while(user_says_yes())
{configuration.update();
configuration.print();
cout<<"continue viewing new generations?(y/n)"<<endl;
}
return 0;
}