0.前言

微信小程序跳一跳是个挺不错的游戏,但身为一个天生爱折腾的geek,还是忍不住挑战这游戏的上限。

效果如下动图,游戏开始,程序会自动识别小人的坐标,你只需点击要跳到的那一个方块,程序将自动算出并帮你按下屏幕若干秒,小人即完成一次跳跃。

效果图

1.相关技术

实现起来其实相当简单,主要用到几个技术点:

悬浮窗
在Android代码中执行Shell命令实现模拟触屏,截取屏幕图片
opencv进行图片定位识别
注意:Android程序要执行shell命令,得有root权限,所以要运行这个程序,你需要有个已经root的手机。

2.实现思路

2.1 如何知道要按多久屏幕

很显而易见地:小人与目标方块离得越远,需要按下屏幕的时间就越长,两者成正相关。我们可以有个大胆的假设:两者能否用简单的线性关系去拟合,那么就有以下的公式:

按下时间 = 距离 * 常量系数

这个常数怎么确定呢?其实就是猜,多调试几次,就能拿到比较准确的数字。

如果距离过近或过远,落点产生误差,我们可以根据不同距离范围动态调整系数。

2.2 小人与目标方块坐标与距离的获取###

要算距离,首先要得到坐标,笔者想到了几种方式:

点击小人底部,然后点击目标方块顶部,两次点击事件回调,就能得到两个坐标。
用图像处理得到小人的坐标,目标方块坐标由点击屏幕产生。
小人与目标方块坐标都用图像识别得到。
可见第三种最理想,甚至能让程序自己在玩游戏,但目前本程序采用了第二种方式。

距离公式.png
得到坐标后,根据两点间距离公式,算出小人与目标方块的距离。

2.3 悬浮窗

有上一小节可知,目标方块的坐标需要我们点击屏幕产生,此时就有个问题:我们要获取目标方块坐标,但不能直接点在小程序上,否则会触发小人跳动。因此,我们可以创建一个透明的悬浮窗来解决这个问题。

使用悬浮窗,捕抓目标方块坐标
当悬浮窗覆盖在小程序上方,点击小程序上的目标方块,实际上是点击透明的悬浮窗,因此对应位置的坐标就能被我们捕获,并不会触发小程序。

2.4 openCV的使用

判断小人在屏幕的位置,实质上是一种“查找B图中在A图中的位置”的需求,其中A图就是手机屏幕截图。这需求我们可以使用openCV的Imgproc.matchTemplate方法完成。

在游戏开始时,执行shell指令截取屏幕图像,然后用Imgproc.matchTemplate方法查找截图中小人的位置,记录作为起跳坐标。

等一轮跳跃结束后,再次执行shell命令截取屏幕图像,分析小人跳跃后的位置,做好下一次跳跃的准备。

match.png
2.5 在程序中执行shell指令

本程序使用到shell指令的地方有两处:

模拟手指在屏幕按下。
截取手机屏幕图片。
对应的adb指令如下:

adb shell input touchscreen swipe 1000 1000 1200 1200 time
adb shell /system/bin/screencap -p /storage/emulated/0/JumpX/screenshot.png

要注意的是,在执行swipe指令前,需要将悬浮窗remove掉,否则swipe指令会作用在悬浮窗上,而非小程序。

最后推荐一个好用的Shell工具类:

https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ShellUtils.java

3.部分关键代码

3.1 悬浮窗

悬浮窗的实现很简单,网上也有很多参考资料。

//设置悬浮窗参数并显示
mParams = new WindowManager.LayoutParams();
mWindowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
mParams.format = PixelFormat.RGBA_8888;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mParams.x = 0;
mParams.y = 0;
mParams.width = JumpUtils.SMALL_SIZE_WIDTH;
mParams.height = JumpUtils.SMALL_SIZE_HIGH;
mLinearLayout = (MyLinearLayout) LayoutInflater.from(getApplication()).inflate(R.layout.layout, null);
mButton = mLinearLayout.findViewById(R.id.btn);
mWindowManager.addView(mLinearLayout, mParams);

WindowManager添加了一个继承于LinearLayout的控件,实现该控件主要是便于重写onDraw方法,绘制小人位置区域,关键代码如下。

@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);//绘制小人位置方框if (mIsNeed2DrawLittleBoyRect && point1 != null && point2 != null) {Paint paint = new Paint();paint.setColor(Color.RED);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(6f);paint.setAntiAlias(true);RectF rectF = new RectF(point1.x, point1.y, point2.x, point2.y);canvas.drawRect(rectF, paint);}//清除上一次的绘制if (!mIsNeed2DrawLittleBoyRect  && point1 != null && point2 != null ) {Paint paint = new Paint();paint.setColor(Color.parseColor("#00000000"));paint.setStyle(Paint.Style.FILL);RectF rectF = new RectF(point1.x, point1.y, point2.x, point2.y);canvas.drawRect(rectF, paint);}
}

3.2 openCV识别小人坐标

openCV识别小人的关键代码如下:

private void try2MatchLittleBoy() {Mat source = new Mat();   //Mat相当于Android的BitmapMat template = new Mat();//由于笔者开了root与文件读写权限,若在Android M或更高级的系统上,可能需要按照官方的文件读写实现,否则返回的bitmapSource可能为nullBitmap bitmapSource = BitmapFactory.decodeFile(JumpUtils.SCREENSHOT_FILE_NAME);Bitmap bitmapTemplate = BitmapFactory.decodeFile(JumpUtils.LITTLE_BOY_FILE_NAME);Utils.bitmapToMat(bitmapSource, source);Utils.bitmapToMat(bitmapTemplate, template);//创建于原图相同的大小,储存匹配度Mat result = Mat.zeros(source.rows() - template.rows() + 1, source.cols() - template.cols() + 1, CvType.CV_32FC1);//调用模板匹配方法Imgproc.matchTemplate(source, template, result, Imgproc.TM_SQDIFF_NORMED);//规格化Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1);//获得最可能点,MinMaxLocResult是其数据格式,包括了最大、最小点的位置x、yCore.MinMaxLocResult mlr = Core.minMaxLoc(result);org.opencv.core.Point matchLoc = mlr.minLoc;//通知成功匹配的坐标notifyDrawLittleBoyRect(matchLoc, template);
}

3.3 算出按下屏幕时间

得到两点距离后,根据不同的距离范围有不同系数,算出需要按下屏幕时间。

//两点之间的距离
double distance = Math.sqrt(Math.pow(firstPoint.x - secondPoint.x, 2) + Math.pow(firstPoint.y - secondPoint.y, 2));
//根据两点距离判断起跳系数
float ratio = distance > 600 ? JumpUtils.JUMP_SPEED_SLOW : distance < 300 ? JumpUtils.JUMP_SPEED_FAST : JumpUtils.JUMP_SPEED;
//生成按下屏幕的时间
final double holdTime = distance * ratio;

3.4 执行Shell 指令

模拟按下屏幕:

//执行swipe命令
new Thread(new Runnable() {@Overridepublic void run() {String command[] = new String[]{"sh", "-c","input touchscreen swipe 1000 1000 1000 1000 " + (int)holdTime};ShellUtils.CommandResult commandResult = ShellUtils.execCommand(command, true, true);Log.d("Achilles:", commandResult.errorMsg);}
}).start();

截取屏幕图片:

new Thread(new Runnable() {@Overridepublic void run() {String command[] = new String[]{"sh", "-p","/system/bin/screencap " + JumpUtils.SCREENSHOT_FILE_NAME};ShellUtils.CommandResult commandResult = ShellUtils.execCommand(command, true, true);Log.d("Achilles:", commandResult.errorMsg);}
}).start();
//延时800ms,确保截图完成后,进行图片匹配
mHandler.sendEmptyMessageDelayed(MSG_SCREENSHOT_COMPLETE, 800);

项目链接https://github.com/AchillesLzg/jianshu-jumpx

本文作者: AchillesL
原文地址:微信小程序跳一跳的游戏辅助实现-教程-小程序社区-微信小程序-微信小程序开发社区-小程序开发论坛-微信小程序联盟

微信小程序跳一跳的游戏辅助实现相关推荐

  1. 微信小程序—跳一跳,Android游戏助手(外挂)使用教程

    作为一名有着丰富实战经验的Android开发人员,作为一个有着一定基础和实战的逆向新司机,第一次面对github上的这个项目自己也是懵的,即使看完了README,也还是不知道从何下手.在此之前玩游戏从 ...

  2. 微信小程序跳一跳java代码_安卓版微信小程序跳一跳辅助

    今天一上班 被github上的一篇名为<教你用python玩跳一跳>吸引,它的星也瞬间从3400涨到4400 原作者主要就是用python 脚本去 玩微信小程序跳一跳,本次是基于安卓机型配 ...

  3. 微信小程序跳一跳辅助之路(安卓版)

    今天一上班 被github上的一篇名为<教你用python玩跳一跳>吸引,它的星也瞬间从3400涨到4400 原作者主要就是用python 脚本去 玩微信小程序跳一跳,本次是基于安卓机型配 ...

  4. php小程序 跳一跳,微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧

    前言 小程序跳一跳最近很火,之前爆出微信游戏小程序漏洞,网上也不乏大神.这里就用一大神的python脚本来刷下高分. 配置过程 注: 电脑环境未配置python环境,请自行谷歌或者百度配置,这里不再做 ...

  5. 微信小程序跳一跳辅助之路(ios直接改分版)

    获取到session_id 然后去下边的网站 直接改分 苹果手机教程   (注意:Mac和ios设备 必须在同一个局域网下 也就是 链接的是相同的wifi) 大致原理就是抓包 然后改微信小程序向微信后 ...

  6. 【CSDN下载】第七期:微信小程序跳一跳游戏破解源码、Modbus TCP和TCP通信测试

    为便于广大开发者对热门资源的下载需求,下载频道专为广大开发者开辟了推荐一周IT优质资源通道,以供开发者参考下载,同时欢迎大家上传优质资源并留言所需的资源,小编会汇总所需,及时奉上所求. 源码系列 微信 ...

  7. 用python 玩微信小程序“跳一跳”

    12月28日,微信上线了小游戏「跳一跳」,瞬间成了全民游戏,如何牢牢占据排行榜的第一位呢?用Python帮助你,Python真的无所不能. 作为技术出身的我们,是不是想用技术改变排名呢? 注意:本文适 ...

  8. 手把手教你玩微信小程序跳一跳

    最近微信小程序火的半边天都红了,虽然不会写,但是至少也可以仿照网上大神开发外挂吧!下面手把手教妹纸们(汉纸们请自觉的眼观耳听)怎么愉快的在微信小游戏中获得高分. 废话不多说,咱们这就发车了!呸!咱们这 ...

  9. 微信小程序跳一跳辅助程序(手动版)

    最近,微信官方推出了demo小程序游戏<跳一跳>,这个游戏操作简单,容易上手,却又不容易获得高分,受到很多人的喜爱(emm...这游戏有毒).自己也尝试了玩了几次,作为一个手残+脑残的资深 ...

  10. WeChat_微信小程序跳一跳辅助

    上次在GitHub上explore里榜首发现一个有趣的项目,对于这个我的评价是:"技术活儿,可没法儿赏啊!" 教你如何用python来玩微信跳一跳! 这是其原理,并不复杂,通俗易懂 ...

最新文章

  1. WCF wsHttpBinding之Transport security Mode, clientCredentialType=”Basic”
  2. BZOJ1444: [Jsoi2009]有趣的游戏(Trie图,矩乘)
  3. optional判断是否为空_乐字节Java8核心特性之Optional
  4. 前端工程师后端转型实录
  5. python连接kafka-python连接kafka生产者,消费者脚本
  6. sqlserver检索函数、存储过程、视图 中的关键字
  7. java 调用jira_java调用jira接口
  8. linux安装指定版本python_ubuntu多版本python为指定版本python安装库
  9. typescript语法高亮插件_vscode常用插件
  10. ecshop dizcuz会员整合
  11. 零基础学python鱼c-《零基础入门学习Python》第二版和第一版的区别在哪里呢?...
  12. [TimLinux] JavaScript AJAX接收到的数据转换为JSON格式
  13. Hibernate一级缓存、二级缓存以及查询缓存的关系
  14. 如何迅速的找到合适的开发者?
  15. H.264标准(二)FLV封装格式详解
  16. 免费QQ币:永不过期的刷QQ币技巧共享
  17. 最新宝塔自助建站系统8.0源码
  18. 我看了《2018 微信数据报告》,你呢?
  19. 【CSS3动画】利用CSS3制作“百度浏览器”官网奔跑的北极熊效果(不含背景移动)
  20. matlab ifs植物形态,matlab练习程序(IFS分形)

热门文章

  1. laravel之生成PDF文档-TCPDF
  2. ios14描述文件无法与服务器连接,iOS14屏蔽更新描述文件已损坏,无法安装的解决办法...
  3. Hibernate学习笔记(三) — Hibernate 的一级缓存意义
  4. Deepin安装phpstorm教程
  5. 如何自定义Steam搜索设置
  6. VBA(7)字典及常用应用
  7. c++中string 各种函数的函数用法
  8. 软件著作权申请怎么申报?申报流程、应该注意哪些事项
  9. xhEditor技术手册
  10. 蓝屏维修记录: IRQL_NOT_LESS_OR_EQUAL、WiseTDIFw64与iaStorAVC问题