超玛一代吧 关注:2,976贴子:47,906
  • 3回复贴,共1

【溢出关卡】65536关卡解密:其实SMB1只有256个关卡

取消只看楼主收藏回复

相信各位看了@风华正茂999999 的“【溢出关卡】Super Mario Bros.1 全部65536关卡下载!”(http://tieba.baidu.com/p/1768961721 )这个帖子之后,可能会有这样的疑问:65536关卡列表是如何用一个程序生成的?程序所用的“y值列表”是什么意思?等等。
接下来,这个帖子将对这些疑问做出解答。


IP属地:上海1楼2012-08-04 11:07回复
    首先,我们已经知道,SMB1的各个世界的关卡之间是存在一定的重复的,但是重复率究竟有多高呢?
    经过前一段时间的研究,我认为,答案是:100%!
    也就是说,SMB1的每个世界都拥有同样的256个关卡,而且顺序是一样的,只是起始点(每个世界的第1关)不同!
    根据这个结论,只要把SMB1的第1世界的256个关卡全部列出,然后再确定每个世界的第1关在第1世界中的位置,就可以列出SMB1的全部65536个关卡!
    顺便说一句,该结论对SMB1 Hack(至少是常规Hack)也适用。


    IP属地:上海2楼2012-08-04 11:08
    回复
      那么,如何确定每个世界的起始点关卡呢?
      根据楼上的结论,我们可以得出一个推论:每个世界与第1世界的各个关卡之间都存在一个确定的对应关系,即:第z世界的第x关就是第1世界的第(x+y)关,写成公式为:z-x=1-(x+y)
      这样,根据公式可得,z-1就是1-(y+1)。
      每个世界都有一个对应的y值,把256个世界的y值列出来,就是程序所用的“y值列表”。
      那么,又如何确定每个世界的y值呢?
      显然,我们可以直接查找第z世界的z-1在第1世界对应的1-(y+1),但是遇到重复关卡时,这一关就不能唯一确定了。
      这时,我们可以用反推法,在第z世界查找1-1对应的z-(1-y)。在原版SMB1中,这个z-(1-y)是能够唯一确定的,因为在256关中,正常关序列只出现了一次,只要找到一个1-1过了之后是进入1-2的,就可以确定是这一关了。
      注:以上计算中如果出现结果不在1~256范围之内的,可以通过加或减256使结果进入范围


      IP属地:上海3楼2012-08-04 11:08
      回复
        最后,顺便说说我设计的程序“65536关卡列表生成器”
        其实这是个很简单的程序,通过从“底板”和“公式”两个文本文件中读取数据,按照公式指定的顺序排列底板中的关卡,最后生成文本格式的列表文件


        IP属地:上海4楼2012-08-04 11:09
        回复