请高手用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的测试部分结果