写一个VEGA_Conflict打怪脚本来解放双手

沉迷VEGA Conflict这个辣鸡游戏,发现这类游戏都有让玩家刷刷刷赚积分换物品的机制。这项工作重复且无趣,如果能写个脚本来全自动刷怪,岂不美哉!

脚本演示视频和使用教程可以参考这个视频

开发及优化思路

抽象来讲,我需要做的是

  1. 提前进入星区界面,标记需要攻击的npc舰队
  2. 选中自己的舰队
  3. 通过标记找到npc舰队
  4. 等待打完后维修自己的舰队
  5. 开始下一轮

理论上只需要比对屏幕上的像素点,然后按照游戏打怪逻辑进行点击就行。

理论成立,实践开始!

一对一

初代版本,花最少的时间构建一个单队伍单刷怪的demo,流程很简单。
在预先设置好舰队以及标记npc过后,我需要做的仅仅是按顺序点击【找到】、【攻击】、【免费修理】然后在每次点击后做一个等待就行,当然我们需要事先记录对应按钮的屏幕坐标值,但是不出意外经过测试后马上就出意外了。在点击【找到】和【攻击】之间的1秒间隙中,有可能已经被抢怪了,那么就会进入到【查看】页面,从而浪费五分钟。

因此,在每次点击【攻击】之前需要用pyautogui.locateOnScreen()来匹配像素值,确保点击是有效的。另一个问题是,并非每次都能免费修理,同理需要用pyautogui.locateOnScreen()来判断是否可以免费修理,以免浪费金币。btw、刷活动怪,还要判断是否需要关闭闪击者的弹窗。

多对一

一个队伍刷怪完成了,开始躁7个队伍一起刷。7个队伍刷同一个不需要关闭弹窗的怪还算简单,在一对一的基础上加入普通的循环即可。但遇到需要关闭闪击者的(我们并不知道什么时候会弹窗),就会被中断流程。所以,我们暴力的在每次点击操作之前都执行一次是否需要关闭闪击者的判断,确保第一时间能关闭弹窗。虽然暴力,但有用。

多对多

追求效率的情况下,(比如晚上睡觉),7个队刷同一个怪会导致产量浪费。如果7个队刷不同的怪,则能完美地解决这个问题。因此,我们需要更进一步!

事先准备好7个舰队,预先标记最多7个npc,我们的想法是1-7舰队分别攻击指定的npc。那么就需要在多对一的基础上进行优化。

跟刷一个怪有点不同,定位每一个怪都需要点击【书签】【已标记】来实现。因此需要预先记录这些点击的坐标。这儿会衍生出另一个问题。在进行点击的时间里(0.3秒不到),有可能会弹【舰队遭到攻击】的窗口。解决方案和【关闭闪击者】一样,每次操作前都判断时候弹窗了,虽然暴力,但是有效。

至此,总体业务逻辑结束。优化期间还有一些细节要处理,比如切换星区根据loading界面的logo进行等待、根据当前舰队是否正在交战智能跳过当前循环等,如果感兴趣可以自行查看源码。

核心依赖库是

1
2
# 需要pillow和opencv-python
import pyautogui

如果自行搭建请注意相关包。

代码和定位相关的图片已经添加到github仓库

steam用户可以直接下载打包版
使用。

祝刷怪快乐,请随意使用。

这不比淘宝上的什么小助手30块钱一个月的划算得多:)

后台挂机方案(2022年9月24日更新)

有朋友告诉我想要一个可以后台挂机的版本,我也用win32api做过尝试。可惜的是,不知何种原因给游戏发送后台点击的操作无效,而同样的操作在其他窗口下是可行的。也不知道是unity的问题还是k社的防脚本机制做的太好了。

如果一定想要后台挂机(比如我这种极端玩家),可以采用pc机(性能稍微强一点)+virtual box来实现。要注意的是,virtual box要在全屏模式下最小化,不知何原因窗口化会导致pyautogui报错。

以我现在的配置,i7_10700+16G内存的服务器在公网ip的加持下,已经实现挂机自由了(随时查看进度+不影响电脑正常使用)

事到如今,这款游戏差不多就被我玩通了 😀

已知bug(2022年10月8日更新)

疯狂选中舰队,但舰队死活不攻击

成因:新老系统字体不匹配,请考虑重装或更新你的windows系统。 如果你不想重装,或者更新后依旧无效,请考虑使用虚拟机。

在2022年8月的windows10专业版原版系统中,该脚本能正常运行。

底层原因: 为了不错误的点击“查看”(极小的概率中,你在找到和攻击的间隔中你的怪会被抢)和修理(假设你有几率不能免费修理),脚本使用图像匹配来判断npc的被攻击状态和你是否能免费修理。而不同的字体影响了脚本的判断。

2022年11月2日更新

  • 针对虚拟机挂机方案进行优化,发布了1024*768分辨率下的脚本,直接下载
  • 修复了闪击者弹出导致的若干bug
  • 增强了脚本稳定性

TODO

  • 增加运行状态监测
  • 等七年后(2029年10月10日)找某位手机用户吃肯德基