- 细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把33的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。
- 每个格子的生死遵循下面的原则:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define High 25
#define Width 50 //游戏画面尺寸
//全局变量
int cells[High][Width];
void gotoxy(int x , int y )//将光标移到xy位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle ,pos);
}
void startup()//数据初始化
{
int i , j;
for(i = 0;i<High;i++)
for(j=0;j<Width;j++)
{
cells[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(cells[i][j] == 1)
printf("*");//输出活的细胞
else
printf(" ");//输出空格
}
printf("\n");
}
}
void updateWithoutInput()
{
int NewCells[High][Width];
int NeibourNumber;
int i,j;
for(i=1;i<=High-1;i++)
{
for(j=0;j<Width;j++)
{
NeibourNumber = cells[i-1][j-1] + cells[i-1][j]+cells[i-1][j+1]+cells[i][j-1]+cells[i][j+1]+cells[i+1][j-1]+cells[i+1][j]+cells[i+1][j+1];
if(NeibourNumber == 3)
NewCells[i][j] = 1;
else if(NeibourNumber == 2)
NewCells[i][j] = cells[i][j];
else
NewCells[i][j]=0;
}
}
for(i=1;i<=High-1;i++)
for(j=0;j<Width;j++)
cells[i][j]=NewCells[i][j];
}
int main() {
startup();
while (1)//这是个死循环,所有的细胞动态繁衍或死亡
{
show();
updateWithoutInput();
}
return 0;
}
网友评论