大家在玩俄罗斯方块的时候有没有想过这样一个问题:如果玩家足够厉害,是不是永远也不可能玩死?换句话说,假设你是万恶的游戏机,你打算害死你面前的玩家,你知道任意时刻游戏的状态,并可以有针对性地给出一些明显不合适的方块,尽量迫使玩家面对最坏的情况。那么,你有没有一种算法能保证害死玩家呢?或者,会不会玩家无论如何都存在一种必胜策略呢?注意,俄罗斯方块的游戏区域是一个宽为10,高为 20 的矩形,并且玩家可以事先看到下一个给出的方块是什么。在设计策略时必须考虑这一点。
相信很多人有过这样的经历:玩俄罗斯方块时一开局就给你一个S形方块,让完美主义者感到异常别扭。结果,第二个方块还是S,第三个方块依旧是S,相当令人崩溃。于是,我们开始猜测,如果游戏机给你无穷个S形方块,玩家是不是就没有解了?答案是否定的。如图1所示,从第10步开始,整个局面产生一个循环;只要机器给的一直都是S形方块,玩家可以不断重复这几个步骤,保证永远也死不了。
图1
不过,这个循环是在游戏场地清空了的情况下才产生的。有人会进一步想了,要是在玩着玩着,看着你局势不好时突然给你无穷多个S形方块呢?事实上,此时局面的循环依然可能存在,如图2所示。在第5个S形方块落地后,循环再次产生。
图2
俄罗斯方块究竟是否存在必死的情况呢?1988年,约翰·布茹斯托斯基(John Brzustowski)的一篇论文给出了肯定的答案。他给出了一种算法,可以保证游戏机能够害死玩家,即使要求它必须提前向玩家展示下一个方块的形状。构造的关键在于,整个游戏的局面个数是有限的(2的200次方),如果玩家一直不死,在某一时刻必然会重复某一状态。我们把两次重复状态及其之间的游戏过程叫做一个“循环”,这个循环实际影响到的那些行就叫做“实际循环区”。例如,图 2 就是一个循环,这个循环的“实际循环区”是从第4行到第7行这四行。
我们把宽为10的游戏区域划分为5个宽为2的“通道”,从左至右用1到5标号。注意到图1和图2中的两个循环都有一个共同点:每个S形方块最终都完全落在某个通道内。事实上,对于任意一个只有S形方块的循环,我们都能得出这个结论。也就是说,如果游戏机一直给你S形的方块,你却用它们弄出了一个循环,那只有一种可能:所有S形方块的下落位置都没有跨越通道(就像图3中的方块A、B那样,而非方块C、D那样)。
图3
为了证明这一点,我们对通道编号实施归纳。考虑命题P(x):如果某个 S 形方块(或它的一部分)落在了通道x的左边(或者说前2(x-1)列里),那它一定完全落在某个通道内。P(1)显然成立:方块根本不可能占据通道1左边的某个格子,因为通道1左边什么都没有。下面我们说明,当P(n)为真时,P(n﹢1)也为真。
我们首先要证明一个引理:在循环中的任意时刻,通道n的实际循环区内绝对不可能出现形如“□■”的两个并排的格子。如图 4(1)所示,假设图中星号方块所在行是通道n的实际循环区内位置最低的“□■”的结构。假如这一行被消掉了,又由归纳假设,不存在哪个 S形方块跨越了该通道的左边界,因此只有一种可能:某个S形方块从左侧面挤了进来,如图4(2)所示。但这样一来,我们又产生了一个更低的“□■”,矛盾。这就是说,星号方块所在行一直没被消去。但这也是不可能的,因为实际循环区内是一个新陈代谢、以旧换新的更替过程,每一行最后都是会被消除的。
图4
接下来,考虑命题P(n﹢1)。要想让 S形方块占据通道n的格子,只有图 5这四种情况。但是,由于我们之前证明了通道n中不能存在“□■”,因此在这个 S 形方块落下之前,星号方块都是已经存在的了。注意到,每一个S形方块的下落都致使“■□”形结构减少,但第一种情形除外——它消除了一个“■□”形结构,但给其上方带来了一个新的,所以“■□”形结构个数保持不变。没有哪种情形能够增加“■□”的个数。但是,通道n的“■□”形结构个数应该是恒定的,因为它在一个循环区里。因此,只有第一种情况才能够被接受。
图5
也就是说,仅含有S形方块的循环只有一种情况——S形方块在各个通道内重叠,填满并消除若干行后回到初始状态。实际循环区内的每个通道都是一个模样:底下是0 个或多个“■■”,顶部一个“■□”。注意,最右侧那个通道的最顶端是一个“■□”,右边这个空白永远也不可能用Z形方块填上。也就是说,在一个只含S形方块的循环区内,必然会有某一行,它的最右侧是一个“■□”,它保证了该行不能仅用Z形方块消掉。如图6所示,箭头所指的行无法单用Z形方块消除,因为星号位置不可能用Z形方块填充。
图6
下面我们给出游戏机害死玩家的算法。
(1)不断给出S形方块并显示下一个方块也为S形,直到出现一个循环。
(2)给出一个S形方块并显示下一个方块为Z形。
(3)不断给出Z形方块并显示下一个方块也为Z形,直到出现一个循环。
(4)给出一个Z形方块并显示下一个方块为S形。
(5)跳回(1)并重复执行。
这样的话,玩家为什么会无解呢?由上面的结论,在第(1)步后,游戏区域中出现了一个不能用Z形消除的行。即使再给你一个S形方块,这一点仍然无法挽救,因为填充星号空格的唯一途径就是插一个S形进去,但这立即又产生了一个Z形永远放不进去的空位(如图 7所示)。然后,玩家就拿到了一大堆 Z形,最终必然会产生另一个循环区,且这个循环区在刚才那个无法消去的行上(循环区不可能包含一个不能消除的行,因为正如前面所说,一个实际循环区的所有行最终都是会被消掉的,这样才可能循环)。这个循环区的最左边那个通道将会产生一个“□■”结构,是 S形方块所不能消去的。于是,游戏机又给出一大堆的S,最终使得两种无法消去的行交替出现,直至游戏结束。
图7
到此为止,我们便完成了整个证明。有人或许会指出:现实的游戏机并没有主观能动性啊?事实上,即使方块是随机出的,如果你倒霉到家了,这种特殊的方块序列可能恰好就让你一个不错地碰上了。虽然这种怪事的发生概率非常非常低,但理论上说毕竟是有可能的,因此俄罗斯方块终究不是玩不死的,总有一个时刻会Game Over。
有趣的是,这个结论还可以直接扩展到场地为任意宽度的俄罗斯方块游戏。当场地宽为其他偶数时,上述证明同样有效;当场地宽为奇数时,无穷多个方形方块就可以直接干掉玩家。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。