前言:
该说不说,现在小游戏挺火的,尤其是微信小程序的小游戏内容上已经不比单独需要下载的app小游戏差多少了,流畅度也不算差了。
我【有个朋友】也玩了很多这种小游戏,每个阶段火的,他都玩了。而且他很喜欢用airtest做一些日常任务的脚本来进行【自动化测试】,帮助厂商找一些bug之类的。
久而久之,他对用图像识别的办法做小游戏的自动化非常有理解了,各种组件化,工程化,兼容性也都照顾的很好,但唯有一点一直让他很苦恼。就是游戏的自动寻路问题。
众所周知,这种手机上微信小游戏,几乎都没有PC端大型网游那种自动寻路功能,全靠用户硬划屏幕。问题就在这儿:
进入副本之前的一些按钮啊、数据啊什么的都很好操作或监控。等进入副本了,人物的攻击、技能、防御按钮也都很好识别和点击。但唯独人物前进的路线不好弄。也就是没法寻路。
无独有偶,前阵子很火的那个等了好几年的刷图手游上线后,我的部分学员中也有人做了自动刷图的脚本,他在寻路的方向上,就是一直按右键,让人物往右跑,右侧没有的时候,再往右下,然后右上,然后不行再往左边跑,再左上,再左下。虽然很麻烦,但总归能碰巧进入下一个怪物房间的大门。
看着比较尴尬,也跟智能没有啥关系。他说他其实考虑过,毕竟其实他可以写死一个副本的前进路线,然后不断的自动刷这一个图来升级,出去吃个午饭回来一看:疲劳刷完了,打开背包好家伙,全是捡的材料。又快又稳。
我就跟他说,你这样做,和工作室那些自动刷图脚本还有啥区别。他却回答我说:有区别啊,区别就是,工作室搬砖的确实可以这样反复刷一个副本地图来写死脚本。但我这是练号啊,每个副本最多也就刷那么一两次,根本不可能去写死一个路线,每个新地图都要写一个全新的脚本,有这功夫,手动都刷完几十遍了。
所以,他只能做了一个万能的路线,就是上面说的 →↗↘←↖↙,这个路线了。虽然慢,但是复用性高,每个地图都可以用。
我暗自点头,觉得他说的很有道理。但其实我们在日常工作测试中,如果负责的软件是小游戏,那么测试流程和目标地图在相当多次的复测里,就可以用写死路线的办法,毕竟复用次数足够高,写起来不吃亏。但在平时玩玩小游戏的情况下,每个地图就刷那么一两次,甚至还有随机地图游戏的存在,看来,有必要讨论出一些好用的办法了。
当然有些小伙伴会说,人家大型pc网游为什么都有自动寻路功能,人家怎么实现的呢?我只能说,人家是内部官方开发者,有自带的各目的地npc的具体坐标,并且有固定的一些主路,有大量内置的固定路线,没看那些玩家要去哪,走的路都在一条线上么?咱们普通用户玩家角度,哪有功夫做这个?不过也可以看做是一个启发。
正文:
【方法一】针对固定副本或简单左右横向副本,可以直接采用写死前进方向的办法,此时如果用图像识别的方法,尽量调出方向键,然后点击→即可。
如果没有方向键,有移动摇杆,则要固定摇杆位置,然后点击摇杆右半部分图像来进行移动。
如果什么图像都没有,那建议使用拖拽的办法,屏幕长按移动的中间位置,点击鼠标后向右滑动且不松手。这个在airtest或appium中均有办法实现,实在不行,还可以用adb来实现。我会在今后的文章中尽量给大家封装好这种操作。
【方法二】针对随机地图或者不同地图的副本,可以使用特征方法来前进,注意,这个方法也没有任何AI参与,只是单纯的来反复执行类似→↗↘←↖↙的固定操作来凭运气前进,当然速度会非常慢,甚至极容易陷入死胡同。优化办法就是,对每一个方向的操作都甚至反馈,反馈的主要目的是搞清楚,执行了移动后,人物是否还停留在原地,也就是卡到这里了。还有就是通过反馈可以知道,人物是否在前进,亦或是走了回头路或者错路。
反馈的方案有杀怪的积分,积分增长,证明走到了新的区域。还有就是特征,在每一步方向移动操作之后,都记录下,目前人物的四周环境图片,还有小地图图片。在执行了下一步之后,就是通过这些来判断人物是否走进了死胡同卡住了。
当发生卡顿后,也要积极做出行动,也就是立即使用其他方向移动,如果执行后发现变化了,证明走了出去。此时要把刚刚相反方向的移动拉黑,避免再次回到死胡同里。
那问题又出现了,如果刚走出死胡同就走了回头路了呢?或者压根没进入死胡同,纯粹是瞎走的时候走进了回头路呢?要解决这个问题,就要考虑以下几点:
1. 全地图可以在卡死的死胡同一共有多少,每一个都进行特征记录。从而根据这些特征来判断自己是否走了回头路。
2. 全地图要设置一个主方向,比如横版类的,→是主方向,那么就尽量减少←的移动,除非是卡住的时候。
3. 借助小地图和小地图中自身的位置,来判断路线,这点其实并不太好判断。
当然,一切都要具体情况具体分析,不同的游戏有不同的解决办法,没有什么固定的万能方案,如果有,那就是你的随机应变。
【方法三】针对不可预测的地图或者全部情况,使用AI来计算出前进路线和操作。这个方案有弊有利。
好处是几乎是万能的,采用和人类似的分析判断,一旦训练成型后,几乎可以放心的交给AI寻路了。
坏处是训练成本过高,除了需要一定的代码基础和AI基础能力之外,还需要大量的数据喂养和人工校验,在你好不容易训练出个好歹的时候,别人已经刷到满级退游了。但是在公司里实际负责测试的小伙伴,我觉得倒是可以下点成本这么试试,毕竟古人云:磨刀不误砍柴工。不但看着高大上,你自己也练习了一定本领。
关于游戏方面的AI制定,有很多专业的文章,恐怕你们一时半会也看不下去。我就给你们把寻路的问题简单说说吧:
你得先确定好,输入是什么,输出又是什么。
先说输入:输入应该有俩个,就是你的小地图(为避免干扰尽量别用实际人物周围的大地图),还有就是你要执行的移动操作。
再说输出:输出就是反馈,AI它要知道反馈才知道自己刚刚的操作应不应该保留还是修改。那么寻路的反馈就分两种:
1. 实时反馈,也就是AI前进一段距离,就给它个反馈,比如碰到野怪打死后的分数,或者成功进入了下一个怪物房间。但实际上很多时候,我们要走很长一段路才能有这种反馈,而AI并不清楚这点,只会觉得自己刚刚走的方向不对,直接换路了,那就错过了正确的路线了。
2. 延时反馈,也就是用整个副本通关作为正反馈,用超时作为负反馈。虽然中间过程曲折且漫长,AI要走的路线和方向太多,导致要测试出来的次数很可能是个天文数字,就像抖音上总看到的那种用AI来训练赛跑游戏的视频一样,训练几十万次都未必能成功。当然一旦训练成功了,后面也省心了。只是小程序UI自动化执行一次都要很久很久,这个模型训练的反感显然不切实际。
那么如果使用目前的一些公共大模型,比如chatGPT和其衍生品、同类竞品呢?这个我也考虑过,但是考虑到价格和延迟问题,还是放弃吧。你也不想刷了一次副本花了好几块钱并且用了半个多小时吧?
【方法四】还是针对这种不可预测地图,还是使用AI。只是这次的输入和输出都进行了变化。
输入:小地图+前进方向和距离+前面一步的前进方向和距离。
输出:小地图和上一步小地图的相似度。
大家可以想象一下,AI往前走,不再是依据瞬时的环境了,而是依靠前面一次到现在的一段时间的环境。
就好像,之前AI只能通过上下左右来判断,而现在又增加了一个过去的时间轴。也就是提高了一个维度,这个新增维度可以让其避免走回头路,也可以更加准确的判断未来路线。
就好像假如给你突然扔到一个陌生的马路上,让你去某个目的地。你根本不知道应该往哪边走,但是此时你回忆起来刚刚自己试一路从东过来的,那么按照这个惯性你也知道要继续往西走。
这个方案的训练次数恐怕要比方法三小的多,并且不需要额外进行外链请求大模型,费时费钱。
本期到此结束,希望能给正在被此问题困扰的小伙伴一些启发,我也就是抛砖引玉,欢迎小伙伴进群瞎聊~