核心模块我主要是当作一个连接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
核心模块基本都是看需要的功能写的,每个人要写的东西可能都不一样。也没什么新鲜的东西和注意事项,很简单。以上,祝好!