0%

记录一次美团打地鼠脚本编写过程 autojs多点找色学习过程

事情的起因是在美团里面看到了这样一个游戏 一起打地鼠 我去试玩了一下,果然,手残的我只有一百多分.这怎么能忍,开始尝试写脚本,同时就当做学习autojs里面的找色找图函数了

1,设计思路

首先通过试玩,我发现是有炸弹作为干扰的,同时,会出现增加时间的道具(个人觉得这个不能浪费要吃),

然后思路,一开始我是准备判断特定点颜色来进行点击的,但是地鼠移动太快,我不好找色,同时也担心单点找色误判率太高,于是我把方向放在了多点找色上面

于是我打开了了autojs的文档,从里面找到了这样一个函数

1
images.findMultiColors(img, firstColor, colors[, options])
参数 类型 描述
img {Image} 要找色的图片
firstColor {number 或 string} 第一个点的颜色
colors {Array} 表示剩下的点相对于第一个点的位置和颜色的数组,数组的每个元素为[x, y, color]
options {Object} 选项,包括:下面两个内容
  • region {Array} 找色区域。是一个两个或四个元素的数组。(region[0], region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0], region[1])到屏幕右下角。如果不指定region选项,则找色区域为整张图片。
  • threshold {number} 找色时颜色相似度的临界值,范围为0 - 255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0-1.0)的换算为 similarity = (255 - threshold) / 255.

函数aj给我们提供好了,剩下的就是开始写脚本了

2,编写过程

2.1 ,初期代码

​ 找到了多点找色的函数,我第一个思路是在手机里截全屏,然后通过多点找色,找地鼠的特征点

然后我就开始截图,裁剪出地鼠的肚皮,然后找到了几个点,开始写代码

最初写出来的代码是这个样子的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
threads.start(function() {
requestScreenCapture()
}); //截图权限
sleep(2000)

while (true) {
findds()
}

function findds() {
let screen = captureScreen(); //截图
let img_ds = images.findMultiColors(screen, "#ffdfc894", [
[1, -30, "#fff7eed1"],
[7, -28, "#fff5eed2"],
[8, -1, "#ffe5cd9d"],
[36, -4, "#ffdabf8a"]
], {
threshold: [10]

})
if (img_ds) {
log('找到地鼠')
click(img_ds.x, img_ds.y)
}
}

带上这串代码,我自信满满的前去挑战,没想到最后还不如我手动打出来的分数高,那我就不乐意了啊,于是开始琢磨怎么优化

2.2 初步优化代码

其实从第一段代码中就可以看到很多问题

  • 找图直接找的全屏,浪费很多资源在没必要的地方
  • 因为我是寻找地鼠的肚皮,所以相似度可以适当调整,加快速度
  • 点击方法可以通过press函数进一步加快速度

找到一些问题那接下来就是开始优化代码

优化方向如下:

  • 从全屏找图优化为区域找图(要做就做干脆点,直接找12个地洞的小区域)
  • 提高相似度
  • 使用press

后两点都很好解决,就是改个参数和函数的事情,所以这里着重讲第一点

通过单独一个红框的高和款我们可以得到两个参数 region: [x,y,宽,高 ]

而且这两个参数是固定的

接着开始计算12个红款左上角的x,y值

我们可以看出来每行所有x都是相同的,每列所有y都是相同的

因此,这里我建了两个数组,分别是

x=[x1,x2,x3,x4]

y=[y1,y2,y3]

通过两个数组,我们可以组合出所有区域的左上角坐标

分别是:

  • 第一个区域(x1,y1)
  • 第二个区域(x2,y1)
  • 第三个区域(x3,y1)
  • 第四个区域(x1,y2)
  • …………………..

后面我就不一一列举了

然后我们就开始构建一个函数,直接把坐标传进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function findds(x,y) {
let screen = captureScreen(); //截图
let img_ds = images.findMultiColors(screen, "#ffdfc894", [
[1, -30, "#fff7eed1"],
[7, -28, "#fff5eed2"],
[8, -1, "#ffe5cd9d"],
[36, -4, "#ffdabf8a"]
], {
threshold: [50],
region: [x,y,这里填写宽 , 这里填写高] //把坐标传进这里,分别是x,y,宽高可以定义一个常量存进去
})
if (img_ds) {
log('找到地鼠')
click(img_ds.x, img_ds.y)
}
}

把坐标传进函数里,然后就实现了区域内的多点找色

同时这里我把相似度直接改成了50

然后开始运行一下,果然,运行起来比刚才快了很多

2.3 寻找新道具代码

接下来就是找时钟道具了,我们如法炮制

直接区域多点找色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function findtime(x,y) {
let screen = captureScreen(); //截图
let img_time = images.findMultiColors(screen, "#ffdfc894", [
[1, -2, "#ffece9fa"],
[5, -5, "#ff794ed3"],
[6, -6, "#ff7e48de"],
[30, 15, "#ff483390"],
[32, 12, "#ff4b309b"],
[39, 19, "#ffedeffc"],
[40, 16, "#ffeceefa"]
], {
threshold: [30],
region: [x,y,这里填写宽 , 这里填写高] //把坐标传进这里,分别是x,y,宽高可以定义一个常量存进去
})
if (img_ds) {
log('找到时钟')
click(img_time.x, img_time.y)
}
}

可以看出和找地鼠差不多,

然后我们运行,但是会发现运行起来分数反而没有之前高了,其实我们很好判断,因为多了找色的步骤,所以变慢了

那么我们有没有优化的办法呢,这里我的思路是在找地鼠的函数里判断是否出现地鼠,,如果没有出现地鼠,在判断是否是时钟道具,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function findds(x,y) {
let screen = captureScreen(); //截图
let img_ds = images.findMultiColors(screen, "#ffdfc894", [
[1, -30, "#fff7eed1"],
[7, -28, "#fff5eed2"],
[8, -1, "#ffe5cd9d"],
[36, -4, "#ffdabf8a"]
], {
threshold: [50],
region: [x,y,这里填写宽 , 这里填写高] //把坐标传进这里,分别是x,y,宽高可以定义一个常量存进去
})
if (img_ds) {
log('找到地鼠')
click(img_ds.x, img_ds.y)
}else{
log("没有找到地鼠,判断是否有时钟");
findtime(img,x,y)
}

}

function findtime(img,x,y) {
let img_time = images.findMultiColors(screen, "#ffdfc894", [
[1, -2, "#ffece9fa"],
[5, -5, "#ff794ed3"],
[6, -6, "#ff7e48de"],
[30, 15, "#ff483390"],
[32, 12, "#ff4b309b"],
[39, 19, "#ffedeffc"],
[40, 16, "#ffeceefa"]
], {
threshold: [30],
region: [x,y,这里填写宽 , 这里填写高] //把坐标传进这里,分别是x,y,宽高可以定义一个常量存进去
})
if (img_ds) {
log('找到时钟')
click(img_time.x, img_time.y)
}
}

这里就把两个函数组合起来了,同时减少了一次截图的步骤更加缩短反应时间

最后在加个循环直接调用函数就可以运行了

2.4 后续优化

至此这个小脚本已经写得差不多了,后续就是一些小优化,比如减少反应时间,优化截图的调用之类的,这些就不在这里说了,毕竟大体框架已经搞定,后续添加以及优化并不难

这里我直接写了个ui界面

点击开始运行之后将会在左上角弹出悬浮窗

之后就可以运行了

3,总结

这个脚本其实并不复杂,主要是多点找色函数的使用,通过这次脚本编写,让自己学习到了多点找色的使用方法,以及编写过程是自己对多点找色脚本的优化有了一些理解

4,后续

尝试了一下自己的这个脚本

其实还有能优化的地方,但是目前对我来说已经够用了,就这样吧

本文标题:记录一次美团打地鼠脚本编写过程 autojs多点找色学习过程

文章作者:墨妄

发布时间:2020年11月06日 - 20:21:28

最后更新:2020年11月08日 - 12:57:13

原始链接:http://meetu.top/2020/11/06/20201106meituan-autojs/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。