/**
生命游戏
1-一个细胞周围8个细胞中如果有3个细胞为生,则该细胞为生
2-如果该细胞周围只有2个细胞为生,则该细胞的生死保持不变
3-在其他情况下,该细胞为死
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define High_Max 100
#define Width_Max 100
int High =20;
int Width =50;
int Canvas [High_Max][Width_Max];
int Breed_Num=0;
void gotoxy(int x,int y)//清屏
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
void State_Init ()
{
int i , j;
srand(time(NULL));//初始化随机数
for(i=0;i<=High;i++)
{
for(j=0;j<=Width;j++)
{
Canvas[i][j]=rand()%2;//随机赋值
}
}
}
void Show ()//生输出 ■ 死输出 □
{
gotoxy(0,0);
int i , j;
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(Canvas[i][j]==1)
printf("■");
else
printf("□");
}
printf("\n");
//printf("\n");
}
}
void Copy_arr(int tmp_map[][Width_Max],int map[][Width_Max])
{
int i,j;
for ( i = 0; i < High; i++)
for ( j = 0; j < Width; j++)
tmp_map[i][j] = map[i][j];
}
void Auto_Up()//自动更新
{
int NewCanvas[High_Max][Width_Max];//缓存
int RoundNum ;//周围的个数
int i , j ;
Copy_arr(NewCanvas,Canvas);//先缓存
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)//比较缓存后的值在更新原本值
{
RoundNum=NewCanvas[i-1][j-1]+NewCanvas[i-1][j]+NewCanvas[i-1][j+1]
+NewCanvas[i][j-1] /*NewCanvas[i][j]*/+NewCanvas[i][j+1]
+NewCanvas[i+1][j-1]+NewCanvas[i+1][j]+NewCanvas[i+1][j+1];//将附近8个全部相加
if(RoundNum==3)
Canvas[i][j]=1;
else if(RoundNum==2);//维持原状
else
Canvas[i][j]=0;
}
}
Breed_Num++;
}
int main ()
{
int i;
State_Init();
Show();
while(1)
{
Show();
Auto_Up();
Sleep(100);
printf("第%d代: ",Breed_Num);
}
return 0;
}
原文:https://www.cnblogs.com/nsss/p/10536476.html