python实现游戏活动自动挂机《Fate/grand Order》

实现自动挂机所涉及到的库包括:pyautogui、win32gui、time、opencv。

一、激活窗口

首先是激活模拟器窗口,为之后的屏幕内找图做铺垫,这里主要是使用了win32gui库实现功能。

首先用FindWindow先获取窗口的权柄,然后用win32gui.SetForegroundWindow激活窗口,返回窗口坐标是为了一开始确定整个模拟器的范围

def get_windows_info():  # 获取窗口信息
    mnq = u'雷电模拟器'
    handle = win32gui.FindWindow(0, mnq)
    win32gui.SetForegroundWindow(handle)  # 窗口前置激活
    if handle == 0:
        return None
    else:
        return win32gui.GetWindowRect(handle)  # 窗口坐标位置

二、实现屏幕内找图并点击

这里主要是用pyautogui、cv2库,首先是用cv2.imread读取需要找到的目标图,然后使用pyautogui.locateCenterOnScreen在当前屏幕中找到对应的图片,因为pyautogui.locateCenterOnScreen直接返回的是图片中心点坐标位置,其中confidence是相似度,接下来便可以使用pyautogui.click进行点击操作,中间加载一些time.sleep防止在加载过程中的加载时候的卡顿,导致后续的一些操作出现问题。

def find_pic(pic:str):    # 找到图片并点击
    tp = cv2.imread(pic)
    cz = pyautogui.locateCenterOnScreen(tp, confidence=0.9)
    while cz == None:
        cz = pyautogui.locateCenterOnScreen(tp, confidence=0.9)
    time.sleep(0.5) 
    pyautogui.click(cz[0], cz[1])
    time.sleep(0.5)

三、用魔术师阿尔托莉雅的技能进行举例

这里直接把一号位作为打手限制了人物技能选择的多样性,可以进行一个简单的改进,整体来说并不困难。其中在国服版本优化后,因为点击技能后空点会加快技能动画速度,所以在每次放完技能后我都加入了一个空点的操作,从而加快每一次的对局速度,进而整体提升刷无限池的效率。

def CD():#C呆技能给一号位置打手
    cd_1 = find_pic('D:\\fgoJB\\JB\\sc\\zd\\CD1.png')  # c呆1技能
    time.sleep(0.1)
    pyautogui.doubleClick(780 + sj, 630 + sj)  # 空点
    cd_2 = find_pic('D:\\fgoJB\\JB\\sc\\zd\\CD2.png')  # c呆2技能
    pyautogui.doubleClick(530 + sj, 640 + sj)  # 选择一号人物
    time.sleep(0.1)
    pyautogui.doubleClick(780 + sj, 630 + sj)  # 空点
    time.sleep(1)
    cd_3 = find_pic('D:\\fgoJB\\JB\\sc\\zd\\CD3.png')  # c呆3技能
    pyautogui.doubleClick(530 + sj, 640 + sj)  #  选择一号人物
    time.sleep(0.1)
    pyautogui.doubleClick(780 + sj, 630 + sj)  # 空点
    time.sleep(1)

四、细节方面

因为是自己使用所以做的比较简易,最后整体使用while进行一个整体的循环,期间夹杂一些if判断语句,整体在功能实现方面尚有些许改进空间。

ps:1.可以在选牌方面进行一个算法的改进。

2.对于模拟器中掉线情况没有进行判断处理的操作。

3.误操次数不多但是还是拥有这种现象存在。

4.对于激活窗口从而实现后续操作,后期可以作为后台运行。

5.不确定是否可以实现屏幕的绝对位置和相对位置对于点击选卡的优化。

6.技能选人稍显固化,后期可以进行处理。



你可能感兴趣的:(windows,python,opencv)