您的位置:首页 > 编程语言 > C语言/C++

C++: 生命游戏(模拟细胞群演化)

2016-05-28 16:16 381 查看
生命游戏是由英国剑桥大学数学家John Conway提出的,游戏的规则是这样的,在一个M*N棋盘上,每格只有两个状态, “生”和“死”,分别表示是否被一个生命棋子所占有.每个方格有八个邻格,游戏的规则如下:

a) 对于处在“生”状态的格,若八个邻居中当前有2个或3个“生命”,则继续保持存活状态,否则在下一个状态,将因过于孤独或过于拥挤而死亡.

b) 对于处在“死”态的空格,若八个邻格中有3个“生命”,则该格在下一状态将转变为“生命”(代表繁衍过程),否则继续空着. 

游戏中的所有生命棋子依据上述确定的局部规则作同步更新,一代繁殖一代地进行着。

用C++进行摸拟

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<unistd.h>
using namespace std;

void init();
void printArea();
void evol();
int surroundingLifeCount(int y, int x);

bool** cells;
int lenArea;
int amount;

int main(void) {
cout << "输入网格宽度: ";
cin >> lenArea;
cells = new bool*[lenArea];
for(int i=0;i<lenArea;i++) cells[i] = new bool[lenArea];
cout << "输入初始个数: ";
cin >> amount;
init();
while(true) {
system("cls");
printArea();
evol();
sleep(1);
}
}

void init() {
srand(time(NULL));
for(int i=0;i<lenArea;i++) for(int j=0;j<lenArea;j++) cells[i][j] = false;
for(int i=0;i<amount;i++) {
int m = rand()%lenArea,n = rand()%lenArea;
if(cells[m]
) {i--;continue;}
else cells[m]
= true;
}
}

void printArea() {
for(int i=0;i<lenArea;i++) {
for(int j=0;j<lenArea;j++)
if(cells[i][j]) cout << " " << "*";
else cout << "  ";
cout << endl;
}
}

void evol() {
int lifeCount, x, y;
for(int i=0;i<lenArea;i++) {
for(int j=0;j<lenArea;j++) {
lifeCount = surroundingLifeCount(i,j);
if(cells[i][j]) if(lifeCount<2 || lifeCount>3) cells[i][j] = false;
if(cells[i][j]==false && lifeCount==3) cells[i][j] = true;
}
}
}

int surroundingLifeCount(int y, int x) {
int curY, curX;
int lifeCount = 0;
for(curY=y-1;curY<=y+1;curY++)
for(curX=x-1;curX<=x+1;curX++)
if( !(curX==x&&curY==y) && curY>=0 && curY<lenArea && curX>=0 && curX<lenArea && cells[curY][curX]) lifeCount++;

return lifeCount;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 算法