生命游戏
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;
}
}
}
}
改进一下:
使用一个标志位,每次更新要扫描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;
}
}
}
}
相关文章推荐
- 生命游戏简介及算法分析(整理)
- 使用PySide实现生命游戏
- 2018年第八届蓝桥杯 JavaB组国赛 第二题 生命游戏 解答
- 走进分形曲线和生命游戏探索
- 用c语言演绎“生命游戏”
- React实现生命游戏
- 一个关于生命游戏的程序
- 练手:康威生命游戏demo
- 康威生命游戏的学习
- 用生命在做游戏
- 刷屏新工具:史上最壮观的生命游戏构造图
- 生命游戏
- 算法思考--------生命游戏
- leetcode 289. Game of Life 生命游戏
- LeetCode 289. Game of Life(生命游戏)
- [LeetCode] Game of Life 生命游戏
- 用javascript实现元胞自动机的生命游戏
- python 实现康威生命游戏
- 详解Python 实现元胞自动机中的生命游戏(Game of life)
- 自己拿ruby写的一个简单的生命游戏