Tetris (NES, Nintendo) 游戏错误

来自俄罗斯方块中文维基
imported>風洛霊flore2024年10月20日 (日) 22:06的版本 →‎参考资料
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

本条目收录 Tetris (NES, Nintendo)(NES 版俄罗斯方块,常被称为「经典俄罗斯方块」)中的主要游戏错误(Glitch 或 Bug)。

这些游戏错误通常发生在较高等级,只有少数有能力在最高重力下长时间生存的玩家能达到;同时,大部分错误并没有严重到影响游戏正常运行,只是产生肉眼可见的画面变化;这些错误还往往会进一步提升游戏难度。因此,在 NES 方块玩家社区中,玩家们普遍并不厌恶它们,反而将抵达特定等级触发这些错误视为里程碑式的游戏成就。

升级行数错误

表现

升级行数错误是在选择 Lv10 及以上的开始游戏等级时一定会触发的错误。尽管正常情况下应该是每级对应 10 行、抵达下一级对应行数后升级,但如果选择 Lv10 ~ Lv19 开始,游戏会提前升级,导致此后的行数总是比正常情况更少。

具体而言,当选择 Lv10 ~ Lv15 开始游戏,都会在 100 行就提前升至下一级,相当于分别提前了 10 ~ 60 行;选择 Lv16 ~ Lv19 开始游戏则均提前了 60 行,在 110 ~ 140 行升至下一级。

该错误使玩家更快抵达 Lv29 最高重力,一定程度上倒逼玩家在更少的可用行数中提高得分效率。由于该错误极易被发现,也存在其被设计者故意保留来增加游戏难度的推测。不过,与该错误同样的原因导致了大后期更加严重的超长等级错误。

原理

为实现每级对应 10 行、抵达下一级对应行数后升级,游戏的判断逻辑是:每当行数抵达 10 的倍数时,考察当前等级是否落后于该行数对应的等级,如果落后就升级。实现方法是将行数除以 10 之后与等级数比较。

然而,由于 NES 机器的硬件限制,游戏需要尽量节约内存和减少计算。如果行数以正常的二进制数存储,则每次将其转化为十进制数显示在屏幕上都需要麻烦的操作:游戏需要获知其作为十进制数时每一位的数字,然后才能分别寻找对应数字贴图。考虑到 4 个二进制位就足以覆盖十进制的 0 ~ 9,因此将每一位都分别计算出来、各使用 1 个字节(8 个二进制位)去存储是效率较低的做法。因此,行数实际上是以二进码十进数(BCD 码)的形式存储的。在该形式下,每四个二进制位都可以读成十进制的一位数字,类似于十六进制。而每当后四位抵达十进制的 10,也就是二进制的 1010、十六进制的 A 时,只需提前进位(前四位 +1,后四位重置为 0000)就可以保证不会出问题。这样,以 BCD 码存储的数字只需以十六进制来表示,「看起来」就总是准确的十进制数。

例如,56 以二进制表示为 111000。如果直接将其存储为 00111000,在使用时分别计算出十位与个位并分别存储为 00000101 与 00000110,显然既麻烦又不经济。游戏选择以 BCD 码的形式将其存储为 01010110,前四位 0101 可以读出 5,后四位 0110 可以读出 6,用十六进制表示为 56,「看起来」是准确的十进制数,但实际上在十进制里等于 86。

然而,当行数除以 10 与等级作对比时,设计者忘记了转换进制。当玩家消除 100 行时,游戏内实际存储的是 100 的 BCD 码,也就是十六进制的 100,相当于十进制的 256。但游戏直接用这个十六进制的 100 除以十六进制的 10,得到十六进制的 10,也就是十进制的 16、二进制的 00010000,去和等级作对比。然而等级数字是以正常的二进制数存储的,因此 Lv10 ~ Lv15 就存储为正常的二进制 00001010 ~ 00001111,相当于十进制准确无误的 10 ~ 15。于是游戏认为等级数已经落后于行数,从而在 100 行就提前升级。Lv16 ~ Lv19 也是同理,当玩家消除到 110 ~ 140 行时,游戏会用十六进制的 11 ~ 14、相当于十进制的 17 ~ 20 去与等级作对比,因此升级。

等级显示错误

表现

等级显示错误是在抵达 Lv30 时一定会触发的错误。从 Lv30 开始的所有等级,画面右下角的等级计数器会错乱,不显示正常的当前等级,而显示为其他的十六进制数。

该错误使玩家无法快速获知当前等级,但不影响正常游玩。玩家也可以通过画面上方的行数计数器简单地反推出当前等级。

原理

升级行数错误章节中已述,由于将二进制数转化为十进制数显示在屏幕上并不轻松,游戏采用了 BCD 码的手段。但与行数直接以 BCD 码存储、逢 1010 提前进位不同,等级数是以二进制正常存储的,因此需要先换算为 BCD 码再显示。

为减少运算,游戏内置了一个列表,等级数直接查表即可转换。然而为了节约空间,该列表只包含了 0 ~ 29 对应的 BCD 码。这是因为 NES 方块的重力在 Lv29 升至最高,一般认为设计者预想中玩家不可能在此速度下存活,从而不会抵达更高等级。因此当真的抵达 Lv30 及更高后,查表的操作就越界读取了列表之外的其他数据,从而显示错误数字。

更进一步地,玩家发现该 BCD 码列表后面的区域是一个「10 的倍数」列表,一共包括 20 个数字。因此 Lv30 ~ Lv49 被依次转换为 0 10 20 … 190,显示为十六进制数 00 0A 14 … BE。到了 Lv50 及以后,游戏会读取再之后区域的内存,显示的又是其他内容,此处不再列出。

玩家文化

Thor 首次抵达 Lv30 的视频录像,
可见右下角等级显示为 00

如果玩家有能力在最高重力下持续存活,那么等级显示错误是玩家会遇到的第一个游戏错误,因此被玩家社区视为第一个里程碑。

历史表明,使用传统长按指法的玩家的确长期认为 Lv29 的最高重力不可游玩,玩家社区还称之为「必死重力」(Killscreen[注 1])。但是,使用连点(Hypertap)等快速点击的方法可以在该速度下堆叠和消行,抵达更高等级。这超出了设计者的预期,从而触发了等级显示错误。

2011年1月30日,使用连点指法的 Thor Aackerlund 达成了有视频记录的第一个 Lv30,同时也成为第一个触发等级显示错误的玩家。从录像中可见,画面右下角的等级计数器显示为错误的 00。

颜色错误

表现

NES 方块全部等级的方块配色

颜色错误Glitched Colours)是在抵达 Lv138 时一定会触发的错误。从 Lv138 开始的所有等级,下落方块的颜色不再使用原本的固定配色方案,变为各种预期之外的、未被设计的错误配色。

具体而言,游戏原本设计的配色方案共有 10 种,依次使用,每 10 级一循环。颜色错误则导致 54 种错误配色方案,在 Lv138 ~ Lv191 依次使用一遍后,在 Lv192 ~ Lv255 又依次使用了 10 种原本配色 + 54 种错误配色,其中原理见下一小节。

该错误影响玩家观察方块与场地,从而影响玩家的反应时间,使得生存难度进一步提升。个别错误配色非常难以辨认,因此在玩家社区中「臭名昭著」并获得了专属昵称。

原理

NES 方块的 10 种正常配色方案存储在一个颜色列表中,分别对应个位数为 0 ~ 9 的等级,每 10 级一循环。升级时,游戏根据等级数字的个位选择对应的颜色。

由于 NES 机器的芯片没有取模运算功能,无法直接获取等级数字的个位,故游戏使用了一个循环算法:每次将等级数字减去 10,直到结果为负,然后使用最后一次减 10 之前的值作为「等级数字的个位」输出。

然而,等级数字以无符号数存储,取值范围是 [0, 255];而判断正负的计算中将数字视为有符号数处理,取值范围是 [-128, 127]。这两种类型的前半部分是相同的 [0, 127],但后半部分无符号的 [128, 255] 被视为有符号的 [-128, -1]。

直到 Lv137 为止,这都不会出问题,因为直到 137 - 10 = 127 为止的数字无论作为无符号还是有符号数处理都是相同的正数,可以继续循环。但 Lv138 执行 138 - 10 的结果是无符号的 128,对应有符号的 -128,于是 138 就被错误地视为「等级数字的个位」输出,从而越界读取了列表之外的其他数据,显示错误颜色。

更进一步地,每个配色方案实际上有 4 种颜色,故颜色列表在内存中占据 40 个字节的位置;以列表首位为原点,则 10 种配色方案的起始位置分别是 0 4 8 … 36。因此,当上述算法获取了「等级数字的个位」后,需要将其乘以 4 才能找到正确的对应配色。而获取到的「等级数字的个位」也是以 1 个字节存储的,八位的长度限制让过大的数乘以 4 之后会被截去溢出部分(相当于取模 256),因此只有 0 4 8 … 252 这 64 个可能。其中,前 10 个数字对应 10 种正常配色方案,而后 54 个数字就造成了 54 种错误颜色。

首个触发颜色错误的等级 Lv138 乘以 4 后取模 256 的结果是 40,因此读取到的是紧邻颜色列表的「第一个错误配色」;以此类推,直到 Lv191 读取到位置 252 的「最后一个错误配色」。之后,Lv192 ~ Lv255 的计算结果又是一个 0 ~ 252 的完整循环,因此 Lv192 ~ Lv201 按正确顺序使用了 10 种正确配色,而 Lv202 ~ Lv255 按相同顺序使用了 54 种错误配色。

玩家文化

Fractal 首次抵达 Lv138 的直播录像,
PAL 制式 NES 方块的第一个颜色错误
Eric 首次抵达 Lv138 的直播录像,
NTSC 制式 NES 方块的第一个颜色错误

如果玩家有能力在最高重力下持续存活,那么颜色错误是玩家会遇到的第二个游戏错误,被玩家社区视为第二个里程碑。

不过,「颜色错误」里程碑的难度远远高于上一个里程碑「等级错误」:后者只需在最高重力下消除 10 行升一级即可,而前者需要在最高重力下消除 1090 行升 109 级。即使使用连点指法,最顶级玩家也无法坚持如此久的时间:该技术对手指的负荷过大,玩家很容易疲劳。直到 Thor 十年后的2021年,世界纪录也只能在最高重力下消除 120 行,抵达 Lv41。但是,玩家 CheeZ 在2020年发明了划时代的轮指(Roll)技术,该指法拥有更高的速度上限和更低的负荷,使顶级玩家的生存时间得到数倍甚至十倍的提升,终于有人能够挑战颜色错误甚至再往后的里程碑。

2022年2月28日,使用轮指技术的 Fractal161 首次在 PAL 制式 NES 方块抵达 Lv138,触发颜色错误;不过该版本的最高重力比更流行的 NTSC 版本相对更慢。2022年8月17日,同样使用轮指技术的 EricICX 首次在 NTSC 制式 NES 方块抵达 Lv138,触发颜色错误。

此外,早在2021年7月24日,程序员 Greg Cannon 已经使用自制的人工智能 StackRabbit「征服」了 NES 方块,抵达 Lv237 并造成游戏崩溃。在视频中,他自己为每一等级的错误颜色取了昵称。虽然其中大部分只是他的个人命名、未得到认可,但也有极个别名字在后来被玩家社区接受并广泛使用。例如,令 Eric 失败的深色等级 Lv146 被命名为「黄昏」(Dusk),令下一个世界纪录创造者 PixelAndy 失败的、臭名昭著的黑色等级 Lv148 被命名为「木炭」(Charcoal)。

游戏崩溃

表现

游戏崩溃Game Crash)是从抵达 Lv155 开始有几率触发的错误。从 Lv155 开始的所有等级,在特定行数和等级做出特定类型的消行、升级甚至落块,有可能触发游戏画面冻结、彻底卡死。

大体上,最初会触发游戏崩溃的情况较少,等级越高则有越多的情况都可以触发崩溃。此外,有些特定情况一定会触发崩溃,有些情况则只是有几率触发崩溃。

该错误是唯一会导致游戏彻底无法继续的严重错误。

原理

玩家文化

Blue Scuti 首次触发游戏崩溃的直播录像

如果玩家有能力在最高重力下持续存活,那么游戏崩溃是玩家会遇到的第三个游戏错误。2023年,游戏崩溃曾被玩家社区认为是游戏的最高成就。与其他任何情况都是玩家自己最终失败顶出、「被游戏打败」不同,游戏崩溃是唯一一个「玩家战胜游戏」的情况,因此被认为有非凡的意义。

2023年底,数位顶级玩家有意识地展开了首个游戏崩溃的竞争。2023年12月21日,Blue Scuti 达成了第一个游戏崩溃。随后这一成就迅速「出圈」走红,NES 方块圈内知名媒体人 aGameScout 为他制作的视频突破了一千万播放量,美国主流媒体争相报道,随后这一新闻更被全球转载。

现在,游戏崩溃被玩家社区视为第三个里程碑。已经有数位顶级玩家达成了游戏崩溃,并开始在修复了崩溃问题的改版上挑战更高成绩。

超长等级

表现

超长等级Long Level)是在抵达 Lv235 时一定会触发的错误。与其他所有等级均为消 10 行升一级不同,Lv235 持续长达 810 行。

该错误不影响正常游玩,只是提升了游戏难度,提高了进一步升级所需的要求。

原理

玩家文化

Alex 首次抵达 Lv235 的直播录像

如果玩家有能力在最高重力下持续存活,并且使用的是修复了游戏崩溃问题的改版(或者在原版游戏上设法规避了所有崩溃情况,但这种玩法目前无人尝试),那么超长等级是玩家会遇到的第三个游戏错误。

2024年3月11日,Alex Thach 首次抵达 Lv235,在消除了 84 行后失误结束游戏。

2024年10月6日,dogplayingtetris 首次突破 Lv235 抵达更高等级,并最终在同一局游戏里完成了更高的重生成就。

重生

表现

重生Rebirth)是在 Lv255 升级后一定会触发的错误。Lv255 是游戏内最高的等级,如果在 Lv255 再次升级,会回归到最初始的 Lv0,同时重力与得分倍率也一并回到最低,除了得分与消行数保留外一切情况均与 Lv0 相同。

该错误对正常游玩完全没有影响,甚至降低了难度,允许玩家无限循环下去。也有人认为这并非游戏错误。

原理

玩家文化

Dog 首次达成重生的直播录像

目前,重生被玩家社区认为是游戏的最高成就,甚至具有相当的哲学意义。当然,也存在理论上循环重生、无限游玩的可能性。

2024年10月6日,dogplayingtetris 首次突破所有等级达成重生,甚至在之后又继续消除了近一千行,在第二轮的 Lv91 失误结束游戏。

画面错乱

注释

  1. 直译为「杀屏」,来自游戏吃豆人(パックマン,Pac-Man)在 Lv256 会触发的严重故障。
    然而在吃豆人中,Killscreen 是程序故障导致游戏无法继续,游戏会出现字面意义的画面错误;而 NES 方块的最高重力只是因为难度过大才无法继续游玩,游戏本身没有故障,画面也没有问题。因此 Killscreen 的表述只是英文玩家社区约定俗成的借用,并不准确,中文既无此习惯,选择改译为更准确的「必死重力」。
    后来,玩家开发出新技术能够在最高重力下存活,「必死」变得名不副实。玩家还发现游戏在更高等级真的有与吃豆人的 Killscreen 情况类似的严重故障导致游戏崩溃,因此有些人称之为「真正的杀屏」(True Killscreen)。不过,由于数十年来的约定俗成,大部分玩家还是习惯将最高重力称为 Killscreen,而将游戏崩溃称为 Game Crash。

参考资料

  1. Retro Game Mechanics Explained. Bugs & Glitches of High-Level NES Tetris . YouTube. 2024-03-07. [2024-10-10].
  2. Retro Game Mechanics Explained. RGME Article #33: 810 Miles . cohost. 2024-03-25. [2024-10-10].
  3. HydrantDude. why the colors glitch out at level 138 . YouTube. 2022-09-15. [2024-10-10].
  4. HydrantDude. why clearing a single at level 155 crashes nes tetris . YouTube. 2022-10-11. [2024-10-10].
  5. HydrantDude. why nes tetris covers your screen in garbage after a single into level 160 . YouTube. 2024-01-13. [2024-10-10].
  6. HydrantDude. why you get stuck on the same level for 800 lines . YouTube. 2023-02-19. [2024-10-10].

参见