大家好,今天为大家带来原神自动刷副本的脚本,先看看效果。

1、脚本思路:
1、找到进入副本的特征,根据这个特征让角色移动到挑战地点。
2、当角色到达挑战地点,找到副本挑战开始的信号。
3、挑战开始后,根据队伍预设的指令进行攻击,一直循环直到挑战成功。
4、找到挑战成功的标识,以此来结束攻击循环。
5、识别周围环境,寻找领奖位置。
6、移动到领奖处,识别可以领取奖励的标志,并按照指令领奖。
2、代码前的准备:
由脚本思路中,我们需要准备通关副本的各种数据(脚本思路下划线部分)。
首先,对于其中一些简单的标识,在电脑屏幕上持续时间长且容易识别,采用模板匹配算法。
模板匹配就是将特征图在一张图片里不停的移动并进行匹配,根据匹配相似度得到最高值,具体就不在这里说了。说回到简单的标识,比如,开启副本的标识,挑战位置的标识,等等。这些都是固定的标识。这些标识如下:

得到了这些标识,也就是所谓特征。那么我们需要将标识在一张图片里移动,找到相似度最高的值(模板匹配算法)。那么这个图片在哪里来呢?当然是我们的屏幕,但是把全屏放进去是不好的,这样运算速度比较慢,我们选择将屏幕部分区域截取下来,让这些特征在区域内进行匹配,这样大大节省了时间。
但是这些区域怎么获得呢?这个根据自己的显示屏大小来确定了。以我的为例:

tree_pos为石化古树的位置(874,278),(1042,321)分别代表了这个区域左上角和右下角点在屏幕上的位置坐标。这样,将所有需要匹配的特征加载进来,已经这些匹配区域的位置信息得到,就能进行识别。
上面说完了简单的标识,对于不那么简单的标识,模板匹配就不那么好用了。例如在战斗过后,找寻领奖位置。在战斗中难免有碰撞,导致位置不一样,包括视角转动这些,在进行匹配就不那么好找了,当然可以选择降低阈值,但很多时候仍然不容易找到。选择用YOLO进行识别。效果图如下:

至此,简单和困难的标识都得到了解决,下面着手代码的编写。
3、代码
1、对于简单标识,我们需要用模板匹配识别,先定义一个识别函数:
#匹配函数值 def get_match_value(path,pos): area = src_area(pos) tar = cv2.imread(path) res = cv2.matchTemplate(area,tar,cv2.TM_CCOEFF_NORMED) _,max_value,_,_= cv2.minMaxLoc(res) return max_value 函数输入值path,pos就是上面图里面的每一个特征的path和pos。
这里的src_area函数如下定义: