坎德人的小包包

欧剃,游荡的坎德人,在他的旅途中收集了许许多多有趣的东西。

发表日期:2019-07-26

我用便便淹没半个城市,就为了算 20 以内的加法

—— 还为了证明《城市:天际线》是图灵完备的!

作者:Daniel Bali


——还为了证明《城市:天际线》是图灵完备的!

总所周知,逻辑门是现代半导体技术的基础元件,我们可以用它们构建任何电路,也包括图灵完备的电子计算机。

今天要说的《城市:天际线》是一款城市模拟游戏。它具有足够的复杂性,你甚至可以在游戏里构建出通用的逻辑门元件。

没错,就像在《我的世界》中一样,你可以在《城市:天际线》中构建一台计算机。但由于游戏机制的限制,使用这些元件来构建一个现代的集成电路将会相当复杂。

今天,我只打算演示一下如何构建一个 4 位加法器。下面做的一切都是在游戏的原版中完成的,不需要开 mod 或创意工坊的附加组件就能实现。

那么,让我们开始吧!


图片来源:Steam 商店页面

基础元件

与其他城市建设类游戏一样,你需要管理城市的电力和供水。在游戏中,发电厂需要清洁的水和排污口才能发电。水塔能提供清洁的水,排污口能排出污物,而这俩都需要电力才能正常工作。因此,排污口和水塔的特性就让我们得以建造与门(AND)和或门(OR)。


需要用到的主要设施:燃油发电厂,水塔,污水管道(排污口),风力发电机

下图是一个与门(AND)单元的设计图。两个输入端分别是水塔(图中上方)的电源线,以及排污口(图中下方)的电源线。输出端则是发电站的输电线路。虽然在图中两个输入端都是低电平(断开),游戏内的发电站依然会在缺少供水和排污设施的情况下工作上一小段时间,然后才关闭。这些建筑互相之间都要隔开一小段距离,因为如果放的太近(见中图的蓝圈范围),发电厂会直接给上下两个设施供电,导致逻辑门失效。


与门的结构,分别展示了通常视图(上)电力线路图(中)供水线路图(下)中的布局

接下来,为了实现完整的逻辑功能,我们还需要另外一个组件——反相器,或称非门(NOT)。为了实现这个元件,我们需要利用游戏里动态模拟液体流动的机制。在游戏中,配置错误的大坝、运河或是被滥用的排污口,都有可能导致某个建筑物被淹没。被淹没的发电厂将不会产生电力。我们可以利用这个机制,来构建一个非门元件,如下图所示:


非门的结构,分别展示了电力线路图(上)排污口关闭(中)排污口打开(下)的情况

逻辑电路

接下来,我们就可以按照下面的逻辑电路设计图,使用 9 个混合的逻辑门元件,构建一个 1 位加法器(全加器)。4 个这样的全加器可以链接在一起,组成一个 4 位二进制加法器(脉动进位加法器)。我将下图这些组件按网格进行了一下对齐,方便之后在游戏地图上以对应的方式进行布置。


带有进位输入/输出的 1 位加法器

为了不自虐,我选择了无限资金的游戏模式,并且用上了我在地图编辑器中制作的基础地图。

在游戏自带的地图编辑器中,你可以导入一个带有透明度信息的 PNG 图片,编辑器会按照图片自动生成对应高度和形状的游戏底图。如下图所示,我创建了一个由许多正方形岛屿组成的地图,以便我将对应的“逻辑元件”布设在上面——这看起来是不是很像 PCB 电路板?

你可以看到,我将整个地图划分成了“上下左右”四片区域,每片区域里都有 4x4 的格子来容纳一个 1 位全加器。


地图编辑器里的地形图(上)与实际生成的结果(下),确实很像 PCB 有没有

实际连接逻辑电路的过程简直是又麻烦又漫长。因为计算失误,我还被迫重头再来了好几次。

我遇到的问题之一是,电路相互跨越的时候容易连接在一起。经过多次的尝试,我发现需要有足够的高度差,相互交叉的电路才能做到互不干扰。


一个完成了的 1 位全加器。整个图上我做了 4 个这样的东西

最后,我需要在附近建设一个城市,以便产生足够同时淹没 8 个风力发电机的污水。没错,这个“计算机”是靠粑粑来运作的。这可不是什么环保解决方案,每个逻辑门单元都需要用到一座燃油发电厂,所以产生的(游戏内)污染还是挺大的。

调试过程也是充满了艰辛,更别提偶尔发生的雷暴天气还会摧毁一些已经布置好了的输电线路。这挺像宇宙射线对电路产生的影响,只不过更加“永久”一点。


4 位加法器输入端中的一条线路。为了这些复杂的蜘蛛网,死了不知道多少脑细胞了

运行演示

为了更好地显示这些组件是如何工作的,我录了两个视频。在下面这个视频中,我把输入端电路连接上一条高电平的输电线路(就像你给开发板接上直流电源),这些元件就开始工作了。在左边的输入端我设置了 1001(二进制的 9),在中间的输入端我输入了 1110(二进制的 14)。设置完输入之后,我把游戏运行速度调到最快,大概 1 秒之后,右边的5条输出线路全都跳到了 1。接下来就是漫长的运算过程,最后,输出稳定在了 10111(二进制的 23),成功了!

4 位加法器的运行视频,原网址在 https://youtu.be/dD7Bi25IPaA

在第二个视频中,我专门录下了第一个加法器的工作过程。你可以看到,每个元件的状态都在不断变化,直到最后输出一个稳定的结果——求和端口输出为 0,进位端口输出为 1。

1 位加法器的运行视频,原网址在 https://youtu.be/Oa2otcfXCtY

一些说明

首先,用这个办法做出来的逻辑电路运行起来实在是太慢了。一个 4 位加法器需要大约 15 个月的游戏内时间,在现实中用最快速度运行也需要大概 20 分钟。

此外,占用空间也是个问题。由于游戏内的电力输送机制,同一个逻辑门中的各个组件之间必须足够远离,否则电流将不受控制地在组件间流动(怎么有股量子力学里电子隧穿的味道)。正如你所见,一个 4 位的加法器就已经占用了平时游戏中 9 块地块的大部分空间(当然,这也是因为我没怎么费力去优化它)。如果你想作出更复杂的逻辑电路,那估计需要打了 MOD,开上 25 块地块才能装得下。

最后,如果你有更高效地利用游戏机制构建运算单元的思路,欢迎在下面留言分享!谢谢!


图片来源:Steam 商店页面

(本文已投稿给「优达学城」。原作: Daniel Bali ,编译:欧剃,感谢 shadowlsh 对游戏机制的解释。转载请保留此信息)

编译来源: https://medium.com/@balidani/cities-skylines-is-turing-complete-e5ccf75d1c3a

标签:GameTranslateUdacity

Powered by Jekyll on Github.io
2022 © 欧剃