淘宝玩个球有辅助吗 淘宝玩个球介绍

淘宝玩个球这个游戏虽然简单,但是想要玩高分还是很难的,毕竟有好几亿的人和你一起玩游戏,那么问题来了,淘宝玩个球有辅助么?目前来说排名前进的分数还是很高的,想要玩的这个上万分还是很难的!

淘宝玩个球有辅助吗 淘宝玩个球介绍

文章插图
淘宝玩个球辅助有吗?淘宝小游戏玩个球自动执行
本文记录了为实现本游戏的自动执行而做的探索过程
淘宝玩个球有辅助吗 淘宝玩个球介绍

文章插图
第一阶段: 通过截屏进行判断
1.1 基本步骤
1) 通过adb shell截屏2) 判断特定行的蓝色和红色像素数量3) 通过adb shell发送指令
1.1.1 截屏
首先获得用su获得root权限(后面的步骤需要) 然后用screencap命令截屏, 图片放到放到手机SD卡里, 然后通过pull命令将图片复制到电脑上(d:ss.png)
suadb shell screencap sdcard/#swap/ss.pngadb pull /sdcard/#swap/ss.png d:ss.png
1.1.2 加载图片, 判断颜色
最开始使用C语言编写, 使用altimage.h提供的库.
CImage类是ATL和MFC共用的一个类,其头文件为atlimage.h,主要用于图片文件的打开,显示与保存 。这里需要注意的是,在VS2010和VS2012的MFC编程中,不需要将头文件包含进来 。MFC中要使用CImage类,必须先将头文件包含进来,可以包含在当前代码的CPP文件中,也可以包含在所属类的头文件中,不过最好还是包含在工程的stdafx.h文件中 。CImage总共有39个成员函数 。
(百度百科)
首先执行上面的命令, 然后进行图片的判断
system(D:input.bat);image.Load(_T(D:ss.png));bool result = check(895, image);
其中check函数定义如下, 判断第row行红色像素和蓝色像素哪个多一些.
// 返回 false代表蓝色, true代表红色bool check(int row, CImage image) { int blue = 0; int red = 0; for (int i = 0; i1080;i) { COLORREF color = image.GetPixel(i, row); BYTE r = GetRValue(color); BYTE g = GetGValue(color); BYTE b = GetBValue(color);// 当时考虑到方块表面可以有一些轻微的渐变效果 所以设置了RGB的范围 后来发现是纯色 if (r = 250g = 94g = 103b = 97b = 103) { red; } if (r = 50r = 56g = 250b = 250) { blue; } } return redblue;}
1.1.3 命令发送
使用adb提供的input命令可以模拟触摸操作(需要root权限)
淘宝玩个球有辅助吗 淘宝玩个球介绍

文章插图
没用root权限直接使用input tap只会显示一个killed, 手机上没有任何反应. 获得root权限之后手机就有反应了, 电脑上没有任何报错.
代码如下, 首先打开一个文件 向里面写入root授权命令和input命令, 然后将adb shell命令的输入定向到该文件
ofstream f(D:.input);bool result = check(895, image);fsuendl;if (result[i])finput tap2841606endl;elsefinput tap7971608endl;system(adb shellD:.input);
1.2 出现的问题及优化
1.2.1 出现的问题
程序根本无法使用! 因为太慢了. root授权需要1s左右, 截屏需要1s左右, tap命令从发出到执行也至少需要1秒左右~
所以我从针对上面的问题进行了如下优化
1.2.2 改用java语言
C似乎无法获取到adb命令的输入流,所以只能讲命令写到文件里,adb执行完这几条命令就退出了;要执行新的命令必须重启adb,重启就意味着要重新进行root授权,极其浪费时间 。
Java语言的优势是不仅可以执行外部程序,还能获得输入流输出流,可以在其它程序执行时向其动态写入命令(代码的参考资料)
try {Process mainProcess = Runtime.getRuntime().exec(adb shell);DataOutputStream os = new DataOutputStream(mainProcess.getOutputStream());os.writeBytes(su);os.flush();//处理错误输出流final BufferedReader brError = new BufferedReader(new InputStreamReader(mainProcess.getErrorStream()));ReaderThread t2 = new ReaderThread(brError, error);t2.start();//处理标准输出流final BufferedReader br = new BufferedReader(new InputStreamReader(mainProcess.getInputStream()));ReaderThread t1 = new ReaderThread(br, std);t1.start();os.writeBytes(input tap(797random.nextInt(30) - 15)(1608random.nextInt(30) - 15));os.flush();} catch (IOException e) {e.printStackTrace();}

推荐阅读