C++ 生命游戏算法

2025年3月25日 | 阅读 4 分钟

在本文中,我们将讨论 C++ 中的生命游戏算法。生命游戏的创造者约翰·霍顿·康威(John Horton Conway)将其定义为一个由 m x n 板组成的细胞自动机。它不是一个桌面游戏,而是一个用于模拟细胞网格中实体之间交互的数学模型。下面是解决该问题所涉及的步骤。

规则

该游戏由一个二维数组组成,其中包含活细胞或死细胞。这些细胞会影响它们的邻居(八个细胞)。这种交互依赖于一些规则,这些规则将决定细胞状态的演变。

规则如下

  • 存活:任何拥有两个或三个活邻居的活细胞将保持存活。此外,任何拥有三个活邻居的死细胞将复活。
  • 死亡:如果活细胞拥有少于两个活邻居,或多于三个活邻居,它们将死亡。

这些规则会反复应用于整个棋盘。迭代形成了一系列代,其中新生成的细胞成为当前一代。在此示例中,我们将学习如何根据任何初始状态返回下一个棋盘状态。

示例

输出

 
The Initial Board is: 
1 0 0 
0 0 1 
1 1 1 
1 0 1 

The New Board is:
0 0 0 
0 0 1 
0 0 1 
1 0 1    

说明

  • 这个C++程序模拟了康威生命游戏的一代。该程序对由活细胞 [1] 或死细胞 [0] 表示的二维细胞网格进行采样,并应用康威的规则,说明不同状态如何从其邻居演变而来。
  • 它通过 `printValues` 函数显示棋盘的状态,而 `countofNeighbors` 通过检查八个可能的相邻细胞来定义特定细胞有多少活邻居。此外,它还确保每个邻居都位于网格边界内,以避免任何错误。
  • 主要逻辑在 `gameOfLifeMethod` 中实现,该方法根据以下规则实现每个细胞的下一个状态:活细胞如果邻居细胞少于两个或多于三个则死亡。死细胞当活邻居细胞数量恰好为三个时复活。为了标记状态转换而不影响其他相邻细胞的计算,标记为死亡的细胞暂时标记为 -1,而任何复活的细胞暂时标记为 2。
  • 在转换步骤中,进行适当的网格映射,使得标记为 -1 的细胞变为 0(死亡),标记为 2 的细胞变为 1(存活)。
  • 主函数初始化棋盘,打印棋盘的初始状态,实现游戏规则,并打印一代之后的新棋盘状态。它确实是一个高效的实现,通过网格进行处理并根据康威生命游戏的规则进行更新。

结论

总之,这个 C++ 实现的康威生命游戏是一种经典的细胞自动机模拟方法。通过对细胞网格的简单细胞规则,我们观察到初始模式随时间的演变。细胞状态易于跟踪。由于使用了临时标记(-1 和 2)来处理转换而不影响相邻细胞的计算,它还能够轻松适应状态之间的转换。该模拟可以为计算科学中复杂的行为和模式提供入门,说明简单的规则如何导致迷人甚至混沌的结果。生命游戏仍然是计算机科学中通过局部交互产生涌现系统行为和进化的领先范例,此实现以一种非常易于理解的方式 exemplifys 了这一概念。