标题:生命游戏,有人玩过吗?
只看楼主
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
结帖率:100%
已结贴  问题点数:20 回复次数:12 
生命游戏,有人玩过吗?
翻以前的资料时,找到一个很久以前用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
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
得分:7 
貌似看到别人博客写过,自己就没有玩过了

用心做一件事情就这么简单
2011-12-26 21:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
呵呵,这个游戏的意义主要在于观察在不同生存规则下细胞的活动状态。

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

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

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

重剑无锋,大巧不工
2011-12-27 10:50
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:7 
好玩

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-12-27 11:04
Afah
Rank: 2
等 级:论坛游民
帖 子:40
专家分:70
注 册:2011-8-28
得分:7 
呵呵,挺好玩的
2011-12-27 11:42
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
ImCharlie
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-2-25
得分:0 
学习一下
2012-01-02 15:40
ImCharlie
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-2-25
得分:0 
回复 楼主 beyondyf
conio.h不是标准库,linux下编译不过
2012-01-02 15:42
ncnmnb
Rank: 2
等 级:论坛游民
帖 子:21
专家分:13
注 册:2011-11-26
得分:0 
360提示病毒。。晕
2012-01-02 17:05
wudijiangjun
Rank: 2
等 级:论坛游民
帖 子:2
专家分:20
注 册:2011-6-5
得分:0 
回复 9楼 ncnmnb
呵呵呵   我这也提示了
2012-01-02 18:11



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




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

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