【魔灵召唤】自动初始脚本教学

魔灵召唤的自动初始(类似手游做主线任务)与卡牌类初始号玩法基本一致,此脚本的编写思路可应用于卡牌类初始号脚本编写,或者其他需要自动做主线任务的游戏。

写主线任务的思路不同于写其他功能模块,其他的功能模块一般会有比较复杂的逻辑,但是需要查找的图色不会很多;主线任务则是需要查找的图色内容很多,但是逻辑简单,通常只是跟随游戏引导点击或者发现目标点就击一下。

一、图色函数选择

大量的图色内容需要查找,就涉及到2个问题,一个是查找效率,一个是查找的精确度

查找效率从高到底依次是:多点比色>区域找色>多点找色>区域找字>区域找图

精确度从高到底依次是:区域找字>区域找图>多点找色>多点比色>区域找色

在实际应用中,多点比色和区域找色是用的比较少的,因为非常容易误判,除非能保证100%精确,否则不建议使用。找字和找图因为效率比较低,则是能不用就不用。所以通常情况下我们以多点找色为主,找字找图为辅来定义变量。

二、图色查找结构选择

循环查找图色一般有以下几种方式

  • 1.所有图色写入到一个循环里面
  • 2.将图色进行分组,然后分组定时循环
  • 3.只循环一次的图色,循环后从循环中移除
  • 4.图色分场景循环
  • 5.多线程分组循环

分别介绍一下这4种循环方法的优缺点

1.所有图色写入到一个循环里面:优点就是无脑省事,而且不会漏掉需要循环的图色,缺点就是假如查找一次需要100ms,如果有100个图色内容需要查找,那循环一轮的时间就是10秒钟,换句话说,每10秒钟脚本才动一下,就会有很长的时间浪费在等待

Dim 遍历={a,b,c,d,e,f,g,h,i,j,k}
While true
    For Each i In 遍历
        查找(i)
    Next
Wend

2.将图色进行分组,然后分组定时循环:这个是基于方法1的基础上的一种改进写法。优点是不会漏掉需要循环的图色,缺点是图色权重不好把控,并且依旧存在等待现象

Dim 遍历1={a,b,c,d}
Dim 遍历2={e,f,g,h}
Dim 遍历3={i,j,k}
Dim t1=time()
dim t2=time()
While true
    For Each i In 遍历1
        查找(i)
    Next
    If Time() - t1 >= 10 Then 
        For Each i In 遍历2
            查找(i)
        Next
        t1=time()
    End If
    If Time() - t1 >= 30 Then 
        For Each i In 遍历3
            查找(i)
        Next
        t2=time()
    End If
Wend

3.只循环一次的图色,循环后从循环中移除:这个也是基于方法1的基础上的一种改进写法,优点是不会漏掉需要循环的图色,并且循环效率会越来越高,缺点就是最开始的时候效率比较低,等待时间长。

Dim 遍历={a,b,c,d,e,f,g,h,i,j,k}
While true
    For Each i In 遍历
        If 查找(i) Then 
        	delArrayMem(i)
        End If
    Next
Wend

4.图色分场景循环:优点是效率高,缺点是需要对游戏有一定的理解,并且非常容易漏掉图色

While true
    If 条件1 Then 
        循环1 
    End If
    If 条件2 Then 
        循环2()
    End If
    If 条件3 Then 
        循环3()
    End If
Wend

Sub 循环1()
    Dim 遍历={a,b,c,d}	
    For Each i In 遍历
        查找(i)
    Next
End Sub

Sub 循环2()
    Dim 遍历={e,f,g,h}
    For Each i In 遍历
        查找(i)
    Next
End Sub

Sub 循环3()
    Dim 遍历={i,j,k}
    For Each i In 遍历
        查找(i)
    Next
End Sub

5.多线程分组循环:优点循环效率高,缺点需要进行线程控制,从而防止误触,另外就是资源占用多,多开脚本不建议写成多线程的模式

Dim 遍历1={a,b,c,d}
Thread.Start(多线程循环)
While true
    For Each i In 遍历1
        查找(i)
    Next
Wend
Sub 多线程循环()
    Dim 遍历2={e,f,g,h}
    While true
        For Each i In 遍历2
            查找(i)
        Next
    Wend
End Sub

三、脚本的通用框架

  • 收费系统,有本地校验收费和云端校验收费2种模式
  • 版本验证,提供脚本和游戏的自动更新,需要对接数据库
  • 引用插件,常用封装功能制作为插件,或是引用别人插件
  • 日志记录,开启运行日志记录,便于定位BUG
  • 全局变量(共享变量)定义
  • 脚本任务执行进度存档
  • 主程序,即游戏脚本主要的图色检测逻辑
  • 监测程序,防止游戏掉线,卡死等
  • 消息推送,关键信息实时推送
  • 其他程序,部分游戏需要清除游戏缓存,过ROOT等
  • 游戏功能模块封装

1.收费系统,思路是预先在服务器上生成卡密,脚本使用之前,验证该卡密是否在服务器中存在,是否过期,是否与绑定的设备型号一致,参考思路如下所示

Dim codeNum="ehbtf2wFxR9JSXRbnHRt"//用户输入的卡密
dim data={null}
data["url"]="http://服务器IP:9200/user/_search"
data["data"]="{""query"":{""bool"":{""must"":[{""match"":{""codeNum"":"&chr(34)&codeNum&chr(34)&"}}]}}}"
data["header"]={"Content-Type":"application/json"}
dim json=url.HttpPost(data)//发送post请求至服务器
TracePrint json
Dim table=Encode.JsonToTable(json)//json数据转table,读取table中的数据一一比对
//TracePrint UBound(table["hits"]["hits"])
If UBOUND(table["hits"]["hits"]) >= 0 Then 
    TracePrint "卡密验证成功"
    //验证卡密是否激活
    If table["hits"]["hits"][1]["_source"]["codeState"] = "0" Then 
        TracePrint "卡密未激活,立刻激活"
        //把codeState 置为1,以当前time()为激活时间,以time()+codeTime为到期时间
        Dim actTime=time()
        Dim endTime=int(actTime)+int(table["hits"]["hits"][1]["_source"]["codeTime"])
        Dim identification=GetDeviceID()
        data={null}
        data["url"]="http://129.28.179.111:9200/user/login/"&table["hits"]["hits"][1]["_id"]&"/_update"
        data["data"]="{""doc"":{""codeState"":""1"",""actTime"":"&chr(34)&actTime&chr(34)&",""endTime"":"&chr(34)&endTime&chr(34)&",""identification"":"&chr(34)&identification&chr(34)&",""online"":""1""}}"
        data["header"]={"Content-Type":"application/json"}
        json = url.HttpPost(data)
        TracePrint json
        TracePrint "验证结束"
    Else 
        TracePrint "卡密已激活"
        //验证卡密是否到期
        If Int(table["hits"]["hits"][1]["_source"]["endTime"]) > Int(Time()) Then 
            TracePrint "卡密未到期"
            //验证卡密是否在线
            If table["hits"]["hits"][1]["_source"]["online"] = "1" Then 
                TracePrint "卡密已在线,禁止重复登录"
            Else 
                TracePrint "卡密不在线,允许登录"
                //验证卡密和MAC是否一致
                If table["hits"]["hits"][1]["_source"]["identification"] = GetDeviceID() Then 
                    TracePrint "设备唯一标识验证通过"
                    data={null}
                    data["url"]="http://129.28.179.111:9200/user/login/"&table["hits"]["hits"][1]["_id"]&"/_update"
                    data["data"]="{""doc"":{""online"":""1""}}"
                    data["header"]={"Content-Type":"application/json"}
                    json = url.HttpPost(data)
                    TracePrint json
                Else 
                    TracePrint "设备唯一标识验证失败"
                    EndScript
                End If
            End If
        Else 
            TracePrint "卡密已到期"
            EndScript
        End If
    End If
Else 
    TracePrint "卡密不存在,请输入正确卡密"
    EndScript//卡密验证失败就直接停止脚本运行
End If

2.版本验证,思路同上,获取服务器中的版本号与脚本版本号进行对比,不一致则更新,参考代码如下

Function 检测更新()
    If 本地版本 = 云端版本号 Then //对比云端版本号是否一致
        ShowMessage "已是最新版本,无需更新"
        TracePrint "已是最新版本,无需更新"
        delay 1000
    Else 
        UI.NewLayout ("更新公告")//更新公告
        UI.AddTextView "更新公告", "更新提示","检测到新版本,要更新请点击确认更新按钮,不更新请点击继续按钮"
        UI.SetTextColor("更新提示","1317B4") '设置文字颜色
        UI.NewRow "更新公告","newrow"
        For i = 0 To UBOUND(更新公告)
            UI.AddTextView "更新公告", "更新内容", 更新公告(i)
            UI.NewRow "更新公告","newrow"
        Next
        UI.AddButton("更新公告","更新","确认更新",150,60)
        UI.SetOnClick "更新", 在线更新 //按钮点击事件
        UI.Show("更新公告")
    End If
End Function

Function 在线更新()
    UI.SetEnabled "更新", false //按钮点击后禁止再次点击,防止反复调用此函数
    If Dir.Exist(安装包路径) <> 0 Then //判断该路径下是否存在此安装包 
        ShowMessage "检测到旧安装包,删除后下载"
        delay 1000
        Dir.Delete(安装包路径)//删除旧的安装包
    End If
    thread.Start(下载文件)//调用多线程进行下载,以便实时检测文件大小
    Dim t=time()//时间标记
    While true 
        If File.Bytes(安装包路径) = 云端版本包大小 Then //文件大小与云端一致后,确认下载完成
            ShowMessage "正在安装,安装完成后自动结束程序"
            Delay 1000
            Exit While
        Else 
            ShowMessage "已下载" & CInt(File.Bytes(安装包路径) / 云端版本包大小) & "%,请稍后"
            Delay 1000
        End If
        Delay 1000
        If Time() - t >= 60 Then //超时后退出程序
            ShowMessage "下载超时,请检查网络!"
            Exit Function
        End If
    Wend
    Shanhai.Install(安装包路径)//安装更新包
    ShowMessage "安装完毕,请重新打开脚本"
    Delay  1000
End Function

Function 下载文件()
    ShanHai.GetHttpFile(Thread.GetShareVar("下载地址") ,Thread.GetShareVar("安装包路径") )//下载安装包
End Function

3.引用插件,比如问题2中,涉及到后台安装APP和下载文件,需要使用到山海插件,平时常用的找图找色的功能建议封装为插件,久而久之,形成自己的插件体系。

Import "cs.mql" //引用橙苏插件
Import "shanhai.lua" //引用山海插件

4.日志记录,开启日志记录,脚本每次启动和停止,都会生成一个记录文件,这个记录文件会将程序运行时的traceprint的调试信息记录下来,当脚本异常方便查阅故障原因,需要注意的是,定期清理日志文件,否则比较占磁盘空间

log.open//开启日志记录
log.close//关闭日志记录

5.全局变量(共享变量),定义变量时要偷懒省事的话,可以将变量都定义为全局变量,并且标注好每个变量所属的功能或者区域,方便以后维护脚本。坏处是,定义的全局变量时,即便是暂时没用到的变量,也会占用内存空间。最好还是区分一下全局变量和局部变量,因为局部变量执行完毕后就会被释放掉,相对来说节约内存。

//登录功能所需变量
dim 游客登录={1,"游客登录",1,1,0,0,5,226,498,273,562,"1E04E7-050505","16|-15|2103E8-050505,13|22|D2D3D2-050505,-1|27|C5C3C4-050505,-2|38|1928A3-050505,6|39|2C36B9-050505",0,0.9}
Dim 点击画面={2,"点击登录画面",1,1,0,0,5,93,625,126,654,"击","FEFEFE-101010",0.8}
Dim 登录成功={1,"登录成功",0,1,0,0,5,20,1067,90,1118,"D1EDF1-050505","19|9|B4EBFE-050505,42|-8|4BA3E1-050505,38|14|483038-050505",0,0.9}

//初始游戏所需变量
Dim 选项={1,"游戏设置-选项",1,1,0,0,5,573,520,607,578,"053754-050505","-22|14|063855-050505,0|43|073956-050505,-14|40|013350-050505",0,0.9}
Dim 游戏初始化={1,"游戏设置-游戏初始化",1,1,0,0,5,161,844,192,871,"ADE9F8-050505","-14|1|ADE9F8-050505,0|16|ACE8F7-050505,-11|20|87BECF-050505",0,0.9}
Dim 初始化={1,"游戏设置-初始化",1,1,0,0,5,171,548,209,579,"ADE9F8-050505","-16|1|ADE9F8-050505,5|11|ADE9F8-050505,-18|18|ADE9F8-050505",0,0.9}

//主页任务所需变量
Dim 对话1={1,"对话1",1,1,160,525,3,0,466,10,515,"98C3D2-040404","0|35|97D3DD-040404",0,0.9}
Dim 属性说明={1,"属性相生说明",1,1,128,639,5,341,695,367,828,"CCD1DB-101010","-3|104|7A0368-050505,-4|72|E359F5-050505,-5|31|CFF2F8-050505,-1|-13|DDF3FA-050505,-6|110|F6B5EB-050505",0,0.9}
dim 挑战任务={1,"召唤师之路",1,1,693,1223,5,586,911,655,1054,"7E2CAD-050505","0|20|5B28E8-050505,8|63|36B6FE-050505,13|78|1F95FE-050505,-17|96|FEFEFE-050505,-16|-4|FEFEFE-050505",0,0.9}

6.脚本任务执行进度存档,因为游戏崩溃,脚本闪退等是无法避免的,为了避免重启游戏或者脚本后,又从头开始执行任务,脚本每执行完一个节点任务,就将这个记录写入文本,脚本崩溃后重启时,读取文本中的节点记录,便可继续以前的任务。当脚本整体执行完毕后,重置节点记录。

Dim 路径=GetSdcardDir()&"/data.txt"
If Dir.Exist(路径) = 0 Then //路径下不存在该文件,则释放文件
    PutAttachment GetSdcardDir(), "data.txt"
    节点 = 1//假如节点任务初始为1
    File.Write(路径,节点)
Else 
    TracePrint "文件已存在"
    节点=int(File.Read(路径))//读取之前的节点记录
End If

While true
    Select Case 节点
    Case 1
		任务1模块
    Case 2
		任务2模块
    Case 3
		任务3模块
    End Select
    If 任务1 Then 
        节点 = 1
        File.Write(路径,节点)
    End If
    If 任务2 Then 
        节点 = 2
        File.Write(路径,节点)
    End If
    If 任务3 Then 
        节点 = 3
        File.Write(路径,节点)
    End If
Wend

7.主程序,根据内容一、二来确认我们查找思路,例如我们以多点找色为主,找字找图为辅;分组循环的方式来查找图色

//登录功能所需变量
dim 游客登录={1,"游客登录",1,1,0,0,5,226,498,273,562,"1E04E7-050505","16|-15|2103E8-050505,13|22|D2D3D2-050505,-1|27|C5C3C4-050505,-2|38|1928A3-050505,6|39|2C36B9-050505",0,0.9}
Dim 点击画面={2,"点击登录画面",1,1,0,0,5,93,625,126,654,"击","FEFEFE-101010",0.8}
Dim 登录成功={1,"登录成功",0,1,0,0,5,20,1067,90,1118,"D1EDF1-050505","19|9|B4EBFE-050505,42|-8|4BA3E1-050505,38|14|483038-050505",0,0.9}

//初始游戏所需变量
Dim 选项={1,"游戏设置-选项",1,1,0,0,5,573,520,607,578,"053754-050505","-22|14|063855-050505,0|43|073956-050505,-14|40|013350-050505",0,0.9}
Dim 游戏初始化={1,"游戏设置-游戏初始化",1,1,0,0,5,161,844,192,871,"ADE9F8-050505","-14|1|ADE9F8-050505,0|16|ACE8F7-050505,-11|20|87BECF-050505",0,0.9}
Dim 初始化={1,"游戏设置-初始化",1,1,0,0,5,171,548,209,579,"ADE9F8-050505","-16|1|ADE9F8-050505,5|11|ADE9F8-050505,-18|18|ADE9F8-050505",0,0.9}

//主页任务所需变量
Dim 对话={1,"对话",1,1,160,525,3,0,466,10,515,"98C3D2-040404","0|35|97D3DD-040404",0,0.9}
Dim 属性说明={1,"属性相生说明",1,1,128,639,5,341,695,367,828,"CCD1DB-101010","-3|104|7A0368-050505,-4|72|E359F5-050505,-5|31|CFF2F8-050505,-1|-13|DDF3FA-050505,-6|110|F6B5EB-050505",0,0.9}
dim 挑战任务={1,"召唤师之路",1,1,693,1223,5,586,911,655,1054,"7E2CAD-050505","0|20|5B28E8-050505,8|63|36B6FE-050505,13|78|1F95FE-050505,-17|96|FEFEFE-050505,-16|-4|FEFEFE-050505",0,0.9}


Dim 遍历1={游客登录,点击画面,登录成功}
Dim 遍历2={选项,游戏初始化,初始化}
Dim 遍历3={对话,属性说明,挑战任务}
Dim t1=time()
dim t2=time()
While true
    For Each i In 遍历1
        图色查找(i)
    Next
    If Time() - t1 >= 10 Then 
        For Each i In 遍历2
            图色查找(i)
        Next
        t1=time()
    End If
    If Time() - t2 >= 30 Then 
        For Each i In 遍历3
            图色查找(i)
        Next
        t2=time()
    End If
Wend

8.监测程序,监测程序可以理解为定时检测一遍游戏状态,用法与分组循环一致

Sub 主程序()
    dim t=time()
    Dim t2=time()
    While true
        功能A 
        功能B 
        If Time() - t2 >= 30 Then 
            For Each i In 遍历3
                图色查找(i)
            Next
            t2=time()
        End If 
        If Time() - t >= 预设时间 Then 
            监测程序 
            t=time()
        End If
    Wend
End Sub

Sub 监测程序()
    If CmpColorEx("160|320|" & 颜色1 & ",320|640|" & 颜色2&",480|960|" & 颜色3, 1.0) = 1 Then 
        TracePrint "颜色:"&颜色1,颜色2,颜色3
        TracePrint "游戏疑似卡死,重启游戏"
        ShowMessage "游戏疑似卡死,重启游戏"
        启动游戏()
    else	
        TracePrint "游戏正常运行中"
        t3=time()
        dim 颜色1=GetPixelColor(160,320)
        dim 颜色2=GetPixelColor(320,640)
        dim 颜色3=GetPixelColor(480,960)
        TracePrint "颜色"&颜色1,颜色2,颜色3
    End If
    Sys.ClearMemory()//释放内存
    If Sys.AppIsFront("com.游戏包名") = false or Sys.IsRunning("com.游戏包名")=false Then 
        TracePrint "检测到游戏掉线,重启游戏"
        ShowMessage "检测到游戏掉线,重启游戏"
        启动游戏()
    End If
End Sub

9.消息推送,目前采用得比较多的有QQ推送,微信公众号推送,邮件推送,短信推送。一般来说QQ和微信公众号推送需要进行对接,短信推送价格稍贵,邮件推送最方便,但是容易被归类为垃圾邮件,并且很多人并没有使用邮件的习惯。以下以邮件推送为参考

Function 发送邮件()
    Dim 服务器="smtp.163.com"
    Dim 发件人邮箱="xxxx@163.com"
    Dim 密码="xxxx"//这个密码不是邮箱密码,是SMTP密码
    Dim 主题 = "脚本运行提示"
    Dim 内容=cint(ReadUIConfig("下拉框_机器编号")+1)&"号机"&cint(ReadUIConfig("下拉框_窗口编号")+1)
    Dim 收件地址 = trim(ReadUIConfig("输入框_收件人邮箱"))&";"
    Dim 返回发送结果 = SendSimpleEmail(服务器,发件人邮箱,密码,主题,内容,收件地址) 
    TracePrint 返回发送结果
End Function

10.其他功能模块,具体情况具体分析,暂无统一方法。部分游戏需要清除游戏缓存,过ROOT等,思路是找到游戏安装路径,删除储存账号数据的文件;过ROOT修改su文件

11.游戏功能模块封装,为了减少代码量,多用sub和function进行封装,实现代码复用,面向对象编程。

四、游戏功能模块分析

魔灵召唤初始主要涉及到以下几个功能模块

1.图色遍历主程序,主要用于检测游戏的强制引导(即黄色箭头),NPC对话窗口,进入战斗的时机,无法自动战斗时找怪等等

Dim 遍历={a,b,c,d,e,f,g,h,i,j,k}
While true
    For Each i In 遍历
        查找(i)
    Next
Wend

2.登录游戏,登录游戏需要遍历的图色信息比较少,可以采用最简单的整体图色循环方式,如下所示。需要注意的是,游戏登录过程,最后一步显示点击登录,“点击登录”4个字,是闪烁状态,如果找的比较慢,可以考虑截图到内存去找,代码可以参考游戏主程序图色查找

3.战斗准备,对战界面应考虑是否使用好友助战,因为好友助战一共51次(50次好友+1次火龙骑),从剧情第三关开始使用助战,到通关火山,一共需要48次助战。其中第一、二关,无需助战,可自行完成通关。需要注意的是剧情一赠送的一个魔灵未领取,会导致剧情第二大关打不过。此模块不涉及大量的图色查询,主要是一个情况选择的处理,优先考虑select case 的结构

Function 战斗准备()
    If 战斗准备界面 Then 
        Select Case 关卡
        Case 1
            //剧情第一关按照游戏指引进行操作
        Case 2
            //第二关需保证有4个魔灵上场,上场魔灵数量不够需要领取邮件
        Case 3,4,5,6,7,8,9
            //从剧情第三关开始,需要使用好友助战。
    End If
End Function

4.领取邮件,领取邮件无需每次登陆都去领取,主要在于游戏会闪退,如果剧情第一关通关时闪退,会导致邮件未领取,从而无法通关第二关。代码结构比较简单,只需要查找到收取,点击即可。代码可以参考游戏主程序图色查找

5.添加导师,选择导师应优先选择群攻魔灵,如水夫人,水极地,水人造人,冰龙等,此处建议使用截图至内存+找图,找图使用多图查找,找到那个用哪个,没找到就刷新导师界面。这样子效率比较高,代码如下

        If cs.find(选择导师界面) Then 
            Delay 1000
            KeepCapture
            If cs.whileFind(3,"目标导师",1,1,0,0,0,63,307,513,857,"Attachment:sjd.png|Attachment:sfr.png|Attachment:bl.png|Attachment:rzr.png","202020",cs.random(0,4),0.8) = false Then 
                RandomTap 600,912,5//点击刷新
                Delay 2000
            End If
            ReleaseCapture
        End If

6.寻找剧情战斗地图,游戏有9个剧情地图关卡,第7.8.9地图关卡需要到滑动游戏界面,每次战斗需要找到对应的地图(已通关的关卡是1颗黄星、2颗灰星;没通关的是3颗灰星),找地图建议区域找字,找图由于精准度问题容易找错。战斗列表建议先下拉到最下面,在查找小关卡进行挑战,否则脚本崩溃或者游戏异常后,再次进行挑战,容易打到已通关的关卡,浪费体力的助战次数。本模块不涉及循环,只有简单的图色查询。

另外此模块需要将关卡数据存到文本中,否则中途脚本在其他界面中断后再次运行,无法判断是否需要助战。此时可以读取提前写入文本的数据,来判断是否需要助战。

    Dim xa={2,"加仑丛林",1,1,0,0,5,278,270,313,370,"星星星","315461-030303",0.8}
    Dim xb={2,"西泽山",1,1,0,0,5,367,463,430,584,"星星星","315461-030303",0.8}
    Dim xc={2,"卡菲勒遗址",1,1,0,0,5,328,691,364,797,"星星星","315461-030303",0.8}
    Dim xd={2,"拉古恩雪山",1,1,0,0,5,551,755,583,844,"星星星","315461-030303",0.8}
    Dim xe={2,"特恩拉丛林",1,1,0,0,5,433,997,463,1093,"星星星","315461-030303",0.8}
    Dim xf={2,"夏依德尼遗址",1,1,0,0,5,288,1092,321,1182,"星星星","315461-030303",0.8}
    Dim xg={2,"塔摩勒沙漠",1,1,0,0,5,26,568,59,663,"星星星","315461-030303",0.8}
    Dim xh={2,"保罗帕库遗址",1,1,0,0,5,72,850,102,935,"星星星","315461-030303",0.8}
    Dim xi={2,"帕伊摩恩火山",1,1,0,0,5,253,916,290,1032,"星星星","315461-030303",0.8}
    dim 火山已通关={2,"火山已通关",1,1,49,1214,5,260,930,289,957,"黄星","0BC7EC-101010",0.9}
    Dim a ={xa,xb,xc,xd,xe,xf}//前5个剧情地图
    Dim b ={xg,xh,xi}//后3个剧情地图
    For Each i , j In a //先判断前面5个地图是否满足条件,不满足条件向右滑动打后3个地图
        If cs.find(j) Then 
            关卡 = i//第三关剧情开始使用好友助战
            File.Write(路径,关卡)//将关卡写入文本
            Delay 1500
            cs.滑动(58,1039,534,1070,500)//地图对战列表,优先由上往下滑动,防止断线后,重启脚本,反复打已通过的剧情地图
            Delay 1500
            If cs.whileFind(1,"地图列表战斗",1,1,0,0,0,62,1150,527,1211,"A8E4F3-101010","5|41|ADE9F8-101010,14|4|ADE9F8-101010,13|41|ADE9F8-101010",3,0.9)=true Then 
                Delay 1000
                exit Function
            Else 
                cs.滑动 453,958, 62,966,500//地图对战列表,找不到图在由下往上滑动
                Delay 1500
                cs.whileFind(1,"地图列表战斗",1,1,0,0,0,62,1150,527,1211,"A8E4F3-101010","5|41|ADE9F8-101010,14|4|ADE9F8-101010,13|41|ADE9F8-101010",3,0.9)
                Delay 1000
                exit Function
            End If  
        End If
    Next

6.召唤光暗,通关火山后,领取光暗召唤书进行召唤,这个步骤不涉及复杂的逻辑和大量的循环,主要在于返回主页后,会有大量的弹窗。在召唤前后,需要关闭这些弹窗。另外就是需要判断召唤出来的魔灵是胎3、胎4还是胎5。只需要保留胎5。判断胎5建议通过查找区域像素点个数来实现。比如胎3只有3颗星,胎5有5颗星。5颗星的像素点个数是比3颗星的多一些。示例如下:

TracePrint cs.BackVal(星级)&"像素点"
    If cs.BackVal(星级) > 450 Then//450代表450个黄色像素点
        TracePrint "胎5"
        胎5 = 胎5 + 1
        Dim 光暗={0,535,882,582,1047,"B1CEDF-050505|581149-050505",0,0.9}
        Dim 魔灵属性=""
        If cs.BackVal(光暗) = 0 Then 
            //TracePrint "光属性"
            魔灵属性="光属性"&Image.OcrText(535,1012,575,1146,0,1)
        Elseif  cs.BackVal(光暗) = 1 then
            //TracePrint "暗属性"
            魔灵属性="暗属性"&Image.OcrText(535,1012,575,1146,0,1)
        End If
        发送邮件(魔灵属性)
        EndScript
    ElseIf cs.BackVal(星级) >= 350 and cs.BackVal(星级) <= 450 Then
        TracePrint "胎4"
        胎4 = 胎4 + 1
    ElseIf cs.BackVal(星级) < 350 Then 
        TracePrint "胎3"
        胎3=胎3+1    
    End If

7.初始账号数据,召唤光暗后,如果没出胎5,直接初始游戏数据。此步骤唯一的难点是识别验证码。识别验证码有2种方式,一种是对接打码平台进行识别,识别完成后填入。另一个是按键自带的本地光学识别,image.OcrTxt命令,此命令识别正楷字效果较好,精准度也可以。但是不能拿来识别异常文字,比如歪歪扭扭的汉字,数字,识别效果不行。示例如下

Dim str=Image.OcrText(341,585,379,697,0,1)//识别初始验证码
RandomTap 289,632,5//点击输入
Delay 2000
InputText str//输入验证码

五、未完待续

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

转载请注明出处橙苏博客 » 【魔灵召唤】自动初始脚本教学
分享到: 生成海报

本站接广告推广、脚本定制、付费咨询

联系微信:Saynothing2020
切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活