3

以 Minecraft 中的红石为例 - 它基本上是一个 15 状态元胞自动机,具有以下基本规则:

Redstone -> Redstone, powered of level Max(neighbours)-1

以及各种连接元素的附加规则

Repeater, inactive -> Repeater, active, level 2 if its input is powered
Repeater, active, level 2 -> Repeater, active, level 1
Repeater, active, level 1 -> Repeater, inactive
Redstone, unpowered -> Redstone, powered if there is a neighbouring Repeater, level 1 or another source

(我已经写了更多关于如何使用 CA 实现 Minecraft 的东西:http: //madflame991.blogspot.com/2011/10/cellular-automata-in-minecraft.html

现在,我的问题是:游戏将如何更新巨大的红石装置?它使用什么数据结构?它真的是作为元胞自动机实现的吗?如果不是,那么您的最佳猜测是什么?

PS 我不是要任何人看一下实际的源代码,只是想推测一下这个技术是如何实现的。...我在这里发布这个,在 SO 上,而不是在 gamedev 上,因为这是一个 CA 问题,而不是一个与 gamedev 相关的问题。

4

3 回答 3

1

另一种模拟令人难以置信的大规模元胞自动机(例如Game of Life 中的 Game of Life)的可能方法是检测模式(滑翔机、滑翔机发电机等)并预测它们的未来演变并仅计算未知的部分(滑翔机进化)。

于 2016-05-20T14:16:53.437 回答
0

显而易见的方法是将世界划分为多个块(嘿,我的世界已经这样做了!)并将每个块分配给一个服务器。每个服务器负责处理对该块的更新,并负责与负责相邻块的服务器通信,向它们传播状态。

在像这样的元胞自动机的情况下,每个块必须将其边缘单元的当前状态传达给所有相邻的块,反之亦然,然后才能增加时间步长。请注意,通信开销随着块的增大而减少,因为块区域随着 O(n^2) 的增长而增长,而周长仅随着 O(n) 的增长而增长。

实际上,我怀疑你会发现它几乎没有那么同步,并且每个块异步模拟其中的红石,仅在事件发生时将更新传输到相邻块,并且不尝试与其他人保持同步。

于 2012-04-27T04:23:44.227 回答
0

Hashlife ( 1 ) 可以通过在非常大的空间上加速计算来满足您的需求。

于 2016-12-02T14:26:53.007 回答