python | lackey库实践 |自动化exe程序,完成王者荣耀人机模式获取金币

一个根据设定完成流水线工作的exe程序

比如说:自动打开王者荣耀选择人机模式,然后对战,最后结束游戏。起初我的想法是不断打人机赚金币,结果发现挂机都比程序打的赚的金币多,所有进入游戏一开始是程序操作的,最后是挂机模式,由AI去完成整个游戏,结束游戏后继续匹配。
请先看视频

python | 第3集 实现自动进入王者荣耀人机模式,不断进行游戏,完成赚取金币的任务

本场游戏中会从头到尾检查游戏是不是已完成状态,并且无论成功或者失败都会记录当前屏幕。
在这里插入图片描述
失败的截图
在这里插入图片描述
成功的截图
在这里插入图片描述

注意:必须是自己截图,截图当然都是自己电脑像素,我代码中截的图你可能用不了

大体思路还是我们常规的思维,人是怎么操作的,鼠标就是怎么操作的。
重点就是:观察自己定的流程会不会被其他乱七八糟的东西干扰了,这时候就需要枚举出所有的场景,但凡你碰到过得就需要记录下来,并且开启另外一个线程,干掉和主线无感的画面。

import datetime
import threading
import time
import PyQt5.uic.pyuic

import lackey
import pywinauto
from PIL import ImageGrab


def close_x():
    while True:
        try_lock_and_click(r'./photo/close_x.png', message='执行关闭操作中...')


def get_info(message):
    return message + str(datetime.datetime.now()).replace(' ', '').replace('.', '').replace(':', '').replace('-', '')


# 尝试锁定并点击 Try locking and clicking
def try_lock_and_click(png_path='', message='', button='left'):
    time_out = 120
    while time_out > 0:
        msg = get_info(message)
        try:
            screen = lackey.Screen()
            match = screen.findBest(pattern=lackey.Pattern(png_path))
            if button in 'left':
                screen.click(match)
            if button in 'right':
                screen.rightClick(match)
            print('锁定[' + message + ']成功!' + ' 请查看图片[' + './photo/success_png/' + msg + '.png]')
            ImageGrab.grab().save('./photo/success_png/' + msg + '.png')
            time.sleep(2)
            return True
        except Exception as e:
            print('锁定[' + message + str(time_out) + ']失败,请查看图片[' + './photo/fail_png/' + msg + '.png]')
            ImageGrab.grab().save('./photo/fail_png/' + msg + '.png')
        time.sleep(1)
        time_out -= 1
        if time_out == 0:
            print('锁定超时,退出锁定...')
            exit(0)


def try_lock_and_click_close(png_path='', message=''):
    msg = get_info(message)
    try:
        screen = lackey.Screen()
        match = screen.findAll(pattern=lackey.Pattern(png_path))
        screen.click(match)
        print('锁定[' + message + ']成功!' + ' 请查看图片[' + './photo/success_png/' + msg + '.png]')
        ImageGrab.grab().save('./photo/success_png/' + msg + '.png')
        try_lock_and_click_close(png_path, message)
    except Exception as e:
        print('锁定[' + message + ']失败,请查看图片[' + './photo/fail_png/' + msg + '.png]')
        ImageGrab.grab().save('./photo/fail_png/' + msg + '.png')


def run(exe_path=''):
    # 打开指定应用(夜神)
    pywinauto.Application(backend='win32').start(cmd_line=exe_path)

    # 锁定王者荣耀
    try_lock_and_click(r'./photo/wangzherongyao.png', message='王者荣耀')

    # 开始游戏
    try_lock_and_click(r'./photo/start_game.png', message='开始游戏')

    # 锁定 对战
    try_lock_and_click(r'./photo/battle.png', message='对战')

    # 锁定 5v5
    try_lock_and_click(r'./photo/arena.png', message='5v5 王者峡谷')

    # 锁定 人机
    try_lock_and_click(r'./photo/ai_mode.png', message='人机 AI MODE')

    # 锁定 倔强青铜III
    try_lock_and_click(r'./photo/qingtong_III.png', message='倔强青铜 III')

    # 锁定 锁定开始练习
    try_lock_and_click(r'./photo/start_practice.png', message='开始练习')

    for map_count in range(2):
        print('开始第' + str(map_count) + '次对战')
        # 锁定 开始匹配
        try_lock_and_click(r'./photo/start_map.png', message='开始匹配')

        # 锁定 确认进入游戏
        try_lock_and_click(r'./photo/ok_income_game.png', message='确认')

        # 锁定 点击右三角
        try_lock_and_click(r'./photo/right_sanjiao.png', message='三角符号')

        # # 锁定 选择刺客
        # try_lock_and_click(r'./photo/tanke.png', message='刺客')
        #
        # 锁定 选择坦克
        try_lock_and_click(r'./photo/tanke.png', message='坦克')

        # 锁定 选择亚瑟
        try_lock_and_click(r'./photo/yase.png', message='亚瑟')

        # 锁定 确认选择百里玄策
        try_lock_and_click(r'./photo/ok_choose_hero.png', message='确认选择')

        # 锁定 完全确认 不需要等待
        try_lock_and_click(r'./photo/ok_choose_hero.png', message='确认开始游戏')

        # 检查是不是已经进入到游戏当中
        is_income = try_lock_and_click(r'./photo/is_income_game.png', message='检查是否进入游戏')

        if not is_income:
            print('没有进入游戏,无法进行下一步操作!')
            return

        # AI操作 每过一分钟检查一下对局是否完成
        while True:
            is_continue = try_lock_and_click(r'./photo/is_continue.png', message='检查当前游戏是否已完成对局')
            if is_continue:
                break
            time.sleep(60)

        # 点击继续
        #
        try_lock_and_click(r'./photo/is_continue.png', message='点击继续')

        # 点击返回房间
        try_lock_and_click(r'./photo/go_back_home.png', message='点击返回房间')


if __name__ == '__main__':
    # 开启一个线程用来点X
    threading.Thread(target=close_x).start()
    run(exe_path=r'D:\Program Files\Nox\bin\Nox.exe')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值