| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2018 人关注过本帖
标题:生命游戏,有人玩过吗?
取消只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
生命游戏,有人玩过吗?
翻以前的资料时,找到一个很久以前用C#写的生命游戏。呵呵,勾起很多美好的回忆。不知道各位玩过这个游戏没有。
如果不了解这个游戏,请百度一下。下面发一个控制台下的简化版的生命游戏,有兴趣可以自己编译玩一下。
用的都是标准函数,应该是什么编译器都可以编译,玩的时候最好把控制台窗口放大点。
细胞初始率在20%-60%之间比较好玩
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>

#define WIDTH    60
#define HEIGHT    30

char map[HEIGHT][WIDTH];

void init_instanse()
{
    srand(time(NULL));
}

void init_map(int p)
{
    int i, j;
    for(i = 0; i < HEIGHT; i++)
    for(j = 0; j < WIDTH; j++)
        map[i][j] = (rand() % 100) < p ? 1 : 0;
}

void display()
{
    char str[(WIDTH + 1) * HEIGHT + 1];
    int i, j, p;
    for(p = i = 0; i < HEIGHT; i++)
    {
        for(j = 0; j < WIDTH; j++)
            str[p++] = map[i][j] ? '*' : ' ';
        str[p++] = '\n';
    }
    str[p] = '\0';
    system("cls");
    puts("Press any key to exit.\n");
    puts(str);
}

void delay(int ms)
{
    time_t now;
    now = clock();
    now += ms;
    while(now > clock());
}

int get_neighbor(int r, int c)
{
    int count = 0;
    if(r - 1 >= 0 && c - 1 >= 0 && map[r - 1][c - 1]) count++;
    if(r - 1 >= 0 && map[r - 1][c]) count++;
    if(r - 1 >= 0 && c + 1 < WIDTH && map[r - 1][c + 1]) count++;
    if(c - 1 >= 0 && map[r][c - 1]) count++;
    if(c + 1 < WIDTH && map[r][c + 1]) count++;
    if(r + 1 < HEIGHT && c - 1 >= 0 && map[r + 1][c - 1]) count++;
    if(r + 1 < HEIGHT && map[r + 1][c]) count++;
    if(r + 1 < HEIGHT && c + 1 < WIDTH && map[r + 1][c + 1]) count++;
    return count;
}

void step()
{
    char tm[HEIGHT][WIDTH];
    int i, j, neighbor;
    for(i = 0; i < HEIGHT; i++)
    for(j = 0; j < WIDTH; j++)
    {
        neighbor = get_neighbor(i, j);
        switch(neighbor)
        {
            case 0:
            case 1: tm[i][j] = 0; break;
            case 2: tm[i][j] = map[i][j]; break;
            case 3: tm[i][j] = 1; break;
            case 4:
            case 5:
            case 6:
            case 7:
            case 8: tm[i][j] = 0; break;
        }
    }
    for(i = 0; i < HEIGHT; i++)
    for(j = 0; j < WIDTH; j++)
        map[i][j] = tm[i][j];
}

int main()
{
    int i;
    init_instanse();
    printf("输入初始细胞存在率(0 - 99)% : ");
    scanf("%d", &i);
    init_map(abs(i) % 100);
    while(!kbhit())
    {
        display();
        delay(100);
        step();
    }
    return 0;
}
收到的鲜花
  • 于祥2011-12-27 16:37 送鲜花  2朵   附言:我很赞同
搜索更多相关主题的帖子: 游戏 百度一下 编译器 控制台 color 
2011-12-26 20:22
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,这个游戏的意义主要在于观察在不同生存规则下细胞的活动状态。

step函数中的switch块就是控制生存规则的,各位可以偿试各种规则并观察结果。

在目前的规则下,可以看到细胞的出现、消亡、形成细胞团、以及转移吞噬其它细胞等等。

修改规则,配合初始存在率,你可以看到类似癌细胞出现,扩散并占据整个空间的过程

重剑无锋,大巧不工
2011-12-27 10:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
SymbolSpace.rar (5.54 KB)
这个小程序就是另一组规则下的表现(C#写的,需要.net 2.0以上的支持)。
在我的理解,初始图像中的点就是癌细胞,其实它们普遍存在,但要生存需要一定环境。
所以点击next后可以观察到,大部分细胞都消亡了。还有一部分形成了稳定的小细胞结构(良性肿瘤?)。
还有极少数(几个到十几个)处在了合适的环境中,开始扩散,吞噬其它细胞,最后占据整个空间。

呵呵,当然,这一过程是我实验后选择的一个临界状态,当细胞存在率过低时,不会(或很难)形成可发展的细胞。而存在率过高时,瞬间就吞噬天地了。

实验的感想。
我觉得它确实很类似癌细胞的发展过程。
我们的身体里随时都有这样的变异细胞,只不过由于得不到适合的生存环境,变异不久后就消亡了。
健康的生活使变异的几率维持在低水平,所以得癌症的几率非常小。
现代的生活,生活节奏被打乱,到处充斥着各种化学品,增加了变异几率,或者是创造了适合变异细胞生存的环境,癌变的几率大大增加。

结语。珍爱生命,健康生活

有人吐了没?开个玩笑。生命游戏也是一个社会群落状态的简单研究模型,祝各位玩的开心,玩出自己的心得



[ 本帖最后由 beyondyf 于 2011-12-27 11:45 编辑 ]
收到的鲜花
  • 小鱼儿c2011-12-27 11:55 送鲜花  3朵   附言:小鱼儿向高手问候
  • 小鱼儿c2011-12-27 11:55 送鲜花  3朵   附言:小鱼儿向高手问候

重剑无锋,大巧不工
2011-12-27 11:44
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复8楼,很不好意思,conio.h这个头文件的引用可以删掉。当初引用它是为了通过进程阻塞实现延时的,后来为了兼容,自己写了delay函数,通过查寻系统时间来控制延时。对于多任务系统,这一做法显然是低效的,不过各种系统下都可以工作。之后忘了删除这个引用了

关于360的问题,我建议换杀毒软件。直接发代码,而不是编译好的可执行程序,一方面是为了交流,另一方面就是防止某些杀软误报而发生误会。
6楼发的是可执行程序,如果你的电脑上有.net2.0及以上版本,可以试一下这个,图形界面,无闪烁,效果更好一些。

重剑无锋,大巧不工
2012-01-02 18:52
快速回复:生命游戏,有人玩过吗?
数据加载中...
 
   



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

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