单页玩具:关于元胞自动机/生命游戏

百度百科:元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。

维基百科:细胞自动机又称格状自动机、元胞自动机,是一种离散模型,在可计算性理论、数学及理论生物学都有相关研究。它是由无限个有规律、坚硬的方格组成,每格均处于一种有限状态。整个格网可以是任何有限维的。同时也是离散的。每格于t时的态由t-1时的一集有限格(这集叫那格的邻域)的态决定。每一格的“邻居”都是已被固定的。(一格可以是自己的邻居。)每次演进时,每格均遵从同一规矩一齐演进。就形式而言,细胞自动机有三个特征:

平行计算(parallel computation):每一个细胞个体都同时同步的改变
局部的(local):细胞的状态变化只受周遭细胞的影响。
一致性的(homogeneous):所有细胞均受同样的规则所支配。

以上均为复制粘贴,看不进去也不要紧。

以下是一些引子,不想看也没关系。

小的时候在老师的教辅书上看到过一道数学题,讲的是驴打滚的问题。比如你有十头驴A1-A10,都脚朝天躺着。你这个时候抽一头驴,这头驴自己就翻过来了,但是旁边的驴也受到了惊吓,也翻了个身。也就是说你抽A7一鞭子,A6,A7,A8都翻个身。问的是你一共要抽多少鞭子才能让驴子们都翻过来。

高中玩河洛的《三国群侠传》,为了拿青龙偃月刀,龙蛇老人让你玩一个小游戏。5X5摆放25张卡片,每张分正反两面,正面是一条龙,背面是一条蛇。随机正反面开局,每次你可以翻一张牌,但是同时它上下左右的牌也会跟着反转。如果你全部翻到了龙面,那你就能拿青龙偃月刀,反之给你腾蛇点刚矛。很有趣的设定。(这类小游戏有时间也想做来玩玩)

这两个引子跟元胞自动机有种奇妙的对称感。驴打滚和翻龙牌都是一回合你可以选一个点改变,然后这个点会对一个有限范围产生批量的作用。而元胞自动机恰恰相反,每一回合每一个点都会自发的改变,而它改变的原则是根据一个有限的范围计算而来。

我们把驴打滚的游戏改成元胞自动机试一试。我们把人抽鞭子的过程丢掉,让十头驴变成一台“生命机器”:每头驴不再看人的脸色行事,它们改看身边的驴怎么站——简单来说,就是一头驴子的状态,取决于上一回合左右边两头驴的状态。我们可以设定一个规则,比如两头驴状态一样(同时站着或者同时翻着),中间这头驴就站着。两头驴状态不一样,中间这头驴就翻着。这就是一个一维元胞自动机。

而我们常见的元胞自动机是二维的,通常一个格子的状态,取决于上一个回合周围一圈八个格子的状态。

下面是之前做的一个简单的元胞自动机。今天正好做了一波优化,可以试试玩一玩。

项目是用纯单页写的,没有打包。引入vue是为了方便动态渲染。

大小没做限制,不过还是建议在100以内。如果你电脑最够强你可以试试 - 为了防止超标100以上咱把缓存去掉了,如果卡死刷新即可恢复。

- Endding -

👈返回首页

Sagi.2020/2/2更新