萨摩公园

METO 的部落格

2019 元旦红包游戏

背景

题目

今年的游戏,我设置了 50 个页面,每个页面都会展示一个魔方,魔方的每个面都有一个二维码,玩家需要将魔方还原后再进行扫码,其中有一个面藏有下一关的地址。

关卡设置如下,其中在 30、45、50 关都放置了红包码

关卡 描述 过关人数
1-10 无打乱,过关地址在黄色面上 48
11-20 打乱颜色,过关地址固定在L面上 35
21-30 打乱每个面 24
31-40 魔方旋转 1 次 8
41-45 魔方旋转 2 次 4
46-48 魔方旋转 3 次 2
49-50 魔方旋转 5 次 2

题解 1

先来观察 1-30 关的情况

第 1 关

前面 30 关我没有对魔方做打乱操作,因此有一个很费人力的方法:举着手机扫。事实上大部分玩家都是这样过去的。

其实如果有 IT 职业病的话,我们打开浏览器控制台就可以看到六张图片,刚好对应魔方的六个面,这样就可以加快扫描速度。

https://game.i-meto.com/images/01000000000000000000_L.png
https://game.i-meto.com/images/01000000000000000000_R.png
https://game.i-meto.com/images/01000000000000000000_U.png
https://game.i-meto.com/images/01000000000000000000_D.png
https://game.i-meto.com/images/01000000000000000000_F.png
https://game.i-meto.com/images/01000000000000000000_B.png

当然可以的话可以自己用二维码库来做识别,不同语言方法很多,甚至可以查 API

API 识别 (@zgq354)

题解 2

拿到了 30 关的小红包后,再来看看 31-45 关

第 32 关
第 44 关

这里的魔方就比较丧心病狂了,二维码被旋转过,没法直接扫描。

有的玩家就直接上 PS、画图、Word、Sketch

画图大法好 (@Kotori0)

虽然是累点,但是还是有两位大佬用这种方式拿完了全部 50 关的红包。

事实上这种方式已经接近正解了,只是我们需要用机器来代替人力来拼接图片。

正解

第一步我们先将每张二维码拆分为 9 个小块,按照位置分类为角块、边块、中心块。
玩过魔方的同学应该非常了解,然后将每个分类中的碎片旋转到同一个方向。

拆分二维码

第二步我们将相同颜色的碎片放到一起,颜色的识别很容易,扫描整张图片找到第一个非黑的颜色就行了。

绿色碎片

第三步直接用枚举法拼出二维码的所有组合:枚举角块排列、边块排列、中心块方向,得到若干二维码,然后调用二维码库扫描

枚举二维码(左下角正确识别)

核心部分已经讲完, 就差一个程序员把上面的东西串起来就大功告成了。

程序

题外

扫码鬼才的诞生 (@Curtis 🍉 Jiang)
  • 感谢 SECCON 2017 CTF 的创意
  • 感谢 2018 年关注萨摩涂鸦板的读者们