生命游戏_c语言小实现
什么是生命游戏呢?
游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。
应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
(1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。
(2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
(3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
(4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。
可以把最初的细胞结构定义为种子,当所有种子细胞按以上规则处理后,可以得到第1代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。
上面的生存定律当然可以任意改动,发明出不同的“生命游戏”。
——上述源自百度百科
简单的在C语言中实现一下,我的开发环境是DevC++
/*Version 1.0*/ //实现高朋星云 #include<stdio.h> #include<stdlib.h> #include <windows.h>//ÑÓʱº¯ÊýÍ·Îļþ #define N 15 int StartMat[N][N]; int NextMat[N][N]; void InitMat (int Mat[N][N]) { Mat[3][5]=1;Mat[3][8]=1;Mat[3][10]=1; Mat[4][3]=1;Mat[4][4]=1;Mat[4][6]=1,Mat[4][8]=1,Mat[4][9]=1,Mat[4][10]=1; Mat[5][4]=1,Mat[5][11]=1; Mat[6][3]=1,Mat[6][4]=1,Mat[6][10]=1; Mat[8][4]=1,Mat[8][10]=1,Mat[8][11]=1; Mat[9][3]=1,Mat[9][10]=1, Mat[10][4]=1;Mat[10][5]=1;Mat[10][6]=1;Mat[10][8]=1; Mat[10][10]=1;Mat[10][11]=1; Mat[11][4]=1;Mat[11][6]=1;Mat[11][9]=1; } void DisplayMat(int Mat[N][N]) { char pic=0; for(int i=1;i<N-1;i++) { for(int j=1;j<N-1;j++) { if(Mat[i][j]==0) printf("%c%c",0xa8,0x80); if(Mat[i][j]==1) printf(" "); } printf("\n"); } } void copyMat() { for(int i=1;i<N-1;i++) { for(int j=1;j<N-1;j++) { StartMat[i][j]=NextMat[i][j]; NextMat[i][j]=0; } } } void RefreshMat(int Mat[N][N]) { int temp=0; for(int i=1;i<N-1;i++) { for(int j=1;j<N-1;j++) { temp=Mat[i-1][j]+Mat[i+1][j]+Mat[i][j-1]+Mat[i][j+1]; temp=temp+Mat[i-1][j-1]+Mat[i+1][j-1]+Mat[i-1][j+1]+Mat[i+1][j+1]; //Rule1 if(Mat[i][j]==0) { if(temp==3) NextMat[i][j]=1; } //Rule2&3&4 if(Mat[i][j]==1) { if(temp<2||temp>3) NextMat[i][j]=0; else if(temp==2||temp==3) NextMat[i][j]=1; } } } } int main() { int time; InitMat(StartMat); printf("iteration=%d\n",time); DisplayMat(StartMat); Sleep(1000); system("cls"); for(time=1;time<=100;time++) { printf("iteration=%d\n",time); RefreshMat(StartMat); DisplayMat(NextMat); copyMat(); Sleep(200); system("cls"); } return 0; }
最终实现如下:
随手写的,大家可以玩下。
——横眉冷对千夫指,俯首甘为孺子牛