谁能给我标注下这个生命游戏程序每一步什么意思/ 详细点的
原理:细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的...
原理:
细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。
每个格子的生死遵循下面的原则:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
要求:
1.根据上述细胞生死原则,完成细胞进化函数CellMachineEvolution
2.注意遵循编码规范,合理划分函数,结构清晰
#include<iostream.h>
#include<windows.h>
struct Cell
{
bool live;
int others;
};
int clrscr()
{
HANDLE hndl = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hndl, &csbi);
DWORD written;
DWORD N = csbi.dwSize.X * csbi.dwCursorPosition.Y +
csbi.dwCursorPosition.X + 1;
COORD curhome = {0,0};
FillConsoleOutputCharacter(hndl, ' ', N, curhome, &written);
csbi.srWindow.Bottom -= csbi.srWindow.Top;
csbi.srWindow.Top = 0;
SetConsoleWindowInfo(hndl, TRUE, &csbi.srWindow);
SetConsoleCursorPosition(hndl, curhome);
return 0;
}
void main()
{
Cell cell[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].live=true;
cell[i][j].others=0;
}
while(1)
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].others=0;
}
for(i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(cell[i][j].live)
cout<<"$ ";
else
cout<<"- ";
}
cout<<endl;
}
for(i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if((i-1)>=0 && (j-1)>=0 && cell[i-1][j-1].live)
cell[i][j].others++;
if((i-1)>=0 && cell[i-1][j].live)
cell[i][j].others++;
if((i-1)>=0 && (j+1)<10 && cell[i-1][j+1].live)
cell[i][j].others++;
if((j-1)>=0 && cell[i][j-1].live)
cell[i][j].others++;
if((j+1)<10 && cell[i][j+1].live)
cell[i][j].others++;
if((i+1)<10 && (j-1)>=0 && cell[i+1][j-1].live)
cell[i][j].others++;
if((i+1)<10 && cell[i+1][j].live)
cell[i][j].others++;
if((i+1)<10 && (j+1)<10 && cell[i+1][j+1].live)
cell[i][j].others++;
switch(cell[i][j].others)
{
case 2:break;
case 3:cell[i][j].live=true;break;
default:cell[i][j].live=false;break;
}
}
Sleep(1000);
clrscr();
}
} 展开
细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。
每个格子的生死遵循下面的原则:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
要求:
1.根据上述细胞生死原则,完成细胞进化函数CellMachineEvolution
2.注意遵循编码规范,合理划分函数,结构清晰
#include<iostream.h>
#include<windows.h>
struct Cell
{
bool live;
int others;
};
int clrscr()
{
HANDLE hndl = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hndl, &csbi);
DWORD written;
DWORD N = csbi.dwSize.X * csbi.dwCursorPosition.Y +
csbi.dwCursorPosition.X + 1;
COORD curhome = {0,0};
FillConsoleOutputCharacter(hndl, ' ', N, curhome, &written);
csbi.srWindow.Bottom -= csbi.srWindow.Top;
csbi.srWindow.Top = 0;
SetConsoleWindowInfo(hndl, TRUE, &csbi.srWindow);
SetConsoleCursorPosition(hndl, curhome);
return 0;
}
void main()
{
Cell cell[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].live=true;
cell[i][j].others=0;
}
while(1)
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].others=0;
}
for(i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(cell[i][j].live)
cout<<"$ ";
else
cout<<"- ";
}
cout<<endl;
}
for(i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if((i-1)>=0 && (j-1)>=0 && cell[i-1][j-1].live)
cell[i][j].others++;
if((i-1)>=0 && cell[i-1][j].live)
cell[i][j].others++;
if((i-1)>=0 && (j+1)<10 && cell[i-1][j+1].live)
cell[i][j].others++;
if((j-1)>=0 && cell[i][j-1].live)
cell[i][j].others++;
if((j+1)<10 && cell[i][j+1].live)
cell[i][j].others++;
if((i+1)<10 && (j-1)>=0 && cell[i+1][j-1].live)
cell[i][j].others++;
if((i+1)<10 && cell[i+1][j].live)
cell[i][j].others++;
if((i+1)<10 && (j+1)<10 && cell[i+1][j+1].live)
cell[i][j].others++;
switch(cell[i][j].others)
{
case 2:break;
case 3:cell[i][j].live=true;break;
default:cell[i][j].live=false;break;
}
}
Sleep(1000);
clrscr();
}
} 展开
1个回答
展开全部
#include <unistd.h>
#include <iostream>
using namespace std;
struct Cell
{
bool live; //自己是否活着
int others; //周围的活着的个数
};
int main()
{
Cell cell[10][10];
//初始化,设置全为活的,other为0
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].live=true;
cell[i][j].others=0;
}
while(1)
{
//每次先将other初始化为0
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
cell[i][j].others=0;
}
//打印死活,活着$死了-
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(cell[i][j].live)
cout<<"$ ";
else
cout<<"- ";
}
cout<<endl;
}
//计算下次的死活,如果脚标小于0,则不存在,会有个>=0的判断
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if((i-1)>=0 && (j-1)>=0 && cell[i-1][j-1].live)
cell[i][j].others++;
if((i-1)>=0 && cell[i-1][j].live)
cell[i][j].others++;
if((i-1)>=0 && (j+1)<10 && cell[i-1][j+1].live)
cell[i][j].others++;
if((j-1)>=0 && cell[i][j-1].live)
cell[i][j].others++;
if((j+1)<10 && cell[i][j+1].live)
cell[i][j].others++;
if((i+1)<10 && (j-1)>=0 && cell[i+1][j-1].live)
cell[i][j].others++;
if((i+1)<10 && cell[i+1][j].live)
cell[i][j].others++;
if((i+1)<10 && (j+1)<10 && cell[i+1][j+1].live)
cell[i][j].others++;
switch(cell[i][j].others)
{
case 2:break;
case 3:cell[i][j].live=true;break;
default:cell[i][j].live=false;break;
}
}
//停一下,再去显示和计算下一次
sleep(10);
//清屏处理下次画的位置等,我是在linux试的,所以把这些全去掉了。
//clrscr();
}
return 0;
}
另外,我觉得other不需要在结构体里定义,其实只要有一个临时变量就可以了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询