请高手用C++编写程序—生命游戏
#include<iostream>
using?namespace?std;
#include<time.h>
#define?M?70
#define?N?20
void?mShow(int?a[N+2][M+2])
{?int?i,j;
for?(?i=0;i<N;i++,cout<<endl?)
for?(?j=0;j<M;j++?)
if?(?a[i+1][j+1]?)?cout<<'*';
else?cout<<'.';
//cout<<(?a[i+1][j+1]?)?('*'):('?');
}
int?mJduge(int?a[N+2][M+2])
{?int?i,j,k,s,*p[9],b[N][M];
for?(?i=0;i<N;i++?)
{
p[0]=p[4]=p[5]=&a[i+1][1];?p[4]--;?p[5]++;//?1?2?3
p[1]=p[2]=p[3]=p[0]-M-2;?p[1]--;?p[3]++;?//?4?0?5
p[6]=p[7]=p[8]=p[0]+M+2;?p[6]--;?p[8]++;//?6?7?8
for?(?j=0;j<M;j++?)
{?for?(?k=1,s=0;k<9;k++?)?s+=(*p[k]);
b[i][j]=*p[0];
if?(?s>=3?)?b[i][j]=1;
else?if?(?s<2?)?b[i][j]=0;
for?(?k=0;k<9;k++?)?p[k]++;
}
}
for?(?i=0,s=1;i<N;i++?)?for?(?j=0;j<M;j++?)?{?a[i+1][j+1]=b[i][j];?if?(?b[i][j]==0?)?s=0;?}
return?s;
}
void?main()
{
int?a[N+2][M+2],b[N][M],*p[9];
int?t,i,j,k;
for?(?i=0;i<N+2;i++?)?for?(?j=0;j<M+2;j++?)?a[i][j]=0;
srand((unsigned?int)time(NULL));
for?(?i=0;i<N;i++?)?for?(?j=0;j<M;j++?)?{?k=rand()%100;?a[i+1][j+1]=(?k>=77?)?(1):(0);?}
cout<<"--------?T=0--------"<<endl;?mShow(a);
k=0;?t=0;
while?(?!k?)
{?k=mJduge(a);?t++;
cout<<"--------?T="<<t<<"?--------"<<endl;?mShow(a);
}
}
a数组比实际要的数组大一圈,大出来的一圈永恒等于0,作为边界,省得计算8连通数据时数组越界
b数组用于计算本次的结果,计算完成后复制、覆盖a数组中间部分作为结果
主程序做直到所有空间都被活细胞占满情况停止
以下是设置M=10,N=5的测试部分结果