您的位置:首页 > 其它

生命游戏

2011-01-14 09:24 232 查看
生命游戏类似细胞分裂,用QT实现了生命游戏,虽然代码简单,但是看了一下生命图变化,感觉挺有趣的。

改进一下:

使用一个标志位,每次更新要扫描2遍数组,时间多了一倍,但程序简单

typedef enum{
DEAD = 0,
LIFE
}LifeState;

typedef struct{
LifeState s; //当前的生命状态
bool stateChangeFlag; //生命状态改变的标志位
}LifeUnit;

const int ArraySize = 1000;
LifeUnit gLifeArray[ArraySize+1][ArraySize+1];

void InitLifeArray(){

for( int i = 1; i < ArraySize; i++ ){
for( int j = 1; j < ArraySize; j++ ){
if( ( i % 27 == 0 ) || ( j % 29 == 0 ) ){
gLifeArray[i][j].s = LIFE;
gLifeArray[i][j].stateChangeFlag = false;
}
else{
gLifeArray[i][j].s = DEAD;
gLifeArray[i][j].stateChangeFlag = false;
}
}
}
//the edge ( up and down )
for( int j = 0; j <= ArraySize; j++ ){
gLifeArray[0][j].s = DEAD;
gLifeArray[ArraySize][j].s = DEAD;
}
//the edge( left and right )
for( int k = 0; k <= ArraySize; k++ ){
gLifeArray[k][0].s = DEAD;
gLifeArray[k][ArraySize].s = DEAD;
}

}

void CalculateAndUpdateLifeArray(){
int lifeCount = 0;

for( int i = 1; i < ArraySize; i++ ){
for( int j = 1; j < ArraySize; j++ ){

lifeCount = gLifeArray[i-1][j-1].s + gLifeArray[i-1][j].s + gLifeArray[i-1][j+1].s + gLifeArray[i][j-1].s
+ gLifeArray[i][j+1].s + gLifeArray[i+1][j-1].s + gLifeArray[i+1][j].s + gLifeArray[i+1][j+1].s;

if( gLifeArray[i][j].s ){
switch( lifeCount ){
case 0:
case 1:

case 4:
case 5:
case 6:
case 7:
case 8:
gLifeArray[i][j].stateChangeFlag = true;
break;
default:
gLifeArray[i][j].stateChangeFlag = false;
break;
}
}
else{
if( lifeCount == 3 )
gLifeArray[i][j].stateChangeFlag = true;
else
gLifeArray[i][j].stateChangeFlag = false;

}
}
}

for( int i = 1; i < ArraySize; i++ ){
for( int j = 1; j < ArraySize; j++ ){
if( gLifeArray[i][j].stateChangeFlag ){
gLifeArray[i][j].s = (LifeState)( 1 - gLifeArray[i][j].s );
}
}
}
}

改进前:

const int ArraySize = 1000;

unsigned short gLifeArray[ArraySize+1][ArraySize+1]; //+1使边界处理简单化

void InitLifeArray(){

for( int i = 1; i < ArraySize; i++ ){
for( int j = 1; j < ArraySize; j++ ){
if( ( i % 27 == 0 ) || ( j % 29 == 0 ) )
gLifeArray[i][j] = 0;
else
gLifeArray[i][j] = 0;
}
}

//边界的生命数初始为0,并且后面计算也一直为0
//the edge ( up and down )
for( int j = 0; j <= ArraySize; j++ ){
gLifeArray[0][j] = 0;
gLifeArray[ArraySize][j] = 0;
}
//the edge( left and right )
for( int k = 0; k <= ArraySize; k++ ){
gLifeArray[k][0] = 0;
gLifeArray[k][ArraySize] = 0;
}

}

//使用定时方式调用此函数

void CalculateAndUpdateLifeArray(){
int lifeCount = 0;

for( int i = 1; i < ArraySize; i++ ){
for( int j = 1; j < ArraySize; j++ ){

lifeCount = gLifeArray[i-1][j-1] + gLifeArray[i-1][j] + gLifeArray[i-1][j+1] + gLifeArray[i][j-1]
+ gLifeArray[i][j+1] + gLifeArray[i+1][j-1] + gLifeArray[i+1][j] + gLifeArray[i+1][j+1];

if( gLifeArray[i][j] ){
switch( lifeCount ){
case 0:
case 1:
case 4:
case 5:
case 6:
case 7:
case 8:

//这里我只是简单的直接改变生命数组,这会影响后面的计算(改进:可以用辅助的数组或者链表来暂存,最后再去改变生命数组)
gLifeArray[i][j] = 0;
break;
default:
break;
}
}
else{
if( lifeCount == 3 )
gLifeArray[i][j] = 1;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: