前言:最近跳一跳太火,你们都在写,今天把原理来讲说,说得不对欢迎指出!html
注:请不要加我微信,省得尴尬!(^_^)android
准备工做:算法
1.电脑shell
2.数据线安全
3.安卓手机(由于我这渣渣电脑带不动模拟器,只能写真机版)微信
第一步:电脑安装ADB(https://developer.android.google.cn/studio/releases/platform-tools.html)ide
下载解压就能够了测试
第二步:你们不须要配置啥环境变量,我搞半天没搞懂,直接在ADB目录建立易语言源码就不须要配置了!google
第三步:手机用数据线链接电脑。手机打开USB调试,还须要打开手机USB调试下面的“模拟按键”调试
没有“模拟按键”的就打开“USB安全权限”,以我VIVOX20A打开“USB安全权限”打不开,
问客服才知道要先退出VIVO帐号,再登录,才能打开。
第四步:打开第二步建立的易语言源码,建立图片框、两个按钮、一个编辑框。界面以下
以上工做作完以后,先来测试下ADB,看是否链接到手机
到ADB目录建立一个a.bat
a.bat用记事本打开
输入”start"保存
运行a.bat获得一个CMD界面
在CMD里面输入“adbshellinputkeyevent3”(这个是按下手机主页面键)回车,看手机是否回到主页面
而且CMD里面没有输出错误!
以上准备工做作完,下面进入代码阶段:
自动模式:
由于跳一跳背景和道具多为渐变色,因此识别不是太好,说下原理(我用这个模式只跳220多点)
第一步:截取手机屏幕保存为图片,并送传到电脑,加载到图片框,代码以下(子程序名:那么咱们就开始跳吧)
.版本 2 .子程序 那么咱们就开始跳吧 ' 删除以前取到的截图 .判断开始 (集开始 = 假) 返回 () .默认 .判断结束 删除文件 (取运行目录 () + “\tiaoyitiao.png”) ' 使用adb命令截取手机屏幕 运行 (“adb shell screencap -p /sdcard/tiaoyitiao.png”, 真, 1) ' 手机截屏保存到SD卡根目录 运行 (“adb pull /sdcard/tiaoyitiao.png”, 真, 1) ' 图片传送到电脑程序目录上 图片框1.图片 = 读入文件 (取运行目录 () + “/tiaoyitiao.png”) ' 把图片显示到软件上 .判断开始 (集手动 = 假) 取棋子底部坐标 () .默认
代码都有备注,能够看看,看到最后面有个“取棋子底部坐标()”
那么下一步代码
.版本 2 .子程序 取棋子底部坐标 .局部变量 color, 整数型 .局部变量 刷子句柄, 整数型 .局部变量 画笔句柄, 整数型 .局部变量 r, 整数型 .局部变量 g, 整数型 .局部变量 b, 整数型 .局部变量 x, 整数型 .局部变量 y, 整数型 ' 临时代码 () dc = GetDC (图片框1.取窗口句柄 ()) ' 设置场景 画笔句柄 = CreatePen (0, 1, #黑色) ' 画笔颜色 、 形状、粗细 刷子句柄 = CreateSolidBrush (#红色) ' 刷子颜色 x = 0 y = 270 ' 定位Y270 加快速度 .判断循环首 (真) x = x + 1 .判断开始 (x > 图片框1.宽度) ' X轴不能大于组件宽度 x = 1 y = y + 1 .判断 (y > 图片框1.高度) ' Y轴不能大于组件高度 _按钮1_被单击 () 信息框 (“未找到”, 0, , ) 跳出循环 () .默认 .判断结束 color = GetPixel (dc, x, y) ' 取坐标颜色 .判断开始 (color = 6042679) ' 棋子特征颜色 跳出循环 () .判断 (color = 6502712) ' 棋子特征颜色 跳出循环 () .判断 (color = 6371383) ' 棋子特征颜色 跳出循环 () .判断 (color = 6699831) ' 棋子特征颜色 跳出循环 () .默认 .判断结束 .判断循环尾 () SelectObject (dc, 画笔句柄) ' 更换画笔 Ellipse (dc, x - 3, y - 3, x + 3, y + 3) ' 画空心圆 SelectObject (dc, 刷子句柄) ' 更新刷子 Ellipse (dc, x - 3, y - 3, x + 3, y + 3) ' 画实心圆 DeleteObject (刷子句柄) ' 释放刷子 DeleteObject (画笔句柄) ' 释放画笔 棋子.x = x ' 记录棋子坐标 棋子.y = y 输出调试文本 (“棋子颜色:” + 到文本 (color)) 取小板登坐标 ()
能够看到,棋子我是直接找的4个颜色,通过多方测试,这四个颜色都能识别到棋子底部
找到这个颜色就把坐标记录下来。而且用刷子在坐标的位置画个实心圆显示给咱们看,
方便调试!
并且Y轴是从270开始的,一行一行的找,加快速度,按个人图片框高度是从270的!!!!
棋子的坐标找到了,那么咱们再找“板凳”的坐标(“板凳”的坐标识别不太理想)
.版本 2 .子程序 取小板登坐标 .局部变量 color, 整数型 .局部变量 刷子句柄, 整数型 .局部变量 画笔句柄, 整数型 .局部变量 r, 整数型 .局部变量 g, 整数型 .局部变量 b, 整数型 .局部变量 x, 整数型 .局部变量 y, 整数型 .局部变量 color2, 整数型 ' 临时代码 () dc = GetDC (图片框1.取窗口句柄 ()) 画笔句柄 = CreatePen (0, 1, #黑色) 刷子句柄 = CreateSolidBrush (#绿色) x = 0 y = 140 ' 默认从200开始,加快取色速度 .判断循环首 (真) x = x + 1 .判断开始 (x > 图片框1.宽度) ' 像素x不超过组件的宽度 x = 1 y = y + 1 .判断 (y > 图片框1.高度) ' 像素Y不超过组件的高度 _按钮1_被单击 () 信息框 (“未找到”, 0, , ) 跳出循环 () .默认 .判断结束 color = GetPixel (dc, x, y) ' 获取坐标颜色值 .判断开始 (color2 = 0) ' 若是color2=0 ,也就是第一次取色,把取到的颜色给他保存 color2 = color .判断 (color - color2 > 78000) ' 背景颜色是个渐变色,差值不超过10万 超过则说明,到达要跳的物体顶部 跳出循环 () .判断 (color = 16185078) ' 白色石头 跳出循环 () .判断 (color = 7435156) ' 褐色石头 跳出循环 () .判断 (color = 7434609) ' 黑灰石头 跳出循环 () .判断 (color = 7040912) 跳出循环 () .判断 (color = 15856113) 跳出循环 () .判断 (color = 6655572) 跳出循环 () .判断 (color = 9291745) 跳出循环 () .默认 .判断结束 .判断循环尾 () SelectObject (dc, 画笔句柄) ' 把画笔载入 y = y + 20 Ellipse (dc, x - 5, y - 5, x + 5, y + 5) ' 用画笔画空心圆 SelectObject (dc, 刷子句柄) ' 更换成刷子 Ellipse (dc, x - 5, y - 5, x + 5, y + 5) ' 用刷子画实心圆 DeleteObject (刷子句柄) DeleteObject (画笔句柄) 马桶.x = x 马桶.y = y 输出调试文本 (“马桶颜色:” + 到文本 (color)) 屁股定理 ()
能够看到“板凳”的Y轴从140开始的,由于一般“板登”都在棋子上方
找的“板凳”是“板凳”的最上面的一个点的坐标,而且画个实心圆,方便调试
找到的坐标也记录下来
棋子、板凳坐标识别界面图以下
能够看到棋子的底部有个红色的实心圆显示找到的坐标
板凳上也有个绿色的实心圆显示坐标(板凳的绿色圆在板凳中间偏上是由于我识别的时候是识别到顶部的,而后我在代码中把板凳的Y轴+30个像素,由于要取板凳中间的坐标的算法还没想出来,比较麻烦,因此就只取了一个顶部的坐标,而后下移30个像素,像小板凳啥的30个恰好)
其实找板凳的颜色只有上面两个判断,后来分数多了,背景色不断变化,就有添加了一个固定的颜色
上面棋子和板凳的坐标找到了,那么进入“勾股定理”(其实我小学没毕业,早忘了这东西了,百度重学的)
计算棋子到板凳直线距离代码以下:
.版本 2 .子程序 屁股定理 .局部变量 x, 整数型, , , 宽度 .局部变量 y, 整数型, , , 高度 .局部变量 平方, 双精度小数型 .局部变量 时间, 整数型 .判断开始 (棋子.x > 马桶.x) ' 若是马桶的x轴小于棋子的x轴,,也就是马桶在左边,咱们要往左边跳 x = 棋子.x - 马桶.x .默认 x = 马桶.x - 棋子.x ' 往右跳 .判断结束 y = 棋子.y - 马桶.y ' 取得高度 ' 直角三角型的屁股定理 平方 = x × x + y × y 平方 = 求平方根 (平方) ' 取得棋子到马桶的直线距离 平方 = 平方 × 到数值 (编辑框1.内容) ' 计算要跳的时间(毫秒) 时间 = 到整数 (平方) 我要跳高 (时间)
上面求到直线距离为何要*编辑框的微调呢?
1.大多手机屏幕分辨率不同,获得的截图尺寸有大小
2.截图的图片加载到图片框是通过缩放的,并且是按比例缩放
3.通常我测试出的按压时间在200-900毫秒之间
也就是获得的直线距离是30的话,要按到300毫秒,那么微调为10
以个人手机和我设置的图片框尺寸,微调在4.8-5.0之间
最后把获得的按压时间传给下一子程序去执行手机按压
.版本 2 .支持库 spec .子程序 我要跳高 .参数 时间, 整数型 .局部变量 a, 文本型 .若是真 (集开始 = 假) 返回 () .若是真结束 运行 (“adb shell input swipe 251 255 380 395 ” + 到文本 (时间), 真, 1) 延迟 (2000) 那么咱们就开始跳吧 ()
运行的那段代码是让手机模拟滑动,从什么地方按住滑动到什么地方,最后一个就是滑动的时间(毫秒)
以上自动跳一跳就完了,测试不理想,就加了个手动档,这个简单
.版本 2 .子程序 _按钮手动档_被单击 集开始 = 真 集手动 = 真 那么咱们就开始跳吧 ()
按下手动档,取一次手机屏幕到图片框
.版本 2 .子程序 _图片框1_鼠标左键被按下, 逻辑型 .参数 横向位置, 整数型 .参数 纵向位置, 整数型 .参数 功能键状态, 整数型 ' dc = GetDC (0) ' 输出调试文本 (GetPixel (dc, 取鼠标水平位置 (), 取鼠标垂直位置 ())) 棋子.x = 取鼠标水平位置 () 棋子.y = 取鼠标垂直位置 () .子程序 _图片框1_鼠标左键被放开, 逻辑型 .参数 横向位置, 整数型 .参数 纵向位置, 整数型 .参数 功能键状态, 整数型 马桶.x = 取鼠标水平位置 () 马桶.y = 取鼠标垂直位置 () 屁股定理 ()
鼠标在图片框的棋子下按下不放
到板凳的中心位置放开鼠标,就获得了棋子和板凳的坐标
再调用上面写完的“屁股定理()”
以后就是按鼠标,放鼠标了,不须要再按手动档按钮
附上源码,无模块,无病毒!移步:http://down.51cto.com/data/2387983