《死神来了4》没有那么惊艳了
07年的时候看《死神来了》,当时还写过一个《<死神来了>的程序逻辑》的文章,说明死神来了使用的是While循环,而不是一次性的For循环。不过《死神来了4》却没有弄出更多的新意,死神为了弄死最后的三个人,实在是费了太多气力、也死了太多人了。
当时那篇文章,看起来似乎更有激情一些,现在已经没什么激情写这些东西了。
《死神来了》的程序逻辑
前一段时间在
土豆网上看到中央电视台的《第十放映室》,将施瓦辛格的《终结者》三部曲,说三部曲几乎有着一模一样的模式:施瓦辛格光屁股登场、到酒吧抢衣服眼镜摩托车、正邪双方开始找同一个目标、公路追车、狂撒弹药、最终在工厂对决。《第十放映室》当时怎么说的不太清楚了,大概的意思就是对于大导演詹姆斯·卡梅隆敢于这样重复自己并且能够取得成功表示致敬吧。不过,我回顾一下我看到的三部曲,大家就可以看到,其实很多三部曲都是这样的,都是重复已经成功的桥段。当然了,这里所说的三部曲,是不包含像《魔戒》、《哈利波特》这种类型的三部曲的,这种类型的三部曲实际上就是电影连续剧,我所说的三部曲是情节上基本上没有严格的前后联系的那种。
- 《电锯惊魂》三部曲:三部的基本情节都是一样的,一开始都是一个引子,引子里面的哥们儿是必死无疑的,只不过是死亡的方式不同而已;重头戏都是两个或者两个以上的人被困在一起,要通过各种方式一个个的死亡。“竖锯”JigSaw深沉而又冰冷的声音:“I want play a game”,也贯穿三部;
- 《心慌方》三部曲(《Cube》):三部曲的情节也是一样的,一群人被困在一个不知道如何才能出去的立方体中,立方体遍布小房子,房子里很多都有机关,如果不小心碰到了机关,必定要送命;
- 《死神来了》三部曲:最开始都是一场大灾难,因为有人预见了灾难,所以少数人得以幸免,但是灾难仍然按照它自己的逻辑,找到剩余的人,并且一个一个的将他们杀掉;
- 《隔山有眼》两部曲:都是被困在山里,然后一个一个的被干掉,杀手是被核辐射了的变种人;
以上都是恐怖片,除了《终结者》不算。
如果分析一下恐怖片的话,《死神来了》算是一种比较新颖的模式。以《电锯惊魂》、《心慌方》、《隔山有眼》为例,这种类型的恐怖片是有典型的正、邪双方的,虽然是一般正方在明处,邪恶的一方在暗处,然后经过激烈的拼杀,或者有人生存下来,或者全部被干掉,但是毕竟像这样的恐怖片,邪恶的一方是一个最终可以看到的实体,所以像这种,只要能够有办法掌握了实体的弱点,就可以想办法将之击破,然后逃出生天。
《死神来了》就不是这种模式,《死神来了》认为灾难是必然会发生的,而在灾难中注定要死去的人是一定会死去的,虽然有时候因为某个人的预见性,预先看到,并且阻止了灾难的发生,但是只要他(或她)一天没死,灾难就会一直找上来,直到这个人被杀死为止,这是比较恐怖的。在这部电影里面,死神不是一个人,也不是任何一个可见的东西,它只存在在Alex和他的幸存的朋友的恐惧之中。它从来没有现身过,通过一缕清风、一个个的惨不忍睹的事故,才能感觉到它的存在。
之前看过《死神来了》2和3,但是没有看1,看完了1,有一个想法,觉得对《死神来了》这部电影,里面的死神实际上是一段程序。
以《死神来了1》为例,一开始就是180号飞往法国巴黎的航班,在飞机还没有起飞的时候,主人公Alex预见性的见到了飞机爆炸,那种真实性仿佛亲身经历(第二部是摩天轮倒塌,第三部忘了),惊恐之下,下了飞机,同时被他拖累下机的还有几个人,这几个人都不停的抱怨Alex。然而,在飞机刚刚起飞之后,飞机竟然真的爆炸了,所有的人全部丧命。Alex和他幸存的朋友们以为这件事情就这么过去了,想不到,过了一段时间之后,其中的一个幸存者竟然离奇的死去了,死亡的方式也是意外。在这个幸存者死亡之前,Alex同样预感到了危险,并且认为这个幸存者的死亡并不是偶然的,而是“死神”的刻意设计。同时,死神的设计是有顺序的,警方对飞机爆炸现场的分析为Alex提供了帮助,原来飞机爆炸的时候,是从左前端向右后端爆炸的,这样,尽管飞机上的人在我们看起来是一起身亡的,但是在死神看来,是从前到后、从左到右这样的顺序,所以,幸存下来的人也将会按照当时在飞机上的座位的顺序被杀死。
从软件的逻辑上来看《死神来了》这部电影,我们可以这样分析:
当第一次大型事故发生的时候,除了少数幸存者之外,所有的人都死掉了,幸存的人在悲伤的时候也感到幸运,他们以为这件事情就此过去了,所以,我们分析他们的潜意识,可以认为是这样的程序逻辑:
Begin For循环 逐个遍历事故中所有的人
Kill 当前的人
End For
如上所示,剧情开始的时候,我们认为死神所采取的是一个For循环,这个For循环只是从头到尾将应该出事的人遍历一次,然后逐个杀掉(在飞机上按照死神的逻辑也是一个一个的杀掉,虽然在我们看起来是一起死亡的),并且在Kill方法的时候,没有返回Kill方法执行是否成功。可以这样来理解,死神轮着板斧砍杀一通,然后不管死活,扭头就走了。这是在灾难必然发生的情况下的最好的模式了,生存下来的人就等于已经被死神忽略了。
然而,当Alex预感到死神仍然没有放过他们,幸存者仍然在一次次的事故中死掉的时候,他认为应该采取积极的行动,从而尽量保护更多的幸存者在事故中生存下来。所以,在死神制造事故试图杀死幸存者的时候,Alex也在试图通过各种方式,破坏死神的行动。按照他在这个时候的理解,认为死神是在第二次遍历幸存者。遍历完了之后,仍然能够幸存下来的人,可以继续生存下去。
这个时候,我们可以通过程序这样来理解死神的行动:
Begin For循环 逐个遍历事故中所有的人 //这是第一次180航班大爆炸时间
Kill 当前的人
End For
Begin For循环 逐个遍历事故中的幸存者 //这是死神在尝试杀死幸存者
MakeKill 当前的人
End For
我们看到,在上面的程序逻辑中,第一次,死神采取了同样的方法,就是180号航班爆炸,杀死了大量的人;然后,由于幸存者分散,不在一起,所以死神按照顺序,找到某一个人之后,就使用MakeKill方法,MakeKill首先制造事故,然后再通过事故将幸存者杀死。
在第二轮的时候,Alex和幸存者从血淋淋的事实中已经意识到,死神确实是在第二遍清除幸存者,所以一方面Alex试图预见并避免死神的行动,另一方面,他们试图通过破坏死神的杀人模式,来达到自救的目的。简单来说就是这样:死神杀人是有顺序的,比如是1、2、3、4这样的顺序,假设Alex成功的救了2,但是3却不幸被杀掉了,这个时候,Alex和他的朋友们就认为死神已经“跳过”了2,所以2将会生存下来。
事实正如Alex所预料的那样,在1、2、3、4这四个人当中,死神尝试杀死2但失败,结果杀死了3,下一个人是4,而不是2了,2暂时性的生存了下来。
以上的程序逻辑的问题是,无论死神调用Kill方法,还是MakeKill方法,都没有返回一个是否成功的标志,比如,如果这个人被成功的杀死了,则返回true,如果这个人没有被杀死,则返回false。因此,Alex和他的朋友们仍然有幸存下来的希望。
但是当第二轮死神杀死大部分剩下的幸存者之后,在影片的最末尾,当第二轮杀戮剩下来的幸存者终于能够在巴黎街头喝酒,为好好活下去而击掌相庆,觥筹交错的时候,死神却正在酝酿他的第三轮杀戮……
到现在为止,是时候揭开谜底了。是的,结果足以让我们彻底绝望!
原来,死神用的不是For循环!死神一直在留意是否有幸存者,只要还有一个幸存者,死神就会不断的制造事故,直到在事故中将最后一个幸存者杀死为止!实在是太残忍了!
所以,揭开谜底的时候,我们发现,死神用的不是For循环,而是While循环!
While 幸存者的数量 > 0
For 遍历每一个活着的人
MakeKill 当前的人
End For
End While
是的,让我们感到悲伤的是,死神采用的方法是最残忍的方法:
第一条原则就是:只要应该在事故中死去的人还剩下哪怕一个,死神就绝不会放手,直到所有的人都被杀死为止;
第二条原则就是:制造事故,杀死当前的人;
第三条原则就是:如果一个事故能够尽量多的杀死人,那么这个事故优先(180号航班爆炸);
第四条原则就是:如果某一个人在这一轮事故中没有被杀死,那么恭喜他,他在下一轮被干掉的名单里,这一轮跳过他;
第五条原则就是:直到应该死去的人全部都死去,是的,第五条原则等于第一条原则;
如果有办法把死神领到一个死循环里面的话,那么是不是大家就都有机会了呢?妈的,耗光你的内存,最终让你蓝屏!