皇室战争AI迷思

Standard

做游戏的AI一直是我的兴趣所在,今天就以皇室战争为例,聊聊游戏中的人工智能。

必要的界定

游戏AI这个词,当标题很适合,因为它的概念很庞大;却不适合作正文,因为它的概念太空洞,容易引起歧义。当一个人和你说他是做游戏AI的时候,他可能指的是:

  1. 在吃豆人(PacMan)游戏中控制敌人如何移动
  2. 在我的世界(Minecraft)中控制僵尸向主角发起攻击
  3. 在多人联机对战中临时顶替一个掉线队友
  4. 在零和博弈游戏中的对手
  5. 让程序自己玩打砖块游戏,或在对战游戏中左右互博

以上情况是现实发生的事情,未来可能还有更多情形。为了AI这个词引发的歧义,我更愿意使用Interactive Agent这个词来代替之,简称是IA。顾名思义,Interactive是指和环境交互,而Agent则代表智能体。IA表示在一个特定环境中可以与环境交互并做出反应的智能体。从这个角度看,哪怕是最简单的单细胞草履虫生物,也可以算作IA呢。

简单介绍Env,Action,Reward,Loop的概念。必要时附图。

皇室战争是什么?

简化版的RTS。RTS的核心是资源管理、建造军队、摧毁对方基地。

皇室战争是一个双人对战类游戏,最终目标是摧毁对方的国王塔,这需要军队去完成,而建造军队则需要圣水,每个人可利用的圣水都是有限的。军队对应的是卡牌,每次进入游戏的时候,都要准备一个包含8张牌的牌组,每局开始时起手随机其中4张卡牌。卡牌是循环使用的,所以不会有用完的风险。每张卡牌根据属性不同都会消耗圣水(费用),而圣水(费用)会随着时间缓慢增加,但是有上限。

为什么是皇室战争?

它的独特之处在于,不同的军队会有不同的攻击方式,并且这一切都是游戏自动控制的,不需要玩家关心每个单位如何操作,就好像MOBA类游戏中的小兵一样。军队的类型也是层出不穷,有近战、远程,有地面的、飞行的,有单体攻击、范围伤害的,兵种及相互搭配也是多种多样的。

这种兵种自动攻击的设定,使得玩家只要关注部署军队的时机和位置即可。这当然是一种对操作的简化,同时也是对策略的一层抽象。需要注意的是,操作变简单了,不代表游戏变简单了。相反,还有可能变得更难。当微操不能在战局中起到重要作用的时候,剩下的就是拼策略了。

简化的操作降低了游戏的复杂度,同时又有着很高的策略深度,因此就以它为例了。

兵种克制

为了方便理解,我们把所有的军队卡牌分为三大类:单体高攻,低攻群伤,脆皮人海。进一步地,我们可以发现这三个大类间的克制关系:单体高攻 >> 低攻群伤,低攻群伤 >> 脆皮人海,脆皮人海 >> 单体高攻,其中 A >> B 表示 A克制B。这同时说明,即使是在消耗同样圣水的情况下,要评估一个单位的战斗力是很难的,这不是一个确定数。若用生物作比喻的话,这条食物链上总存在它的天敌和猎物。

这会让战局发生微妙的变化,可能是剪刀石头布的相互循环,也可能是田忌赛马般的策略较量。

牌组核心

毕竟这是一个推塔的游戏,对对方建筑的输出才是硬道理。一般主流的卡组都会有1~2个核心,形成一张或多张卡牌的组合进攻。如果他们赛后开总结大会的话,这些角色就是当仁不让的MVP了。举个例子,游戏里有一类军队,行动速度快,并且只攻击建筑无视军队。如果成功,便收益巨大。那么这些卡,就是这个牌组的核心。

但是,有个很残酷的事实,每张牌都是有天敌的。如果你有办法克制这些卡,那么对方的主力攻击就收效甚微,主力伤害无法打出,迫使攻击卡用作防御卡,这就形成了牌组压制。

曾经有个玩魔兽世界的朋友,告诉我魔兽竞技场的本质,就是拿小技能的消耗去骗出对面的大招,然后再用自己的大招终结对方。高手对战,讳莫如深。神仙打架,群众吃瓜。

牌组节奏

上一节说了卡牌间的克制关系,让我们设想一种情况,甲方放了AB来进攻,乙方放了CD来防守,完美克制,CD反攻,这时甲方放了EF来克制,乙方又放了GH来反克制。其结果可能是不断的循环,谁都攻不进去。这样的对局多见于双方都是低费的快攻流卡组。试想,每个循环所需要的费用是一定的,而费用的生成也是固定的,一旦费用不匹配,那么循环就会被打破。

这种低费、中费、高费,实际上隐式决定了牌组的节奏。如果一方的进攻节奏被扰乱,其核心就难以施展进攻了。

血量优势、费用优势

比起上一节玄之又玄的节奏,这两个概念就好理解一些。血量优势就是说你的防御塔血量比对方多,费用优势就是同一时刻你的费用比对方多。如果某种打法会使得这两个方面均占优势,那么大概率这种做法是比较优的。

困惑之处,是一方优一方劣的情形。

什么时候应该卖血赚费?当需要一波推进的时候。

什么时候应该亏费保血?当塔残血的时候。

不同的牌组、不同的策略,对这个问题的看法也不尽相同。但归根到底一句话,哪个重要选哪个。

例如,高费推进卡组,费用的累积是其关键,一次合格的推进大概需要17~22费用,而每个人的费用上限只有10。因此,在费用=10的时候如果有一选择,增加5费,而损失1000伤害,这个交易是可以的,他的期望是可以赚回3000点伤害。
再者,低费蹭血流卡组,3费能打500伤害就已经是高于预期了。这时如果有选择,用5费防守,可以少损失1000伤害,这个交易也是可以的。因为血量对他更重要。

总结之,第一种情况可以承受大于200伤害/圣水的损失,而第二种情况不能承受高于166伤害/圣水的损失。这便是策略的作用。

微操技巧

微操在这里的意思,是在某些特殊的位置,可以用低费卡牌完美解高费卡牌,来达到费用优势的效果。这种技巧能自己想出来那真是太厉害了,一般是无意凑出来,或者是从别人的对战中学习到的。

中路AC防王子、旋风拉猪激活国王塔都比较常见。当然还有旋风拉地狱飞龙脱战、以及小骷髅+冰激凌引刺客激活国王塔等骚操作。不多举例,懂的自然懂。

 

好了,基本该说的也都说了。你可能会说,道理我都懂,问题是代码怎么写?

这就引出了这篇文章的中心问题,那就是,如果我需要做一个皇室战争的IA,可以怎么做?利用经验得出的一些抽象概念,会对开发IA有帮助吗?

【咱们下一章见】