C语言运行糟糕,感觉良好,运行糟糕,生命游戏,求助高手

已结贴√

问题点数:20 回复次数:1

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

感觉良好,运行糟糕,生命游戏,求助高手

6e7baff6766b1f5a3e042834c7f287b0.gif自学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');

}

}

搜索更多相关主题的帖子:

生命游戏 感觉 运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值