YOLO813

写外挂玩游戏-Python自动化

    最近在某平台花了巨资买了个武侠种田游戏,可以捕鱼,养猪,种白菜,挖矿,蛮有意思的,就是总是要搞同样的操作,让我很是无语,想起来之前写的lol操作脚本,控制键盘,想着是否也可以整一个自动化脚本来挂机呢?

    库安装:

pip install pyautogui -i https://pypi.douban.com/simple

    使用的技术就是之前写过的控制鼠标、键盘示例,基本上拿过来就可以用

import pyautogui
from pyautogui import KEYBOARD_KEYS


    导入pyautogui自不必说,自动化脚本依赖的库,KEYBOARD_KEYS则是用来查看键盘上的按键对应的字符串是什么。

    因为这个游戏在捕鱼时选择空格就可以,但因为中间有动画过场,着实有点慢,因此,我将“继续捉鱼”截图保存到桌面,存为fish.png图片,通过判断是否有这个截图,来选择是否点击空格。

while True:
    # print(datetime.now())
    try:
        x,y = pyautogui.locateCenterOnScreen('fish.png')
        pyautogui.keyDown('space')
        pyautogui.keyUp('space')
        print("true")
    except:
        print("wrong")


    整体逻辑为,设定一个死循环,如果能从界面获取fish图片同样图片的坐标(这里为如何利用python控制电脑的鼠标文章中写的QQ截图返回NONE道歉,之前是错误的理解,因为脚本程序把图片挡住了,自然看不见图片,增加延时就是方便从脚本切换到界面,方便自动化程序寻找),则按下空格键。

    也存在问题:因为点击的图像是闪烁的,所以图片的校对存在失误,这也是为什么出现了继续捉鱼,但是却未成功选择空格的原因,不过我们也可以换一个思路,例如“回到岸上”的图像出来之后就按下空格,因为光标还是在上面的“捉鱼”选项上,但却没有闪烁,所以准确率应该是特别高的,在实测中,确实如此,当选项一出来的时候,立马就开始继续抓鱼了。

    而对于吊井水、挖矿,也是同样的逻辑,而对于挖矿的可玩性更高,比如通过OCR识别矿石在哪,再通过定位主角位置,调用pyautogui.moveTo前往对应的矿石所在位置,按下空格键进行挖矿,那这个就相当于全自动寻矿、挖矿了。

    但是对于键盘的控制,pyautogui做的并不好,我在尝试使用自动化控制角色移动时,他一动不动,然后找到一个帖子使用如下方法解决了

pip install pydirectinput
Then replace the import in your code:
import pydirectinput
Replace every function call from pyautogui to pydirectinput and you're set.


    打水、捕鱼代码如下:

# 打水
while x:
    # print(datetime.now())
    if pyautogui.locateCenterOnScreen('NoMoreWater.png'):
        pydirectinput.keyDown('space')
        pydirectinput.keyUp('space')
        time.sleep(.5)
        pydirectinput.press('left')
        pydirectinput.press(['left', '2', 'left', '2', 'left', '2','left', '2','left', '2','left', '2','left', '2'])
        pydirectinput.press(['down', '2', 'down', '2', 'down', 'down','down', 'down','space','space'])
        while y:
            if pyautogui.locateCenterOnScreen('fish.png'):
                pydirectinput.keyDown('space')
                pydirectinput.keyUp('space')
                time.sleep(.1)
                print("fish true")
            else:
                print("fish wrong")
    elif pyautogui.locateCenterOnScreen('water.png'):
        pydirectinput.keyDown('space')
        pydirectinput.keyUp('space')

参考:

#截图返回None的问题
https://segmentfault.com/q/1010000014268450
# Pyautogui don't work in game window
https://stackoverflow.com/questions/45295482/pyautogui-dont-work-in-game-window