用 Wolfram 语言玩「跳一跳」

2018-05-31 15:26:16 浏览数 (1)

2017年12月28日下午,微信发布了 6.6.1 版本,加入了「小游戏」功能,并提供了官方 demo「跳一跳」。

是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离。分数越高,那么在好友排行榜更加靠前。可能刚开始上手的时候,因为时间距离之间的关系把握不恰当,只能跳出几个就掉到了台子下面。

如果能精确测量出起始和目标点之间的距离,就可以估计按压的时间来精确跳跃。看到网上有人用 Python 写的脚本来玩(https://github.com/wangshub/wechat_jump_game),有手动版和自动版的。想到用 Wolfram 语言 来做也很简单,甚至更简洁,先做了一个手动版的(不到十行代码)

原理和那个 Python 版的一样,主要做了两个改动:

① 用 Adb 工具获取手机截图再将截图pull上来,这种方法可行但是很卡,改用手机投屏软件会比较流畅;

② Python 手动版的需要用鼠标先点击起始位置,然后点击目标位置,因为起始位置容易根据颜色算出来,所以改为点击一次就行。

01

所需工具

Mathematica 11.2

Android 手机

Total Control

Adb 驱动

02

原理说明

通过 Total Control 软件将手机屏幕通过 WiFi 实时显示在电脑,用 Wolfram 语言 的 CurrentScreenImage 实时截屏。起始位置很容易根据颜色算出来,目标位置由鼠标点击确定。根据像素距离,计算按压时间(1080P 手机屏幕距离系数1.393、2k 屏幕是 1.0)。用Adb工具发送命令到手机模拟按压,蓄力一跳(adb shell input swipe x1 y1 x2 y2 time)

03

ADB 配置

① 下载 ADB 驱动 https://adb.clockworkmod.com/.

② 安装 ADB 后,请在环境变量里将 adb 的安装路径保存到 PATH 变量里,确保 adb 命令可以被识别到。

③ 安装完后插入安卓设备且安卓已打开 USB 调试模式,终端输入 adb devices ,显示如下,表明设备已连接:

List of devices attached

6934dc33 device

※ 注:部分新机型可能需要再另外勾上允许模拟点击权限。小米设备除了 USB 调试,还要打开底下的 USB 调试(安全)。

04

Wolfram 语言代码


EventHandler[

Dynamic[img = CurrentScreenImage[{{7, 64}, {7 360, 64 640}}]],

"MouseDown" :> (

pos1 = Mean@PixelValuePositions[img, RGBColor[{50, 50, 105}/255.], 0.03];

pos2 = MousePosition["Graphics"];

time = Round[EuclideanDistance[pos1, pos2]*3*1.393];

ReadList[ToString[StringForm["!adb shell input swipe `` `` `` `` ``",

Sequence @@ RandomInteger[{450, 550}, 4], time]]]

)

]


05

步骤

① 安卓手机打开USB调试,设置开发者选项USB 调试,电脑与手机 USB 线连接,确保执行 adb devices 可以找到设备 id.

② 启动 Total Control 通过 WiFi 将手机屏幕投射到电脑,拖动到合适的位置(比如左上角),确保 Mathematica 能截取到完整的界面。

③ 界面转至微信跳一跳游戏,点击开始游戏。

④ 打开 Mathematica 运行代码,用鼠标点击目标位置,开始游戏。

06

演示

07

其他

要改成自动版需要识别目标中心点,这样就不需要手动点击自动弹跳,现在已经有人做了,https://zhuanlan.zhihu.com/p/33330731,效果好像还不太好,有兴趣的可以继续改进。

投屏的软件除了 Total Control,也可以用360手机助手等。用 USB 也可以投射手机屏幕,但是需要通过 USB 发送 ADB 命令,同时用 USB 投射手机屏幕和发送 ADB 命令好像不行,所以用的是 WiFi 投射手机屏幕。

END

0 人点赞