一个根据设定完成流水线工作的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')