游戏刚出来的时候就想到写个自动化,没想到第二天就出来了一大堆文章,真是感觉再不努力就要跟不上大家脚步了。

下面就来说说我的过程

使用工具:
python2.7
ADB
opencv

思路:
adb 截图-》opencv 识别图片坐标-》计算距离、长按时间-》adb 长按

长按时间:
小人---》目标方块的距离 与 长按屏幕的时间有一定的关系
在翻看社区的时候无意间看到个帖子上面讲到跟屏幕分辨率有关,大约是 *2.05 左右
这样就省去了琢磨比例关系的时间,就此谢过!

adb 截图:
adb shell screencap -p /sdcard/xxxx.png

当然 截图后要把图片处理一下:
去除颜色:
img=cv2.imread('xxx.png',cv2.IMREAD_GRAYSCALE)
去掉多余部分:
cv2.imwrite('home99.png',img[:740, :])

识别图片:
我用的是笨方法,手动截每个方块的特征点再用 opencv 去找坐标
截取的地方要一致(就是以正方体朝向我们的角为中心截图),所有方块都需要截同一个地方
不管圆的方的,位置大概都在那里,这样比较容易算出我们要跳到的目标坐标
当然,小人的特征图片也要截一张图

利用 opencv 找到坐标
识图代码:

def Find_img(background,target,threshold=0.95,method='cv2.TM_CCOEFF_NORMED'):
    '''
        background:背景图
        target:想要在背景图中找出的图片

        method:如果cv2.TM_CCOEFF_NORMED效果不好可以尝试:
                ['cv2.TM_CCOEFF','cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED',
                    'cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED'] 
    '''

    method = eval('%s'%method)
    background = cv2.imread('%s'%background,0)
    target = cv2.imread('%s'%target,0)
    result = cv2.matchTemplate(background,target,method)
    w, h = target.shape[::-1]

    #匹配度loc
    loc = cv2.minMaxLoc(result)[1]
    if loc > threshold and loc <=1:

        if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
            top_left = cv2.minMaxLoc(result)[2]
        else:
            top_left = cv2.minMaxLoc(result)[3]

        bottom_right = (int(top_left[0] + w) , int(top_left[1] + h) )

        #可以查看找到的结果
        #cv2.rectangle(backIMG,top_left, bottom_right,50,3)
        #cv2.imwrite(r'e:/res.png',backIMG)

        x1,y1 = top_left
        x2,y2 = bottom_right
        centre_x = (x1+x2)/2
        centre_y = (y1+y2)/2
        return (centre_x,centre_y)

计算距离,然后乘系数 2.05 等于 adb 长按时间
adb shell input swipe 1 1 1 1 长按时间

最后:
手动截图存在误差,有可能积累多就跳失败了,这方面可以与时俱进用机器学习来加强完善

成果图:


↙↙↙阅读原文可查看相关链接,并与作者交流