返回

辅助工具让跳一跳成为微信最热门的小游戏

前端

玩两把微信刚出的跳一跳小游戏后,笔者身作为一个前端开发,就有了辅助的实现思路,结合Node和Android知识来一波儿。这个辅助开发的时间还算早,后来网上也出现了更牛的辅助(自动识别物体计算距离),实现思路都差不多,具体可以参见年前29号(微信的6.6.1也是当天更新的) 发的推文。

作为前端,我们肯定是不需要开发Android原生的,所以思路是通过ADB命令来控制手机,辅助功能的大部分逻辑都在Node.js里实现。

以下是辅助实现的基本原理:

  1. 手机截屏并将图像传到电脑
  2. Node.js读取图片,识别并计算出物体中心坐标
  3. 通过ADB发送tap命令,控制手机点击

整体的流程图如下:

[图片]

以下是详细的实现过程:

1. 截屏

安卓6.0开始,提供了截图到SD卡的功能,我们只需要发送ADB命令即可:

adb shell screencap -p /sdcard/screen.png

2. 图片读取

图片读取使用的是Node.js的gm库,可以很方便的进行图像处理:

var gm = require('gm').subClass({imageMagick: true});
gm('/sdcard/screen.png').size(function(err, size) {
  console.log(size);
});

3. 物体识别

物体识别使用的是开源库node-opencv,先对图片进行二值化处理,再进行轮廓识别,最后找到最大的轮廓,并计算出中心坐标:

var cv = require('opencv');
cv.readImage('/sdcard/screen.png', function(err, im) {
  if (err) throw err;
  im.threshold(127, 255, function(err) {
    if (err) throw err;
    im.findContours(function(err, contours) {
      if (err) throw err;
      var biggestContour = 0;
      for (var i = 0; i < contours.length; i++) {
        if (contours[i].area() > contours[biggestContour].area()) {
          biggestContour = i;
        }
      }
      var moments = cv.moments(contours[biggestContour]);
      var centerX = moments.m10 / moments.m00;
      var centerY = moments.m01 / moments.m00;
      console.log(centerX, centerY);
    });
  });
});

4. ADB发送tap命令

adb shell input tap X Y

其中X和Y是点击的坐标,可以通过3中计算得到。

完整代码

[代码]

使用这个辅助工具,可以更容易的玩微信跳一跳小游戏,提升自己的分数,成为朋友圈中的大神。