标题:感觉良好,运行糟糕,生命游戏,求助高手
取消只看楼主
uppermore
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2010-7-20
结帖率:66.67%
已结贴  问题点数:20 回复次数:0 
感觉良好,运行糟糕,生命游戏,求助高手
自学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');
    }
}
搜索更多相关主题的帖子: 生命游戏 感觉 运行 
2010-08-02 14:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-314597-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.272255 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved