adb linux 微信游戏,微信跳一跳的正确姿势

本文介绍了一种通过ADB shell技术实现的微信小游戏《跳一跳》精准控制方法,作者通过实验数据和图像分析,揭示了时间与跳跃距离的关系,并利用这些信息创建了自动控制脚本,使得游戏得分不再受限于玩家技巧。
摘要由CSDN通过智能技术生成

最近被微信的一张图片刷屏了,只要一打开朋友圈,都能看到同样一张图。本以为又是吃鸡的画面,一直没去理会。直到偶然有一天刷头条才知道,继小程序之后,微信的小游戏又横空出世了,不得不说,腾讯在这些方面做的还蛮有前瞻性的。

而所谓的微信跳一跳,就是微信小游戏平台上线以来,最火爆的一款小游戏。我玩了一会,发现这个游戏的逻辑其实挺简单的,只需要控制按下去的时间,就能控制跳出去的距离。控制时间这种事情对于人类是最不擅长的了,何不交给计算机自己来做呢?废话不多说,先来尝试一下。

adb shell方式

通过尝试,此种方法对于没有root的普通手机也适用,那我们就先用这种方法来尝试一下精确控制的快感。

首先手机的usb调试模式必须得打开,然后接入电脑,执行以下命令:

adb shell

进入命令终端之后,我们就可以实现许多在linux层可以干的事了,当然包括模拟触摸事件。

如执行以下命令,可实现在屏幕坐标为(200,300)的点上实现500ms的触摸事件。

input swipe 200 300 200 300 500

通过最后一个参数,就可以实现对触摸时间进行精确的控制,如果能够找出时间与距离的对应关系,那么这个游戏对我们来说最难的地方就被破了,哈哈。

以下是我在小米mix2平台实测出来的数据:

时间t(ms)

距离d(cm)

距离d(pix)

100

0.4

63.52

200

0.8

127.04

300

1.2

190.56

400

1.8

285.84

500

2

317.6

600

2.6

412.88

700

3

476.4

800

3.4

539.92

900

4.1

651.08

以下是绘制出来的图像:

1ef1f43dbb2f

image.png

如果图像是这样的话,那真的是太完美了,可以直接就用一条直线去代替了,不用再麻烦地建立查找表,接下来当然就是解方程组的问题。

设直线为t=kd+b,选两个靠谱的点(0.4,100),(4.1,900)代入解得k=216.2,b=13.5,所以时间的计算公式为:

t=216.2*d+13.5

好了,有了adb和这个公式之后,再加一把尺子,我们就能想玩多少分就玩多少分了,当然还得看你耐心如何。

脚本自动控制

经历过adb控制的话,相信你一定能够体会到这个过程是多么的让人烦躁,为了装一个b容易吗我。如果能够有这种想法那就对了,枯燥的过程能用计算机解决的,绝对不应该让人亲自去干。

那如果要让手机自动运行这套思想,有什么难点需要跨越呢?

其实对于自动处理来说,最难地方的在于坐标点的获取,也就是说,我们在用直尺测量的这个过程,要用程序来模拟。那么问题来了,要获取距离,就需要得知两点的具体坐标,即起跳点和落地点,这个坐标该怎么来呢?

这时我联想到曾今做过的飞思卡尔智能车比赛,当时做的是摄像头组,可以基于这些思想来搞一套简单的图像识别啊,说干就干。回到家我连一直在追的连续剧也没看,一直干到深夜。

经过了解,按键精灵这个平台非常满足我的需求,他提供了许多api,关键的api有以下几个:

FindPic//查找图片

Tap//点击屏幕

Delay//延时

GetPixelColor//获取指定坐标的颜色

CmpColor//比较两个颜色是否相同

Touch//触摸屏幕一段时间

大概思路就是,通过FindPix这个接口,实现起跳点的定位,这个很好实现,因为起跳点的长相不会变,逃不出这个接口的手掌心。

主要难点在于落地点的识别算法上面,我尝试过很多方法,最后觉得最有效的还是下图这种识别方式:

1ef1f43dbb2f

image.png

A点是起跳点,这个已知,通过这个点延伸一条虚线出去,现在我们设一动点P,从P0滑动到A,在滑动的过程中检测P点当前位置的像素,有没有颜色跳变,如果有的话那么此时P点的坐标就是B2点的坐标。

接着通过A点和B2点算出两者间的距离,得出的距离再根据实际方块大小稍微调小一点,差不多就是AB线段的长度了。

好了,方法说完了,想想其实蛮简单的,当年飞思卡尔也是用这种low到不行的方法来获取各种边界,最终才勉强把赛道识别出来。

方法如上所说,接着到了计算环节,只有经过精密的计算之后,才能变换为代码自动运行起来。

1ef1f43dbb2f

计算过程-低分.jpg

上图是我的一个计算过程,偷个懒直接上原始图,有点乱。

这里简要说明一下:

w,h

屏幕的横向和纵向分辨率

A(x,y)

起跳坐标,由FindPic得出

P(x,y)

AP0线段上的动点

a

虚线与水平线的夹角,tan(a)=0.58

这个很关键,知道了A点坐标,还需要知道这个夹角才能把虚线定下来,这个角通过测量加计算,算出来tan(a)=0.58

B_dir

落地点位于屏幕中心的位置,-1代表左边,1代表右边

最终得出的结论有如下:

P0坐标

B_dir=-1:

P0_x=0

P0_y=A_y-A_x*tan(a)

B_dir=1:

P0_x=w

P0_y=A_y-(w-A_x)*tan(a)

tan(a)

tan(a)=0.58

P_y与P_x的关系

P_y=A_y-B_dir*tan(a)(P_x-A_x)

代码

有了以上结论,写程序就顺利成章了。按键精灵采用MQ语言,大概看了下,和老古董VB长得好像,古董归古董,能实现功能就好,以下是代码,各位看官慢慢品味吧,顺便帮忙找找bug。

Dim w=GetScreenX(),h=GetScreenY()

TracePrint "w,h:", w, h

Dim A_x,A_y,B_x,B_y,B_dir,B2_x,B2_y

Rem retry

TracePrint "begin"

//判断是否已经失败

Dim retryButton_x,retryButton_y

FindPic 0, (h-h/8), w-1, (h-h/8*2), "Attachment:retryButton.png", "000000", 1, 0.9, retryButton_x, retryButton_y

If retryButton_x > 0 And retryButton_y > 0 Then

Tap retryButton_x, retryButton_y

TracePrint "retry"

Delay(3000)

End If

//获取A点坐标

FindPic 0, h/2-100, w, h/4*3, "Attachment:chess.png", "000000", 1, 0.9, A_x, A_y

A_x = A_x + 22

A_y = A_y + 97

TracePrint "A:", A_x, A_y

//判断目标方向

If A_x >= w / 2 Then

B_dir = -1//B在左

Else

B_dir = 1//B在右

End If

//遍历路径获取B/B2点坐标

Dim P0_x

Dim P_x,P_y,delta_x

Dim P_x_pre,P_y_pre

If B_dir = -1 Then

P0_x = 0 + 100

delta_x = 2

Else

P0_x = w - 1 -100

delta_x = -2

End If

Dim tan_a = 0.58

P_x_pre = P0_x

P_y_pre = A_y - B_dir * tan_a * (P0_x - A_x)

For P_x = P0_x To A_x Step delta_x

P_y = A_y - B_dir * tan_a * (P_x - A_x)

//对比颜色

Dim color_pre = GetPixelColor(P_x_pre, P_y_pre)

Dim ret=CmpColor(P_x, P_y, color_pre, 0.99)

//TracePrint "P:", P_x, P_y, "ret:", ret

If ret = -1 Then

B2_x = P_x

B2_y = P_y

Exit For

End If

P_x_pre = P_x

P_y_pre = P_y

Next

TracePrint "B:", B_x, B_y

TracePrint "B2:", B2_x, B2_y

//计算距离

Dim dis_pix,dis_cm

dis_pix = Sqr((A_x - B2_x) ^ 2 + (A_y - B2_y) ^ 2) - 90

dis_cm = dis_pix / 158.8

TracePrint "dis_pix:", dis_pix

TracePrint "dis_cm:", dis_cm

//计算按键时间

Dim t

t = dis_cm * 216.2 + 13.5

t = CInt(t)

If t < 100 Then

t = 100

End If

TracePrint "t:", t

//发送事件

Touch w - 100, (h / 4 * 3), t

TracePrint "end"

Delay 1600

Goto retry

屏幕坐标获取技巧

找到设置,打开指针位置的选项,可以很方便的获取任意位置得坐标。

1ef1f43dbb2f

图片发自简书App

好了,以上便是此次玩跳一跳所用的全部姿势,现在感觉好累,让我的手机自动跳吧,我休息去了~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值