部落冲突辅助 活死鱼判断+自动下兵
随着时间的推移,我终于也来到了9本,开始需要大量黑油了,是时候完善这个脚本了。
活死鱼判断
这个是一直困扰着我的难题。开始做这个项目,我就一直在想该怎样完成这一任务。
CNN Is All You Need?
最初的想法是直接用卷积神经网络来完成,收集上千个样本,然后直接训练。但是仔细思考,人是怎么判断活死鱼的呢?我是通过墓碑数和采集器是否是满的来判断,CNN能捕捉到这些小细节吗?我对此抱有怀疑。
接着,我就想使用多个分类器,就是CNN提取完特征后,分类器1判断墓碑数是多是少,分类器2判断采集器是否是满的,分类器3才判断是死鱼还是活鱼,前两个分类器是帮助模型收敛和防止过拟合的。
但是考虑到要标注上千张图片,还是作罢了。
You Only Look Once
又想到了用目标检测算法,检测图片中的奖牌、墓碑、满的采集器。现在训练Yolov8近乎是傻瓜式的。以及之前训练过一个用于微信跳一跳的Yolov5模型,当时只用了60张图片就训练出了一个很不错的模型,而且有相当强的泛化能力。所以我对这一方案进行了尝试,且非常有信息。然而,标注了30张图像,训练的结果非常糟糕。
传统CV
无奈,只能使用传统的CV了。判断的规则是,如果是灰牌且有5个以上的墓碑则是死鱼,或者有10个以上的墓碑也是死鱼。
关键的代码是
1
score = cv2.matchTemplate(origin, template, cv2.TM_CCOEFF_NORMED)
每个墓碑会有几个像素的差异,而墓碑又非常小,导致几个像素的差异影响非常大,所以是通过计数得分>0.75的个数,来近似墓碑的个数。
模拟下兵
入坑部落冲突的一个原因是,这个游戏居然可以滑动下兵!所以大家口中的“一字划”,我是真的“一字划”的。所以我希望能模拟出这种下兵方式。
仔细阅读Airtest的API文档和源码后,了解到了airtest.core.android.touch_methods.base_touch
中有DownEvent
、UpEvent
、MoveEvent
、SleepEvent
这四个基本事件类,contact
参数用来实现多触点,contact=0
为触点1,contact=1
为触点2,以此类推。这一module中,还有BaseTouch
这一基类,定义了swipe
、pinch
、touch
等手势,这些手势是由DownEvent
、UpEvent
、MoveEvent
、SleepEvent
组合成的。
在airtest.core.android.touch_methods.minitouch
和airtest.core.android.touch_methods.maxtouch
这两个module中,都基于BaseTouch
实现了MaxTouch
和MiniTouch
。我个人的理解是,它们使用不同的方法去执行DownEvent
、UpEvent
、MoveEvent
、SleepEvent
,而BaseTouch
是没有实现执行的方法的。
于是我继承了MaxTouch
,去实现我的滑动下兵,简单来说就是一个DownEvent
,加上数个SleepEvent
、MoveEvent
,最后来一个UpEvent
。虽然尽力地去模仿人类真实下兵的样子了,但依旧有很大差别。
此外,我还重写了swipe
、pinch
、touch
这些手势,加上了一些随机的偏移。(主要是害怕被封号,不过也不知道这样有没有用)