前言:最近跳一跳太火,大家都在写,今天把原理来说说,说得不对欢迎指出!
注:请不要加我微信,免得尴尬!(^_^)
准备工作:
1.电脑
2.数据线
3.安卓手机(因为我这渣渣电脑带不动模拟器,只能写真机版)
第一步:电脑安装ADB(https://developer.android.google.cn/studio/releases/platform-tools.html)
下载解压就可以了
第二步:大家不需要配置啥环境变量,我搞半天没搞懂,直接在ADB目录创建易语言源码就不需要配置了!
第三步:手机用数据线连接电脑。手机打开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 = 1y = 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 = 1y = 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 + 20Ellipse (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
转载于:https://blog.51cto.com/13334510/2059782