关于adb模拟触屏在王者荣耀中快速刷金币的研究

题目: 关于adb模拟触屏在王者荣耀中快速刷金币的研究

作者: 匿了

摘要: 文章阐述了在王者荣耀金币获取困难,参与游戏时间少的情况下使用adb(Android Debug Bridge)工具向运行着王者荣耀游戏的安卓手机发送点击指令,模拟触屏操作自动完成冒险模式中的挑战模式关卡.通过该方法,在三四个小时内获取到的金币数足以达到整周的金币上限,无需人工参与,把游戏者从重复枯燥的手动点击中解放出来.

关键字: adb 模拟触屏 王者荣耀 金币

正文:

 前言: 王者荣耀是2015年由腾讯游戏天美工作室开发并运行的一款MOBA类手游,荣获中国游戏风云榜《2015年度最佳电竞手游》,在2018中国科幻大会上获得最佳科幻游戏奖[x2],在年轻一代中大受欢迎.在王者荣耀中,游戏者操纵英雄进行对局,而英雄可以通过活动赠送,游戏内钻石购买,游戏内金币购买,游戏内充值点券购买,赠送英雄的活动较少,钻石可购买的英雄数量有限,大部分英雄都可以通过金币和充值的点券购买,对于非充值用户来说,积攒金币成为购买英雄的主要途径.

金币来源效率分析

在王者荣耀中,金币的主要来源有以下几个:(1)好友间互送获得,(2)冒险模式中的挑战模式获得,(3)完成游戏对局获得,(4)腾讯QQ会员每日礼包获得,(5)每日活跃任务获得,(6)每周战队赛结算获得,(7)王者荣耀贵族每周礼包获得,(8)特殊日子游戏活动获得,(9)赏金赛获得,(10)钻石夺宝获得.其中(1)每日最多可以获得25金币,(2)和(3)共享额度,额度跟信誉积分挂钩,信誉积分100-109分额度上限为每周3500,每日登录额外加100,七天都登录的话可以获得3500+700=4200金币,信誉积分110以上额度上限仍为3500,每日登录额外加200,七天都登录的话可以获得3500+1400=4900金币,(4)仅限QQ区,微信区暂无,(5)每日活跃任务上限为325金币,需要完成相对应的活跃任务方能领取,另外有周活跃宝箱两个,分别为200金币和500金币,(6)需要加入战队,即使不参加战队赛也能获得,一般为每周150金币,当然战队活跃度越高,金币越多,最低100,最高1500,(7)需要充值成为王者荣耀贵族,同时贵族等级升级时还会获得一次性的礼包奖励,包含几百金币,(8)概率事件,(9)与实力挂钩,玩家需要押784金币,在输的次数少于三的情况下尽可能多赢,赢四把差不多回本,10胜更是有着一千多的金币,然而elo匹配机制往往不会让玩家赢得这么轻松,(10)需要花费大量钻石,且是概率抽奖事件,这些活动可获得的金币数排序如下:特殊日子游戏活动(每次几百不等)>贵族每周礼包(每周128个到488个金币不等)>QQ会员每日礼包(普通会员每天38x7天=每周266个金币,超级会员每天58x7天=每周406个)>每日活跃任务(每日30个到325个不等)>每周战队赛结算(100到1500个不等)>完成对局(几十到一百几十不等)>挑战模式(除首次外每次几个到56个不等)>好友间互送(每日5到25个不等),这些活动出现频率排序如下:挑战模式(三分钟左右一局)>完成对局(三分钟以上一局)>每日活跃(24小时)=QQ会员每日礼包(24小时)=好友间互送(24小时)>贵族每周礼包(24*7=168小时)=每周战队赛结算(24*7=168小时)>特殊日子活动(不定期).那么每分钟金币收益排序为:挑战模式(稳定19.33333333个)>活跃任务(稳定15个)>游戏对局(稳定6.666666667个)>其他(小于1个),从以上数据可以看出,挑战模式是获取金币最快速,收益最高的途径.

挑战模式中金币收益效率分析

在王者荣耀挑战模式中共有四大主题,每个主题下有四个关卡,每个关卡有三种难度:普通,精英,大师.首先纵向来进行比较,选择第一个主题"堕落的废都"下的"召唤师战场"关卡,分别选择普通,精英和大师难度进行闯关,由于角色等级铭文等级都满了,加上选择AOE类型的刺客/战士进行自动闯关,英雄伤害已经溢出,三次闯关的时间都是一分钟零五秒左右,三次闯关获得的收益分别是4,10,15个金币,由于伤害溢出,不管难度如何,英雄基本上都能秒杀刷新出来的小怪,而大师难度可获得的金币数多于普通难度,故而接下来每个关卡都选择大师进行评估.接着进行横向的评估,每一主题下每一关卡用时与收益如下,1.1用时67s,获得15金,1.2用时57s,获得16金,1.3用时30s,获得19金,1.4用时45s,获得22金,2.1用时50s,获得22金,2.2用时100s,获得24金,2.3用时45s,获得29金,2.4用时60s,获得33金,3.1用时80s,获得30金,3.2用时75s,获得33金,3.3用时65s,获得39金,3.4用时65s,获得45金,4.1用时80s,获得37金,4.2无法自动完成,必须手动操作英雄完成,获得41金,4.3用时75s,获得48金,4.4用时87s,获得56金,每关的每秒钟金币收益为:(1.1)0.223880597 (1.2)0.280701754  (1.3)0.633333333  (1.4)0.488888889  (2.1)0.44 (2.2)0.24 (2.3)0.644444444  (2.4)0.55 (3.1)0.375  (3.2)0.44 (3.3)0.6  (3.4)0.692307692  (4.1)0.4625 (4.2)无  (4.23)0.64  (4.4)0.643678161,按每秒钟收益由高到低排序得到:(3.4)>(2.3)>(4.4)>(1.3)>(3.3)>(2.4)>(1.4)>(3.2)=(2.1)>(3.1)>(1.2)>(2.2)>(1.1)>(4.2),可以看到3.4,2.3,4.4,1.3,3.3差别不大,都在0.6以上,但是由于实际闯关时长分为加载时间和游戏时间,设加载时间为a,游戏时间为b,获得的金币数为c,则每秒钟可获得的金币数为c/(a+b),由于手机或模拟器性能限制,设a一定,则当c=56时,b=87,c=45时,b=65,c=29时,b=45,c=19时,b=30.由此可建立一元一次方程式,令56/(a+87)=45/(a+45),解之可得,当a=25时,等式成立,即加载时间为25秒时,(3.4)收益与(4.4)收益一样,当a>25时,(4.4)收益要比(3.4)收益高,其他关卡与(4.4)对比也类似,故而得出4.4为最佳闯关关卡.

模拟触屏常见方法比较

常见的屏幕大多为电容屏,电容式触摸屏幕的原理主要是在玻璃屏幕上镀一层透明的薄膜导体层,再在导体层外加上一块保护玻璃,双玻璃设计能彻底保护导体层及感应器。电容式触摸屏存触摸屏四边均镀上狭长的电极,在导电体内形成一个低电压交流电场。在触摸屏幕时,由于人体电场,手指与导体层问会形成一个耦合电容,四边电极发出的电流会流向触点,而电流强弱与手指到电极的距离成正比,位于触摸屏幕后的控制器便会计算电流的比例及强弱,准确算出触摸点的位置[X3]。根据电容屏的原理,只要能制造一个电场就可以实现模拟点击,达到触屏效果.常见的电场有水果电池,将导线一端插入水果中,导线另一端可用于模拟点击.但是由于这种电场是一直存在的,只能通过导线靠近-接触-离开电容屏形成一次模拟触屏,需要引入辅助机械臂工具来帮助导线移动,因此该方法不适合小工程.尽管如此,我们仍能从中受到启发,将水果电池的电源--水果替换成可编程的电源,通过编程控制电源通断电,通电时形成电场,断电时电场消失,此方法只需要导线与屏幕紧贴即可.为了增大导线与屏幕的接触面积,可选择导线+铝箔作为导线与屏幕的接触面,将铝箔固定在需要模拟触屏点击的地方,树莓派上的PIO针管可提供可编程可控制的电源.辅助机械臂还是树莓派是两种硬件上的实现方法,硬件条件不满足时还可以通过软件层实现.软件层的实现中以adb更为简单方便.

adb介绍

根据官网的介绍:"Android Debug Bridge (adb) is a command line tool that lets you communicate with an emulator or connected Android device.",adb是一个用于与安卓模拟器或安卓设备沟通的命令行工具,它提供的功能包括常规调试,无线调试,软件安装包管理,文件管理,网络测试,日志,屏幕截取及录制,以及系统管理等[x1].adb工具用于模拟触屏点击的命令为"adb shell tap X Y",其中X,Y分别为点击位置的X坐标和Y坐标,因此,只需要计算好每次点击的时间间隔,就可以实现模拟依次点击的功能.

adb安装

windows:

直接从官网(http://adbshell.com/downloads)上下载对应的安装包,或者浏览器输入此地址http://adbshell.com/upload/adb.zip即可直接下载,下载后点击安装即可,最后把安装目录添加到PATH变量中,使得在CMD.exe窗口中输入adb能直接使用.

linux:

以Ubuntu16.04为例,打开终端执行"sudo apt install android-tools-adb",输入密码即可,其余发行版本类似.

代码实现

首先理解代码执行流程,假设代码运行前安卓设备或模拟器已经连接好了,设备上安装并登录了王者荣耀,游戏角色达到满级30级,切换至冒险模式中的挑战模式,选好以及能够通关的出阵英雄(雅典娜-橘右京-赵云),英雄都配置好足够的铭文(最好150级满铭文,只需要等级,不在乎铭文属性).在以上条件满足后,程序开始执行,第一步程序模拟点击位于(1100 650)位置的"闯关",进入闯关加载界面,经过一定时间(因设备而异),加载完毕,进入闯关环节,程序模拟点击位于(1337 45)位置的"跳过"按钮,跳过开场白,注意到右上角的"自动"开关是否打开,若事前已打开则此时出阵英雄会自动进行闯关,经过40秒进入鲁班大师的开场白,程序模拟点击位于(1337 45)位置的"跳过"按钮,跳过鲁班大师的开场白,再经过19秒钟出阵英雄与鲁班大师战斗完毕,程序模拟点击位于(1337 45)位置的"跳过"按钮,跳过白起的开场白,再经过27秒出阵英雄与白起战斗完毕,程序模拟点击位于(1337 45)位置的"跳过"按钮,跳过白起的结束语,此时屏幕播放结算动画,经过2到3秒(视设备配置高低而定)后结算完毕,屏幕显示"点击屏幕继续",此时可点击任意地方,故而继续点击位于(1337 45)位置,然后经过1到3秒屏幕跳转到再次挑战的提示页面,程序模拟点击位于(1230 735)位置的"再次挑战"按钮,经过1到3秒(视设备配置高低而定),屏幕跳转到闯关界面,即最初的界面,此时,一次闯关循环结束.伪代码如下:

```

while loop begin:

    click (1100 650)  // 点击闯关按钮,跳转到闯关加载界面

    pause (X)  // 闯关加载界面

    click (1337 45)  // 点击跳过按钮,跳过开场白

    pause (40)  // 游戏人物自动闯关

    click (1337 45)  // 点击跳过按钮,跳过鲁班大师开场白

    pause (19)  // 游戏人物与鲁班大师战斗

    click (1337 45)  // 战斗结束,跳过白起的开场白

    pause (27)  // 游戏人物与白起战斗

    click (1337 45)  // 战斗结束,跳过白起的结束语

    pause (Y)  // 播放闯关结算动画

    click (1337 45)  // 播放动画结束,点击屏幕任意位置

    pause (Z)  // 跳转到再次挑战的提示界面

    click (1230 735)  // 点击再次挑战按钮

    pause (W)  // 跳转到闯关界面

end loop

```

linux shell代码如下(通过usb数据线连接真机):

```

#!/bin/bash

while :

do

    echo "按下闯关"

    adb shell input tap 1100 650

    sleep 14

    echo "按下跳过"

    adb shell input tap 1337 45

    sleep 40

    echo "按下跳过"

    adb shell input tap 1337 45

    sleep 19

    echo "按下跳过"

    adb shell input tap 1337 45

    sleep 27

    echo "按下跳过"

    adb shell input tap 1337 45

    sleep 6

    echo "按下任意位置"

    adb shell input tap 1337 45

    sleep 3

    echo "按下再来一次"

    adb shell input tap 1230 735

    sleep 3

done

```

注:连接真机后可通过在终端中输入"adb devices"查看是否连接成功,上述时间为参考值,实际时间由实际设备及网络情况决定

Windows由于power shell中无sleep类似的函数调用,无法使得进程睡眠一段时间,故无纯power shell实现,但可以通过python调用实现,代码如下:

```

import os

import time

while True:

  print("starting")

  os.system("adb shell input tap 1100 650")

  time.sleep(14)

  print("loading is ended")

  os.system("adb shell input tap 1337 45")

  print("skipping")

  time.sleep(40)

  print("skipping sayings 1")

  os.system("adb shell input tap 1337 45")

  time.sleep(19)

  print("skipping sayings 2")

  os.system("adb shell input tap 1337 45")

  time.sleep(27)

  print("skipping sayings 3")

  os.system("adb shell input tap 1337 45")

  time.sleep(6)

  print("press any key to continue")

  os.system("adb shell input tap 1337 45")

  time.sleep(3)

  print("play again")

  os.system("adb shell input tap 1230 735")

  time.sleep(3)

```

注:Windows下使用网易的MuMu模拟器运行游戏的时候,需要在cmd命令行中手动连接模拟器,命令为:"adb connect 127.0.0.1:7555",上述时间为参考值,实际时间由实际设备及网络情况决定

存在问题与缺陷

误差累积,由于设备性能并非永远保持一致,即加载时间并非定值,可能导致点击提前或延迟,防止点击提前的一种办法为:出现待点击的按钮之后等待0.5秒到1秒再点击,即将加载时间加上0.5到1秒缓冲容错时间视为最终加载时间,但这会造成误差累积,假设第一次加载提前了,点击延迟0.5秒,下一轮循环的第一次加载又提前了,点击再次延迟0.5秒,累计到1秒,累积下去将会使得某一次需要点击的没有点击(一般为第一次"跳过"),一种解决办法为:多次测试加载时间,取平均值,尽可能关掉手机或模拟器的后台服务,清理无用内存

参考文献:

[x1]:http://adbshell.com/

[x2]:https://pvp.qq.com/

[X3]:林峰.探析电容式触摸屏的原理与应用[J].中国科技财富,2011, (24):156,151

你可能感兴趣的:(关于adb模拟触屏在王者荣耀中快速刷金币的研究)