这是使用 Rust 和 WebAssembly 的未发布文档,已发布的文档可在Rust 和 WebAssembly 文档网站上找到。此处记录的功能可能在 Rust 和 WebAssembly 工具的发布版本中不可用。

康威生命游戏的规则

注意:如果您已经熟悉康威生命游戏及其规则,可以跳过下一节!

维基百科对康威生命游戏的规则进行了很好的描述

生命游戏的宇宙是一个无限的二维正交网格,由方形单元格组成,每个单元格都处于两种可能的状态之一:存活或死亡,或“已填充”或“未填充”。每个单元格与其八个邻居交互,这些邻居是水平、垂直或对角线相邻的单元格。在时间的每个步骤中,都会发生以下转换

  1. 任何存活的单元格,如果其存活的邻居少于两个,则会死亡,就好像是由人口不足造成的。

  2. 任何存活的单元格,如果其存活的邻居有两个或三个,则会存活到下一代。

  3. 任何存活的单元格,如果其存活的邻居超过三个,则会死亡,就好像是由人口过剩造成的。

  4. 任何死亡的单元格,如果其存活的邻居恰好有三个,则会变成存活的单元格,就好像是由繁殖造成的。

初始模式构成了系统的种子。第一代是通过将上述规则同时应用于种子中的每个单元格来创建的——出生和死亡同时发生,发生这种情况的离散时刻有时被称为滴答(换句话说,每一代都是前一代的纯函数)。规则继续重复应用,以创建进一步的世代。

考虑以下初始宇宙

Initial Universe

我们可以通过考虑每个单元格来计算下一代。左上角的单元格是死亡的。规则 (4) 是唯一适用于死亡单元格的转换规则。但是,由于左上角的单元格没有恰好三个存活的邻居,因此转换规则不适用,它在下一代中仍然是死亡的。第一行中的其他每个单元格也是如此。

当我们考虑第二行第三列的顶部存活单元格时,事情变得有趣起来。对于存活的单元格,前三个规则中的任何一个都可能适用。在这个单元格的情况下,它只有一个存活的邻居,因此规则 (1) 适用:这个单元格将在下一代中死亡。底部存活单元格也面临同样的命运。

中间存活单元格有两个存活的邻居:顶部和底部的存活单元格。这意味着规则 (2) 适用,它在下一代中仍然存活。

最后几个有趣的情况是中间存活单元格左侧和右侧的死亡单元格。三个存活的单元格都是这两个单元格的邻居,这意味着规则 (4) 适用,这些单元格将在下一代中变成存活的。

将所有这些放在一起,我们得到下一滴答后的这个宇宙

Next Universe

从这些简单、确定性的规则中,出现了奇怪而令人兴奋的行为

戈斯珀滑翔机枪脉冲星宇宙飞船
Gosper's glider gun Pulsar Lighweight space ship

练习

  • 用手计算我们示例宇宙的下一个滴答。有没有发现什么熟悉的东西?

    答案

    它应该是示例宇宙的初始状态

    Initial Universe

    这种模式是周期性的:它在每两次滴答后返回到初始状态。

  • 你能找到一个稳定的初始宇宙吗?也就是说,一个宇宙,其中每一代都永远相同。

    答案

    有无限多个稳定的宇宙!最简单的稳定宇宙是空宇宙。一个 2x2 的存活单元格方块也是一个稳定的宇宙。