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