从零开始的明日方舟python脚本创作(八)核心模块

简介

核心模块我主要是当作一个连接UI模块和功能模块的一个中间层。并且可以记录一些操作数据。

引入的包

import ScreenShot#之前提到的截屏模块,自己写的python文件
import random#python自带的
import math#python自带的
import Mouse#之前提到的鼠标点击模块,自己写的python文件
import memory_pic#之前提到的经过图片base64模块转换生成的python文件
import base64#python自带的
import os#python自带的

全局变量

#各个游戏阶段鼠标的点击范围 代理指挥 开始行动 行动结束 理智恢复接受  理智恢复拒绝
mouseRangeInfo = [(852, 450, 890, 476), (832, 510, 990, 547),(830, 296, 934, 513), (26, 505, 320, 578), (602, 447, 645, 480)]

#是否接受理智恢复
isAcceptRefresh = False

#图片经b64转换后的字符串信息
pics =[memory_pic.ActingCommander,memory_pic.StartGame,memory_pic.RoundEnd,memory_pic.AcceptRefresh, memory_pic.RefuseRefresh]

#各个图片的名字
picsName = ["ActingCommander", "StartGame","RoundEnd", "AcceptRefresh", "RefuseRefresh"]

#各个行动代号的枚举
mousePosCode = {
    "AcceptRefresh": 0,
    "ActingCommander": 1,
    "Start": 2,
    "RoundEnd": 3,
    "RefuseRefresh": 4
}

#根据行为代号的枚举决定执行的相关方法
mouseEvent = {
    0: clickAcceptRefresh,
    1: clickActingCommander,
    2: clickStart,
    3: clickRoundEnd,
    4: clickRefuseRefresh,
}
#上一次执行的行动代号
lastEventCode = -1

#反复执行同一个行动的次数
sameCodeCount = 0

图片信息解码

def creatImage():
    filePath = "images"
    index = 0
    if not os.path.exists(filePath):
        # 目录不存在,进行创建操作
        os.makedirs(filePath)  # 使用os.makedirs()方法创建多层目录
        print("目录新建成功:" + filePath)
    else:
        print("目录已存在!!!")
    for img in pics:
        imgName = picsName[index]
        image = open(filePath+"/%s.png" % imgName, 'wb')
        #解码 base64 编码的字节类对象或 ASCII 字符串 s,返回byte类型
        image.write(base64.b64decode(img))
        image.close()
        index += 1

使用os获取当前运行时文件所在的路径并创建“images”文件夹。对字符串类型的图片信息进行转码,并写入到新创建的图片文件中。

部分初始化方法

#根据UI模块的按钮信息设置是否接受理智恢复
def setAcceptRefresh(flag):
    global isAcceptRefresh
    isAcceptRefresh = flag
#ratio存储了两个值(widthRatio,heightRatio )
#根据当前运行时窗口分辨率与设计时分辨率的比值,动态调整按钮的可点击范围
def changeMouseRange(ratio):
    widthRatio, heightRatio = ratio
    index = 0
    for item in mouseRangeInfo:
        left, top, right, bot = item
        left = math.floor(left*widthRatio)
        right = math.floor(right*widthRatio)
        top = math.floor((top)*heightRatio)
        bot = math.floor((bot)*heightRatio)
        mouseRangeInfo[index] = (left, top, right, bot)
        index += 1
    print(mouseRangeInfo)
#在UI模块进行初始化时,调用
def _init_(flag):
    creatImage()
    setAcceptRefresh(flag)
    #tempCode是返回的窗口句柄
    tempCode = ScreenShot.startInit()
    windowRatio = ScreenShot.getWindowRatio()
    changeMouseRange(windowRatio)
    return tempCode

核心处理方法

#当前是否需要操作
def operate():
    #截屏模块截取当前屏幕
    img = ScreenShot.ScreenShot()
    #截屏模块调用图片对比模块逐一对比,并返回
    eventCode = ScreenShot.compareImage(img)
    #-1代表无任何操作,直接return -1给UI模块
    if(eventCode == -1):
        return -1
    #不为-1先判定是否是恢复理智界面,若是,然后根据是否接受理智返回行动代号
    eventCode = recieveOrRefuse(eventCode)
    #计算当前重复行动执行了多少次,防卡死
    countSameEvent(eventCode)
    #根据行动代号执行对应方法
    mouseEvent.get(eventCode)()
    return eventCode

#判断理智是否需要恢复
def recieveOrRefuse(eventCode):
    if(eventCode != mousePosCode.get("AcceptRefresh")):
        return eventCode
    if(isAcceptRefresh):
        return mousePosCode.get("AcceptRefresh")
    else:
        return mousePosCode.get("RefuseRefresh")


#一局代理开始界面
def clickActingCommander():
    x, y = getMousePos(mousePosCode.get("ActingCommander"))
    Mouse.doClick(ScreenShot.hWnd, x, y)
    print("代理开始点击坐标:x %d y %d" % (x, y))
    pass

#一局选人开始界面
def clickStart():
    x, y = getMousePos(mousePosCode.get("Start"))
    Mouse.doClick(ScreenShot.hWnd, x, y)
    print("游戏开始点击坐标:x %d y %d" % (x, y))
    pass

#一局结束
def clickRoundEnd():
    x, y = getMousePos(mousePosCode.get("RoundEnd"))
    Mouse.doClick(ScreenShot.hWnd, x, y)
    print("游戏结束点击坐标:x %d y %d" % (x, y))
    pass

#接受恢复理智
def clickAcceptRefresh():
    x, y = getMousePos(mousePosCode.get("AcceptRefresh"))
    Mouse.doClick(ScreenShot.hWnd, x, y)
    print("接受理智点击坐标:x %d y %d" % (x, y))
    pass

#拒绝恢复理智
def clickRefuseRefresh():
    x, y = getMousePos(mousePosCode.get("RefuseRefresh"))
    Mouse.doClick(ScreenShot.hWnd, x, y)
    print("拒绝恢复理智点击坐标:x %d y %d" % (x, y))
    pass

#获取鼠标点击位置
def getMousePos(posIndex):
    posInfo = mouseRangeInfo[posIndex]
    left, top, right, bot = posInfo
    width = right-left
    height = bot-top
    posX = math.floor(random.random()*width+left)
    posY = math.floor(random.random()*height+top)
    return (posX, posY)

#计算当前阶段进行了几次
def countSameEvent(eventCode):
    global sameCodeCount
    global lastEventCode
    print("lastEventCode%d" % (lastEventCode))
    print("eventCode%d" % (eventCode))
    if(lastEventCode == eventCode):
        sameCodeCount += 1
    else:
        sameCodeCount = 0
    lastEventCode = eventCode

#返回当前相同事件计数
def getSameEventCount():
    return sameCodeCount

#清除相关记录信息
def clear():
    global sameCodeCount
    global lastEventCode
    sameCodeCount = 0
    lastEventCode = -1

#获取执行的最后一个事件
def getLastEventCode():
    return lastEventCode

总结

核心模块基本都是看需要的功能写的,每个人要写的东西可能都不一样。也没什么新鲜的东西和注意事项,很简单。以上,祝好!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值