感觉良好,运行糟糕,生命游戏,求助高手
自学C,试着写了一个关于生命游戏的小程序,运行的时候显示得太离谱了。所谓旁观者清,望高手帮忙看看/*
** 生命游戏,结构字符版
** 本世纪70年代,人们曾疯魔一种被称作“生命游戏”的小游戏,这种游戏相当简单。
** 假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。
** 游戏规则如下:
** 1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),
** 则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;
** 2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
** 3. 在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
** 依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。该游戏之所以被称为“生命游戏”,
** 是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,
** 会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。
*/
#include "stdio.h"
#include "conio.h"
/*
** 定义活细胞,死细胞的符号
*/
#define CELL_ALIVE 1
#define CELL_DEAD '#'
/*
** 细胞个数 M * N
*/
#define M 50
#define N 50
/*
** 方向常量
*/
int const cell_direct[8][2] = {{-1,-1},{ 0,-1},{ 1,-1},
{-1, 0}, { 1, 0},
{-1, 1},{ 0, 1},{ 1, 1}};
/*
** 细胞数组,活细胞的值为1,死细胞为0
*/
int cell_map[M][N];
void cell_d_or_al(int,int);
int cell_isoffside(int,int,int,int);
void cell_nexttime();
void cell_init();
void cell_print();
/*
** 判断细胞生死,x和y是细胞的坐标,也就是中间的那个细胞的坐标
*/
void cell_d_or_al(int x,int y)
{
/*
** i用来查询细胞周围的八个细胞,count记录八个细胞中活细胞的个数
*/
int i,count;
count = 0;
for(i = 0;i < 8;i++)
{
/*
** 数活细胞个数,越界检查
*/
count += cell_isoffside(x,y,cell_direct[i][0],cell_direct[i][1]);
}
/*
** 如果周边细胞有三个活着,无论如何中间的细胞都是活的
** 如果周边细胞有三个以上活的,细胞饿死,或者周边活细胞数小于2,细胞就孤独而死
** 如果周边细胞等于二,该细胞死活状态不变
*/
if(count == 3) cell_map[x][y] = 1;
if(count > 3 || count < 2) cell_map[x][y] = 0;
}
/*
** 判断给定细胞周边的细胞时候越界(细胞数组)
*/
int cell_isoffside(int x,int y,int cell_dir_x,int cell_dir_y)
{
x += cell_dir_x;
y += cell_dir_y;
/*
** 细胞坐标加上方向常量后,越界等同于存在一个死细胞,返回0
** 否则返回细胞的状态。
*/
if(x < 0 || x > N-1 || y < 0 || y > M-1) return 0;
return cell_map[x][y];
}
/*
** 计算下一刻所有细胞的状态
*/
void cell_nexttime()
{
int i,j;
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
cell_d_or_al(i,j);
}
}
}
/*
** 假设刚开始所有的细胞都是活的
*/
void cell_init()
{
int i,j;
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
cell_map[i][j] = 1;
}
}
}
main()
{
int i;
cell_init();
cell_print();
getch();
for(i = 0;i < 30;i++)
{
cell_nexttime();
cell_print();
getch();
}
}
/*
** 在屏幕上显示细胞
*/
void cell_print()
{
int i,j;
gotoxy(1,1);
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
if(cell_map[i][j] == 0) putchar(CELL_DEAD);
putchar(CELL_ALIVE);
}
putchar('\n');
}
}