Python:从FGO中解放双手

图片来自p站

前言

我还是来讲一下写一个完整的FGO脚本的思路吧QWQ,具体代码的实现就不说了,直接到GitHub上面看代码就是了。
不过前期的准备还是讲一下吧owo,主要用到ADB对手机进行操作,Python的话需要cv2(opencv-python),PIL(pillow),pytesseract和numpy这几个库。剩下的话就是怎么写的问题了。

界面识别

只要肝过FGO再分析一下基本上可以把FGO的界面分成3类:

  1. 一般的界面,像是按“下一步”,选择关卡什么的。
  2. 战斗的界面,也就是选择指令卡的界面。
  3. 结束的界面,就是“点击屏幕继续”的界面。

呃不过还有像是选择助战之类的就另当别论了。

这个其实很简单,使用OpenCV库里面的matchTemplate()函数识别出按钮的位置并点按就可以了。而结束界面和选择助战的界面其实只要随便在其上面点按即可,基本没有什么难度。这里也不再多作赘述,因为最主要的指令卡的选择。

核心算法

这一part主要讲述指令卡的识别和选择。

指令卡识别

首先我们要做的其实是识别5张指令卡的种类(Quick Arts Buster)和状态(克制 抵抗)。这个和前面的界面识别其实也差不多,但做法稍微有些不同。我们需要把界面切割成五份,刚好把每张指令卡给截出来,然后便可把每张卡的种类状态和坐标给识别出来并记录下来(也就是要有一个class 是关于 order cards的),然后这些数据后面会用到。

从者的识别

这一个part就比较tricky了,因为我们没办法把所有的从者的头像给爬下来,所以我们要用另外的方法。想法便是从指令卡上截取从者的头像并保存下来,然后我们会遇到以下情况:

  1. 截下时刚好包括了三个从者,这样我们之后就不需要再截从者的头像了。
  2. 截下时未满三个,这样的话我们之后还要还要再截取新的从者的头像。

这样之后我们再帮每张卡标记上从者就可以了,另外如果同一从者的卡片对于三张则给它们一个标记(给后面Brave Chain的识别用)。
从者的识别还有另外的用处,那就是给后面宝具卡的识别使用XD

如果感兴趣的话。。。
识别流程
没有流程图orz,这里详细讲一下识别流程

  1. 把裁剪出来的每张指令卡中的从者头像裁剪出来(相当于会输出五张图,里面会有相同的从者,图片的名字和截出来指令卡的名字相对应)
  2. 将从者的头像与其他的指令卡匹配,如果是同一从者这删去多余的该从者,若不同则保留。最后会剩下1-3张从者头像
  3. 将剩余的从者头像另外保存为从者模板(template)
  4. 在以后的识别了,优先识别模板里的从者,若界面有出现除模板从者以外的从者则将该从者的头像截下并保存为模板
  5. 循环XD,然后在每次开脚本时清除就好了

伤害计算

还是这张表

因为我们之前给每张卡都标记过了种类,状态,从者所以我们只需要依据这张表把我们的数据和这张表格匹配就好了OWO

可以知道对伤害主要影响的因素是卡的种类出牌顺序,和Extra Attack卡,至于具体的实现。。。感觉说起来挺绕的,可能看代码更直接一点QAQ

宝具识别

感觉宝具的识别是最麻烦的,我也只是最近才写了出来,后面的代码真的是越写越乱QAQ,但也不妨说一下。

首先我们要识别到宝具卡,因为我们之前已经有识别从者并且将其截下了,所以并没有什么大问题。

真正有问题的是何时放宝具orz,我个人想法是用tesseract识别回合数并在最后一回合放宝具,当然,每个人的想法不尽相同,这个就自己决定吧OWO

磕苹果

这里来讲一下磕苹果的问题,其实我们并不需要识别剩余体力(这样太麻烦了QAQ),所以我的想法是当点击关卡是出现体力不足的时候自动磕苹果,然后自己可以设定磕到苹果的数量就可以了OWO

附1:使用教程(中文版)

  1. 安装ADBTesseractPython(推荐用Homebrew安装adb和tesseract)
  2. 通过pip安装opencv-pythonpytesseractpillownumpy
  3. 将Android手机(开启USB调试,屏幕分辨率要求1080p)连接电脑
  4. 按自己的需求配置config.py文件
  5. 运行脚本

附2:源码等

其实前面已经放过一次了,这里再放一次OWO:GitHub
至于还有什么。。。到时候再补充吧OWO

你可能感兴趣的:(Python:从FGO中解放双手)