码迷,mamicode.com
首页 > 其他好文 > 详细

碧蓝航线-传颂之物脚本(部分)

时间:2018-12-12 16:26:17      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:图片   更新   pycharm   自动   res   screens   实现   shell   cti   

碧蓝航线新出的联动图SP4

由于这游戏过于的肝   想要解放自己的双手   所以想写一段电脑自己操作的脚本进行自己代挂

代码本身理解十分简单   整个过程只是比较繁琐   后面一段时间因为自己的原因有事情而未全部完成

希望下次如果有这种比较简单的机制的活动时  你也能解放自己双手

该代码需要adb(百度一下  很简单的连接)  网易mumu模拟器   屏幕为:1440 x 810(其他的也行   需要知道连接代码   比如我用的mumu:"adb connect 127.0.0.1:7555")  还需要一张结算图和一张boss图进行结算和攻击的匹配

上代码分析:

import os
import random
import time
import cv2
import numpy as np
import win32api   #这些包用pycharm安装分分钟的事

#连接mumu模拟器   首先先断开服务再执行连接
def Connection():
    cmd = adb kill-server
    tmp = os.popen(cmd).readlines()
    cmd = adb connect 127.0.0.1:7555
    tmp = os.popen(cmd).readlines()
    print(tmp)

#模拟点击   这个是代码的核心  也是繁琐的根源
def Click(x,y):
    cmd = adb shell input tap {x1} {y1}.format(x1 = x,y1 = y)
    print(cmd)
    os.system(cmd)

#模拟滑动    最后一关boss并未在我切换2队的页面  所以得滑动一段固定的距离让boss关出现在我切换2队后的页面
def Slide(x,y,x3,y3):
    cmd = adb shell input swipe {x1} {y1} {x2} {y2}.format(x1=x, y1=y,x2=x3,y2=y3)
    print(cmd)
    os.system(cmd)

#通过adb进行截图  让后面图片的匹配有基准
def Screenshot():
    os.system(adb shell screencap -p /sdcard/loading.png)
    os.system(adb pull /sdcard/loading.png)
    return "loading.png"

#boss关的位置匹配
def BossCde(BossMap):
    img = cv2.imread(BossMap,0)
    template = cv2.imread(boss.png,0)#分别加载boss和当前场景的图片

    res = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
    threshold = 0.80#匹配精确度
    gps = []

    loc = np.where(res >= threshold)
    for pt in zip(*loc[::-1]):
        gps.append(pt)#将匹配到的位置添加到gps列表中
    return gps

#打开mumu自动登录时到登录界面进行匹配  因为每次更新都会换登录界面  当然如果你手动登上去了这就不需要了
def Identification1(loading):
    img = cv2.imread(loading,0)
    img_gray = cv2.cvtColor(img,cv2.COLOR_BAYER_BG2GRAY)
    template = cv2.imread("lon.png",0)
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    threshold = 0.9
    print(res)
    if res[0] > threshold:
        Click(400,400)
    else:
        print("需要更新版本")

#关卡结算匹配
def Identification2(loading):
    img = cv2.imread(loading,0)
    img_gray = cv2.cvtColor(img,cv2.COLOR_BAYER_BG2GRAY)
    template = cv2.imread("Atk2.png",0)#与结算界面进行匹配
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    threshold = 0.7
    if res[0] > threshold:
        time.sleep(1)
        Click(1225,680)
        time.sleep(2)
        Click(1225, 680)
        time.sleep(4)
        Click(1225, 680)
        time.sleep(2)#因为结算完了这几次点击返回到地图界面这几次点击中每点一次就会出现一点延迟  如何不加sleep()回出现代码跑完但结算不出
        return 1

#自动启动mumu模拟器  这是我的电脑上mumu 的位置
def Lon():
    win32api.ShellExecute(0, open, F:\\emulator\\nemu\\EmulatorShell\\NemuPlayer.exe, ‘‘, ‘‘, 1)
    time.sleep(25)
    Connection()
    Click(216,117)

#登录总流程   
def LonIn():
    Lon()
    time.sleep(25)
    Identification1(Screenshot())
    Click(760,345)

#开始我们的自动(需要进入到四个选择sp界面执行)
def Activity():
    Click(733, 418)
    time.sleep(1)
    Click(1040,543)
    time.sleep(3)
    Click(1195,700)
    time.sleep(3)
    Click(860,665)
    time.sleep(5)
    Click(556,552)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Click(700, 440)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Click(830, 350)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Click(985, 420)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Click(1143, 551)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Click(1067, 756)
    time.sleep(1)
    Click(713, 183)#这一步是存在问题  因为这个点的关卡是随机刷的  很可能未刷出来 导致程序一直卡在结算界面  需要完善(进行更多的判断)
    time.sleep(3)
    Attack()
    time.sleep(3)
    Slide(1210, 166, 1210, 676)
    p = BossCde(Screenshot())
    print(p)
    Click(p[0][0] + 50, p[0][1] + 50)
    time.sleep(7)
    Attack()
    time.sleep(4)

#攻击结算匹配  到出击界面后执行即可完成关卡的结算
def Attack():
    n = 0
    Click(1200,720)
    for i in range(1,180):
        if n >= 65:
            TF = Identification2(Screenshot())
            if TF == 1:
                break
            time.sleep(10)#曾经用过一秒一秒的刷  但是发现内存是个问题  适自己的队打的普遍时间定
            n += 1
        else:
            n += 1
            time.sleep(1)


Connection()#首先连接上mumu
Activity()#从四张sp图中自动选择  并执行代挂流程

总结:

    代码瑕疵比较多,因为是半成品很多地方需要进行完善,比如中途出现紫皮船及new回出现少点击一下而卡在结算界面出不来、当打完接到了紧急委托(尤其是晚上)将无法进行识别也会导致代码功能错乱、当船坞满了的时候也会出现匹配选择问题、还有代码中提及的倒数第二关的判断等,这些就是主要的问题,我希望读者能以我这个案列为例下次给自己写一个好点的脚本代码,因为代码本身思想很简单所以简单关卡实现起来并不是很难。养养肝吧。233

碧蓝航线-传颂之物脚本(部分)

标签:图片   更新   pycharm   自动   res   screens   实现   shell   cti   

原文地址:https://www.cnblogs.com/MaGnet/p/10108888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!