aircv+Win32Ctrl屏幕控制实现阴阳师自动妖气封印

  本文是对老项目的整理,之前使用过aircv+Win32Ctrl屏幕控制的思路进行过接近物理作弊,疯狂的刷阴阳师妖气封印的式神碎片。

  完整的代码见附件,关键点一个是使用aircv这个组件进行图像识别,一个是使用Win32Ctrl来模拟键盘发布指令。
aircv不需要训练模型,只需要提供一个目标的照片即可进行识别,所以我截取了大量的关键选择位置点,具体来说:

  1. 使用模拟器在PC运行阴阳师;
  2. 手动操作一遍妖气封印,并截取关键位置的截图;
    这里举几个例子:



    可以看到阴阳师游戏中这些按钮和状态标志都是比较清晰的。
  3. 完成判定逻辑的编写,即if发现了A在那个位置,发送命令点击什么位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import aircv as ac
import numpy as np
import Win32Ctrl as ct
import time
from PIL import ImageGrab
zudui=ac.imread('zudui.png')
zudui2=ac.imread('zudui2.png')
yaoqifengyin=ac.imread('yaoqifengyin.png')
yaoqifengyin2=ac.imread('yaoqifengyin2.png')
shuaxin=ac.imread('shuaxin.png')
jiaru=ac.imread('jiaru.png')
zhunbei=ac.imread('zhunbei.png')
shengli=ac.imread('shengli.png')
zuduiyaoqi=ac.imread('zuduiyaoqi.png')
pipeizhong=ac.imread('pipeizhong.png')
zidongpipei=ac.imread('zidongpipei.png')
kaishizhandou=ac.imread('kaishizhandou.png')

while (1):
pic = np.array(ImageGrab.grab())
#在主页点击组队
pos=ac.find_template(zudui,pic)
if type(pos)==dict:
print('组队')
print(pos['confidence'])
if pos['confidence']>0.8:
ct.mouse_click(220,575)
time.sleep(1)
#进入妖气封印界面
while (1):
pic = np.array(ImageGrab.grab())
pos=ac.find_template(pipeizhong,pic)
if type(pos)!=dict:
ct.mouse_click(700,600)
time.sleep(1)
else:
break
#自己变成了队长点一次开始
pos=ac.find_template(kaishizhandou,pic)
if type(pos)==dict:
print('开始战斗')
print(pos['confidence'])
if pos['confidence']>0.8:
ct.mouse_click(900,570)
#在开始战斗页面点准备
pos=ac.find_template(zhunbei,pic)
if type(pos)==dict:
print('开始')
print(pos['confidence'])
if pos['confidence']>0.8:
ct.mouse_click(1055,523)
#在胜利页面随意点击
pos=ac.find_template(shengli,pic)
if type(pos)==dict:
print('胜利')
print(pos['confidence'])
if pos['confidence']>0.8:
ct.mouse_click(1055,523)
time.sleep(2)
ct.mouse_click(1055,523)
time.sleep(2)
ct.mouse_click(1055,523)
x,y =ct.get_mouse_point()
print (x,y)
time.sleep(0.5)
x,y =ct.get_mouse_point()
print (x,y)
time.sleep(0.5)
if x < 10 and y < 10:
break

整个思路还是非常清晰简单的。

yaoqifengying.py
Win32Ctrl.py