资讯专栏INFORMATION COLUMN

【简单好玩】细胞自动机小游戏

yagami / 3288人阅读

摘要:当前细胞为存活状态时,当周围有个以上的存活细胞时,该细胞变成死亡状态。康威生命游戏的自由有了核心的算法游戏规则,康威生命就是一个具有生命的自由游戏。文件导出导入当然加了扩展功能,保存自己喜欢的细胞自动机成文件。

细胞自动机

备注:文末有自己用Javascript简单实现的网页版细胞自动机(还挺好玩)

什么是细胞自动机

细胞自动机(英语:Cellular automaton),又称格状自动机元胞自动机,它是由无限个有规律、坚硬的方格组成,每格均处于一种有限状态。每格于t时的态由t-1时的一集有限格(这集叫那格的邻域)的态决定。每一格的“邻居”都是已被固定的。每次演进时,每格均遵从同一规矩一齐演进。

当然这个细胞自动机有一个游戏实现 ------康威生命游戏(英语:Conway"s Game of Life)

康威生命游戏规则

生命游戏中,对于任意细胞,规则如下:
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。(如图,黑色为存活,白色为死亡)

当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)

当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。

当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)

当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)

可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。

康威生命游戏的自由

有了核心的算法(游戏规则),康威生命就是一个具有生命的自由游戏。你可以在游戏中创造出自己的细胞世界。周而复始。

自己实现的一个生命游戏

生命游戏其实并不是很复杂,自己实现一个还是挺好玩的。所以自己就用Vue实现了一个小小的生命游戏

核心思想

下一步要做什么,生命游戏最重要就是下一步,不管游戏规则是如何,下一步状态是这个游戏发展的动力。

function nextStep(map) {
let newMap;
    //@TODO对newMap进行核心算法的编写
return newMap;
}

此函数就是游戏的生命,将游戏规则编写进这个函数,Vue只负责渲染这个newMap就好了。

所以我们有以下函数

function nextStep(map) {
            let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0));
            let countAlive = 0;
            for (let i = 1; i < 51; i++) {
                for (let j = 1; j < 51; j++) {
                    countAlive = map[i + 1][j] + map[i - 1][j] + map[i][j + 1] + map[i][j - 1] + map[i + 1][j + 1] + map[i + 1][j - 1] + map[i - 1][j + 1] + map[i - 1][j - 1];
                    if (map[i][j] === 0 && countAlive < 3) {
                        new_map[i][j] = 0;
                    }
                    if (map[i][j] === 1 && 2 <= countAlive && countAlive <= 3) {
                        new_map[i][j] = 1;

                    }
                    if (map[i][j] === 1 && (countAlive > 3 || countAlive < 2)) {
                        new_map[i][j] = 0;
                    }
                    if (map[i][j] == 0 && countAlive === 3) {
                        new_map[i][j] = 1;
                    }
                    countAlive = 0;
                }
            }
            return new_map;
        }

地图扩展,我们的Map默认定了一个50*50的二位数组,可是考虑到边界对细胞算法影响,我们扩展地图,将地图作为52*52的二位数组。这样然这个50*50的二位数组最外面包多一层,看控制边界对细胞算法影响。细胞只在内层50*50数组内繁衍。

let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0));

文件导出导入 当然加了扩展功能,保存自己喜欢的细胞自动机成文件。

速度的调整 扩展功能,调整下一步的速度。

实现的效果

Gayhub源代码,喜欢就给个Star

戳=>>>>>>>>>>细胞自动机

这是一个分割线!

最新版本的细胞自动机用了koa2进行了重构噢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81375.html

相关文章

  • 康威生命游戏简单实现

    摘要:生命游戏,数学家发明的一个游戏,又称康威生命演化,生命棋,细胞自动机。康威有许多好玩有趣的发明,最广为人知的一个是外观数列,这里不多说,另一个就是生命游戏。生命游戏模拟的是二维平面上生命的演化过程。 生命游戏,数学家 John Conway 发明的一个游戏,又称康威生命演化,生命棋,细胞自动机。 康威有许多好玩有趣的发明,最广为人知的一个是外观数列(Look-and-Say),这里不多...

    ccj659 评论0 收藏0
  • C++Qt开发-单线程实现生命游戏

    摘要:生命游戏规则生命游戏中,对于任意细胞每个细胞有两种状态存活或死亡。每个细胞与以自身为中心的周围八格细胞产生互动。繁衍函数死亡函数生存和死亡函数,由函数调用。 生命游...

    szysky 评论0 收藏0
  • 一个简单细胞分裂游戏

    摘要:地址是主要用到了来画,实现很简单,分享如下一个圆,中心点坐标,半径给自己绑定一个点击事件,删除自己,创建四个新圆,中心点位置分别是当前半径四种组合,半径设为一半 地址是http://codepen.io/fishenal/full/EDxGL 主要用到了raphael.js来画svg,实现很简单,分享如下 var paper = Raphael(0, 0, 1000, 1000) ...

    Pink 评论0 收藏0
  • python机器/深度学习项目汇总

    摘要:作者微信公众号的皮卡丘欢迎大家搜索关注知乎机器学习美颜简单品读小说实现颜值预测预测比赛结果制作且版飞机大战实现简单的换脸术遗传算法拟合图像实现猫脸检测分析个人音乐收藏垃圾邮件识别深度学习强化学习玩破解游戏实现简单的机器翻译模型学写作实现文本 作者:Charles微信公众号:Charles的皮卡丘(欢迎大家搜索关注)知乎:https://zhuanlan.zhihu.com/p/... ...

    toddmark 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<