人工智能实战:搜狐1024坦克大战技术分享——躲避篇

       大家好,我是来自搜狐畅游引擎部的考拉,在前不久搜狐集团举办的1024AI坦克大战的比赛上,畅游引擎部获得了第一名的好成绩,今天很高兴有机会和大家分享一下坦克大战AI的技术细节。

       提到坦克大战,大家第一反应肯定是小时候在红白机玩过的坦克大战游戏。

但是今天要说的游戏环境和它还是有很大区别的,搜狐1024坦克大战的游戏环境是基于html的,玩家可以通过开发js脚本进行按键模拟操作坦克来躲避子弹和攻击别的坦克,同时畅游引擎部还为赛事开发了地图编辑器,可以自由编辑各种各样的地图,下面是一段游戏视频。

       想必大家可以从上面视频中密密麻麻的弹幕看出游戏的复杂度,为了在这样的环境中可以闪转腾挪快速击杀坦克,躲避子弹的功能就是重中之重。在介绍躲避子弹功能之前,我先给大家介绍一些游戏规则:坦克的移动速度固定为7个像素,子弹的移动速度固定为10个像素,坦克每帧可以选择上下左右四个方向进行移动或者静止,每帧会有10ms的时间给玩家的js脚本进行计算得出操作结果。

       在这种游戏环境前提下,我们开发躲避模块的核心思想是预测未来情况,因为子弹和坦克的速度固定,所以我们理论上可以针对场上的子弹分布情况进行未来n步 的推算,判断我们在这n步中采取怎样的方向序列才可以保证一直安全。思路是比较简单的,但是在实际实现的过程中还有很多的细节问题。首先是上文中提到了游戏环境给我们10ms的时间进行逻辑计算,那么我们的计算量就不能超出太多,否则会造成游戏整体卡顿;其次预测会生成很多可以选择的方向序列,怎么选择也是一个需要思考的问题,下面我会对这个几个问题逐一解释。

(注:为了方便描述,下文中会用上图所示的数字形式来代表预测情况,其中0代表可行走,6代表必死区域,7代表与子弹碰撞的区域)

预测步数

       如果考虑静止不动,坦克每帧都可以采取5个方向,那么如果预测N步就会有5^N种情况,这种程度的计算量导致我们的预测步数没有办法太多,所以我们采用了一种控制预测步数的算法,首先设定最小预测步数min_step和最大预测步数max_step,在js脚本中记录当前帧逻辑计算所用时间,如果小于10ms则当前步数加一,如果大于10ms则把预测步数降为 min_step + (当前步数 – min_step) / 2,这样既避免了卡顿也最大程度利用了计算时间。

落点选择

       虽然做了这样的处理,但是指数级的时间复杂度还是有些难以接受。换个角度来看,我们需要躲避子弹的时候肯定是马上要被击中的时候,这个时候的躲避行为通常都是要远离原来所在位置的,静止不动或者来回移动都不是很利于高效躲避,所以我们可以只考虑经过N步后到达最外层落点的情况。

 最外层落点

再加上因为地图上的坦克会随机开火,所以计算具体的路径并没有意义,我们只需要得到坦克在下一帧可以行走的方向即可。

预测具体计算过程

       具体计算过程如上图所示,对于每一步预测,只需要考虑最外层的落点,如果判断最外层落点可达,则将当前节点的第一步方向传递给他,对于最后一步预测,只需要统计所有最外层落点的可行走方向,就可以得出第一帧可以选择的方向集合。通过这样的思路转换,我们将预测未来情况的计算转化成了一个寻路问题,时间复杂度从一开始的O(5^n)减至O(n^2),大大提高了算法的可行性。

子弹必死区间判断

       预测步数受计算时间限制很难有较大提高,我们可以从另一个角度出发来提高我们的预测范围。因为子弹比坦克的速度快,所以会存在一些情况是子弹还未与坦克碰撞,但是坦克已经注定躲不开了,我们可以在预测未来情况的时候加上这种判断,也可以大幅延伸我们对于危险判断的距离。

坦克的必死区间

       如上图所示,在进行预测未来情况是也要尽量避开这种必死区间。

虚拟子弹生成

       从上文中我们可以看出,因为坦克移动的特性,我们的预测预期始终是一个菱形,但是这样会有一个问题,我们的预测范围会有一个视野盲区,当我们通过预测进入这个区域后再想躲避已经来不及了。

       如上图所示,坦克在躲避下方四发向上的子弹时,由于菱形区域的视野盲区,检测不到右侧的威胁,做出向右躲避的动作,当检测到的时候已经处于必死的状态。

对于这种情况,我们要对于处于视野盲区的子弹生成一发在其方向上的虚拟子弹,将危险信息向前传递,使得坦克可以提前预测到,避免进入必死区间。

内存池

       此外为了尽可能地避免js的GC机制耗时,我们还对常用的类实现了内存池,进一步缩短了逻辑计算的时间消耗。

       以上就是我们在AI坦克大战中对于躲避子弹所做的一些工作,后续我们还会继续分享在AI坦克大战中对于攻击和寻路的设计,欢迎感兴趣的同学加入搜狐畅游引擎部和我们共同研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搜狐畅游引擎部

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值