zoukankan      html  css  js  c++  java
  • 碧蓝航线-传颂之物脚本(部分)

    碧蓝航线新出的联动图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

  • 相关阅读:
    Vue 应用 nginx 配置 前后端不分离模式
    解决使用antd Modal组件时数据污染问题
    关于antd怎么在父组件中控制子组件的表单提交
    Web前端工程师面试题1-1
    Web前端工程师面试题7-4
    react 的 生命周期
    字符串的方法
    栈的基本算法
    node.js 获取文件目录
    bat脚本文件启动UG NX软件,动态调用外挂,以及设置环境变量
  • 原文地址:https://www.cnblogs.com/MaGnet/p/10108888.html
Copyright © 2011-2022 走看看