爱西外网

 找回密码
 注册
搜索
查看: 3181|回复: 1
打印 上一主题 下一主题

俄罗斯方块可以永无止境地玩下去吗?

[复制链接]

227

主题

27

好友

1万

积分

管理员

www.lxd.cc

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    开心
    2012-2-24 00:28
  • 签到天数: 125 天

    [LV.7]常住居民III

    社区QQ达人

    跳转到指定楼层
    楼主
    发表于 2011-10-30 10:13:20 |只看该作者 |倒序浏览
    大家在玩俄罗斯方块的时候有没有想过这样一个问题:如果玩家足够牛B的话,是不是永远也不可能玩死?换句话说,假设你是万恶的游戏机,你打算害死你面前的玩家;你知道任意时刻游戏的状态,并可以有针对性地给出一些明显不合适的方块,尽量迫使玩家面对最坏情况。那么,你有没有一种算法能保证害死玩家,或者玩家无论如何都存在一种必胜策略呢?
    0 N. g$ C! X$ F$ _注意,俄罗斯方块的游戏区域是一个宽为10,高为20的矩形,并且玩家可以预先看到下一个给出的方块是什么。在设计策略时,你必需考虑到这一点。+ U* ^' _* [, H* I* @
    * o: Y& V" V$ M$ O' h, `( m' |
    [simg]http://img.cnbeta.com/newsimg/111030/08105601277813845.png[/simg]9 z$ {, A6 e% {. S

    1 S" T4 m" C% D" {相信很多人有过这样的经历:玩俄罗斯方块时一开局就给你一个“S”型方块,让完美主义者感到异常别扭;结果,第二个方块还是这个“S”,第三个方块依旧是“S”,相当令人崩溃。于是,我们开始猜测,如果游戏机给你无穷个“S”形方块,玩家是不是就没有解了?答案是否定的。如图1,从第10步开始,整个局面产生一个循环;只要机器给的一直都是“S”方块,玩家可以不断重复这几个步骤,保证永远也死不了。% Q) R9 \. G! p/ F3 P" g+ _( D6 w
    # P, |% W: G/ M1 P, ]: ]$ X
    [simg]http://img.cnbeta.com/newsimg/111030/0810561991937166.png[/simg]. ^+ C" U" q7 `# O% o( ?; t
    - K& j( Z$ Y# ]4 D, P$ R4 a
    不过,这个循环是在游戏场地清空了的情况下才产生的。有人会进一步想了,要是在玩着玩着,看着你局势不好时突然给你无穷多个“S”方块呢?事实上,此时局面的循环依然可能存在,如图2。在第5个“S”形方块落地后,循环再次产生。( h1 C- k7 K; z3 |1 z7 \
    : i2 h! V9 R3 v- `
    俄罗斯方块真的不可能玩死吗?1988年,John Brzustowski的一篇论文指出,俄罗斯方块游戏无解并非不可能。它给出了一种算法可以保证游戏机能够害死玩家,即使我们要求它必须提前向玩家展示出下一个方块的形状。构造的关键在于,整个游戏的局面个数是有限的(2的200次方),如果玩家一直不死,在某一时刻必然会重复某一状态。我们把两次重复状态及其之间的游戏过程叫做一个“循环”,这个循环实际影响到的那些行就叫做“实际循环区”。例如,图2就是一个循环,这个循环的“实际循环区”是从第4行到第7行这四行。: X9 |: ^8 V6 m8 y- r

    9 i. U4 z4 b' z  [! J4 t, D[simg]http://img.cnbeta.com/newsimg/111030/08105721990950214.png[/simg]9 t# H5 `! r# u" L- h! m8 R

    , c2 p3 b: N8 `9 f+ A( r我们把宽为10的游戏区域划分为5个宽为2的“通道”,从左至右用1到5标号。注意到图1和图2中的两个循环都有一个共同点:每个“S”形方块最终都完全落在某个通道内。事实上,对于任意一个只有“S”形方块的循环,我们都有这个结论。也就是说,如果游戏机一直给你“S”形的方块,你却用它们弄出了一个循环,那只有一种可能:所有“S”形方块的下落位置都没有跨越通道(就像图3中的紫色方块那样,而非绿色方块那样)。
    4 P# n6 K" @' K) W) K+ m& A+ Z# G  a
    * c8 h+ t, a: r7 n+ X- |为了证明这一点,我们对通道编号施归纳。令命题P(x)表示,如果某个“S”形方块(或它的其中一部分)落在了通道x的左边,那它一定完全落在某个通道内。P(1)显然成立:方块根本不可能占据通道1左边的某个格子,因为通道1左边啥都没有。下面我们说明,当P(n)为真时,P(n+1)也为真。. u; C$ n+ t! m6 [

    8 Y0 o5 i' R7 ^5 T: V- I2 \6 a1 U[simg]http://img.cnbeta.com/newsimg/111030/08105831754928559.png[/simg]  @) a" o$ ]+ K( h6 T

    . T% ]5 o3 k3 ^- \我们首先要证明一个引理:在循环中的任意时刻,通道n的实际循环区内绝对不可能出现形如“口■”的两个并排的格子。如图4.1,假设图中星号方块所在行是通道n的实际循环区内位置最低的“口■”的结构。假如这一行被消掉了,又由归纳假设,不存在哪个“S”形方块跨越了该通道的左边界,因此只有一种可能:某个“S”形方块从左侧面挤了进来(如图4.2)。但这样一来,我们又产生了一个更低的“口■”,矛盾。这就是说,星号方块所在行一直没被消去。但这也是不可能的,因为实际循环区内是一个新陈代谢、以旧换新的更替过程,每一行最后都是会被消除的。  G" y' m# \$ _5 t
    ( Z+ c# q9 G8 c: b
    [simg]http://img.cnbeta.com/newsimg/111030/08105941848112862.png[/simg]
    " `' a1 k1 h1 ?+ y
    8 U; D% m9 p' A: v+ [2 M" [( R# a接下来,考虑命题P(n+1)。要想让“S”形方块占据通道n的格子,只有图5这四种情况。但是,由于我们之前证明了通道n中不能存在“口■”,因此在这个“S”形方块落下之前,星号方块都是已经有了的了。注意到,每一个“S”形方块的下落都致使“■口”形结构的减少,但第一种情形除外——它消除了一个“■口”形结构,但在其上方带来了一个新的,使得“■口”形结构个数保持不变。没有哪种情形能够增加“■口”的个数。但是,通道n的“■口”形结构个数应该是恒定的,因为它在一个循环区里。因此,只有第一种情况才能够被接受。
    4 b% {5 J" A6 b6 g- I. \: |
    : u+ ~5 q, R  S9 B2 ~因此,仅含有“S”形方块的循环只有一种情况——“S”形方块在各个通道内重叠,填满并消除若干行后回到初始状态。实际循环区内的每个通道都是一个模样:底下是0个或多个“■■”,顶部一个“■口”。注意,最右侧那个通道的最顶端是一个“■口”,右边这个空白一辈子也不可能用“Z”形方块填上。也就是说,在一个只含“S”形方块的循环区内,必然会有某一行,它的最右侧是一个“■口”,它保证了该行不能仅用“Z”形方块消掉。如图6所示,箭头所指的行无法单用“Z”形方块消除,因为星号位置不可能用“Z”形方块填充。
    % X9 n7 Y4 B8 C6 p' _) ]& ]( l
    3 ~  @( A3 B# }% c( W5 h- `- K) ?[simg]http://img.cnbeta.com/newsimg/111030/08110052120808011.png[/simg]
    + v5 V3 G6 w$ w
    6 I- d/ r0 M% n3 E( I下面我们给出游戏机害死人的算法:) j, ^) K, }' Y) {) I) H# L4 y
    1. 不断给出“S”形方块并显示下一个方块也为“S”,直到出现一个循环;. _" R4 P: Q( N* B
    2. 给一个“S”形方块并显示下一个方块为“Z”;
    $ n4 W3 H, N) y3. 不断给出“Z”形方块并显示下一个方块也为“Z”,直到出现一个循环;$ P' ?( {7 I# }* ~3 T7 W0 J
    4. 给一个“Z”形方块并显示下一个方块为“S”;8 c+ d" U. ~0 o
    5. 跳回1并重复执行。
      o+ o/ b# {: y% o$ I0 _" ~, L  G1 p
    [simg]http://img.cnbeta.com/newsimg/111030/0811016788059808.png[/simg]
    2 l1 W3 c* m- `  q" A
    4 V! g, R' u1 S3 J9 t; F这样的话,玩家为什么会无解呢?由上面的结论,在第1步后,游戏区域中出现了一个不能用“Z”消除的行。即使再给你一个“S”形方块,这一点仍然无法挽救,因为填充星号空格的唯一途径就是插一个“S”进去,但这立即又产生了一个“Z”永远放不进去的空位。然后,玩家就拿到了一大堆“Z”,最终必然会产生另一个循环,且这个循环区在刚才那个无法消去的行之上(循环区不可能包含一个不能消除的行,因为正如前面所说,一个实际循环区的所有行最终都是会被消掉的,这样才可能循环)。这个循环区的最左边那个通道将会产生一个“口■”结构,是“S”所不能消去的。于是,游戏机又给出一大堆的“S”,最终使得两种无法消去的行交替出现,直至Game Over。# x9 W2 M' o& x+ W
    4 U; a) u/ a4 q
    有两点值得注意。一、虽然我们这里假设游戏机是有主观能动性的,但事实上呢,即使方块是随机出的,如果你足够倒霉的话,这个特殊的方块序列可能恰好就让你一个不错地碰上了;虽然这种怪事的发生概率极低,但理论上说仍然是可能的,因此俄罗斯方块终究不是玩不死的,总有一个时候会Game Over。二、这个结论可以直接扩展到场地为任意宽度的俄罗斯方块游戏。当场地宽为偶数时,上述证明同样有效;当场地宽为奇数时,无穷多个方形方块就可以直接干掉玩家。% l9 Y8 u- S' m% E5 j

    7 [! ]4 C. C$ n, j& `& u# i6 o+ i1 @) I& i& L( ~% U: g
    该贴已经同步到 小东的微博
    hello
    回复 论坛版权

    使用道具 举报

    13

    主题

    2

    好友

    970

    积分

    版主

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    奋斗
    2012-10-1 13:56
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    社区QQ达人

    沙发
    发表于 2011-10-30 20:55:31 |只看该作者
    很好的技术哦,涉及算法,我喜欢
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    我们一直在努力
    设计、制作:[刘晓东]
    严禁任何人以任何形式在本社区发表与中华人民共和国法律相抵触的言论! 
    本站所发内容仅代表发贴人观点,与本站无关,如无意中侵犯了您的权利,请通知我们,我们将在24小时内删除。

    爱西外网微信二维码

    关于我们|无图|手机版|联系站长|爱西外网  |网站地图  

    GMT+8, 2026-9-19 13:24 , Processed in 0.043114 second(s), 9 queries , Redis On. Powered by Discuz! X2.5 © 2001-2012 Comsenz Inc.

    回顶部