|
最近,一位少年通过40分钟鏖战,终于让俄罗斯方块程序崩溃,实现了人类通关俄罗斯方块的成就。
NES版本俄罗斯方块的崩溃很够意思,呈现以下特点:①只有打到155关才有可能触发bug,②bug出现与否,只与关卡层数有关,与其他因素无关,③bug触发不是必然的,有概率触发也有概率不触发。这个奇妙的bug十分复杂,现在解释原理。
先科普一些基础知识:首先,NES中,代码和数据存放在一起,很容易混淆;其次,有些代码需要正确的数据才能运行,有些则不需要,例如JUMP指令,不需要任何数据,只要代码正确就能完成,而一些指令,例如JNZ,需要正确的数据才能运行。
NES俄罗斯方块崩溃的bug,过程如下:①玩家消去了太多行方块,导致6502CPU计算玩家得分需要进行大量乘除法,而6502计算乘法的效率非常非常低下这消耗了太多的时间,②NES的PPU,也就是图像处理器向CPU发送信号,提示CPU赶快处理图像,③CPU不得不放下手里的工作,转而处理图形,而俄罗斯方块程序设计存在缺陷,没有保护之前的数据,④图形处理工作导致之前的数据被覆盖,⑤图形处理工作结束后,代码失去了正确的数据,无法运行,引起连锁反应,最终导致CPU误把数据当代码,⑥CPU读到代码中的F7或者07字节,程序崩溃。
由此可见,崩溃BUG的触发需要满足条件①,这需要玩家进行消去方块,而俄罗斯方块速度是越来越快的,这就是最大的难点,其余条件的满足,需要满足某种“周期性”,否则也无法触发bug。
下图是166关左右,触发BUG的概率以及条件。 |
评分
-
1
查看全部评分
-
|