皇室战争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有帮助吗?

【咱们下一章见】

奇迹提问

Standard

今天来介绍一种很有意思的提问方式,也就是奇迹提问法。它较常见于心理咨询中,我先举一个例子。

在某个案例中,妻子抱怨他的丈夫对她的关心不够,感觉关系很冷淡,为此她感到很烦躁、焦虑,于是去找心理咨询师。

 

这时咨询师问了她这样一个问题,假如某一天,奇迹发生了,你的丈夫变得特别温柔,对你特别好,百般呵护。你会觉得怎么样?

“那很好啊。”她回答说。

“那么接下来你会做什么呢?”

她略微停顿了一下,“这样我就可以把更多的时间花在自己的工作和事业上了。”

 

随着聊天的深入,在这样的奇迹假设下,她开始想象未来可能发生的事情。而后她突然间意识到,她对待生活和工作的态度、交往中的一些细节,可能会导致两人间关系变得冷淡。未来的生活可能会变成这样,似乎对方在不在身边,已经变得不是那么重要了。甚至,她的焦虑、烦躁、唠叨、吵架,就是为了维护这段关系而存在的。如果没有间隔性的争吵,他们可能就会离婚。

奇迹提问便是这样一种方法,通过假设一个现实中没有发生的情境,把咨询者从过去和现在的思维模式中带出,去思考未来会发生什么变化。

Continue reading

《艾迪芬奇的记忆》一个家族的魔幻史

WalterEndingBanner
Standard

人们总是传着各种各样关于“芬奇”家族的故事,很多故事都以怪异的结局告终。有一些甚至听着就像编的。显然,这些故事也不可能都是真的。

但是我所相信的关于芬奇家族的故事,至少我觉得是很真实的故事,那就是故事的终结,芬奇家族的人总会死掉

我仍不确定,我即将讲给你听的故事是真是假。但我知道,这些故事以前没人听过。这是我的故事。

这是一个非常精彩的游戏。由于本文会涉及强烈的剧透,因此非常不建议没有玩过的玩家阅读。如果你对此感兴趣,可以去Steam商店购买。如果不方便自己体验,推荐去看B站上的C菌的视频实况解说

Continue reading

游戏中的「兔子」与「狮子」

Standard

「疯狂动物城」中的兔子Judy,内心善良,过着与世无争的生活;而身为食肉动物的狮子,却被打上四处挑起争端的标签。

在游戏的世界里,也存在着这两种类型。一种是和平相处、友好和谐的 PvE 玩家,喜欢剧情、喜欢探索世界;而在另一种 PvP 玩家的世界里似乎充满了竞争与对抗,他们喜欢玩家间的对战。

在「魔兽世界」这种同时提供 PvE 与 PvP 玩法的游戏中,玩家会大致分为两个流派。光看屏幕的话,他们做的事情似乎差不多,各种打来打去的。但其实不同,前者的目标是系统设定的虚拟人物,而后者面对的则是真实玩家。

于是,一个有意思的问题产生了,在游戏中知道你面对人物是否是真实玩家,究竟有多大影响呢?

Continue reading

看烟花时,你能准确估计一分钟吗

Standard

本文是一篇小短文,主要讲有关心理时间的一些有趣现象。

在国内去问路,可能得到的回答是“就在前面那个路口,很近,几分钟就走到了”,而实际走了十多分钟;给朋友打电话问什么时候能到,答曰“快了,一会儿就到”,殊不知刚上地铁。难道他们是真的估计不准较长的时间、距离吗?

其实这只是缓解等待的说辞罢了。但这不代表我们对时间的估计就很精准。

倘若要估计一段5秒的时间,一般误差都在1秒以内。若是估计1分钟,结果就不准确了,可能偏大或者偏小。如果估计1个小时,那简直就是煎熬。我们不会像钟表一样滴答滴答数着时间的流逝,而是凭借自己的感觉。而这种感觉,是容易受到情绪、环境的影响的。

当情绪激动、注意力集中时,会倾向于低估所用的时间。

Continue reading

微信“小程序”:粒沙窥世界

Standard

微信小程序,这个听起来有点别扭的名字,也许不久后将会出现在你的生活中。

就在2016年12月28号,张小龙在广州的微信公开课开讲。我当然没有亲临现场,但在看到演讲的要点整理时,不由得为之一颤。

是的,我被震惊到了,然后就开始开脑洞。

所以,免责声明:以下内容纯属脑洞,请以吃瓜群众心态来观看,并且千万不要相信。如发生意外事故,纯属巧合。

(友情提示:本文共计4850个字,阅读需要约8分钟,嗯,还不及光从太阳表面到达地球的时间)

Continue reading

Toki Tori 2+: 一段没有“钥匙”的解谜之旅

Toki-Tori-2-Banner
Standard

“听说你喜欢解谜游戏?那我就来讲个 Toki Tori 2+ 的故事吧。”

“咦,这是什么?”

“首先它是个解谜游戏,而且是个无文字解谜游戏。这并不罕见,例如画风独特的《机械迷城》,黑白色调的《Limbo》,还有《INSIDE》等等。它们并没有选择通过文字去讲述一个故事,而是通过画面的表现力、背景音乐的烘托营造了一个氛围。”

“然后?”

“而 Toki Tori 2+ 并不是这样,它的风格十分的卡通,甚至有种回到童年的错觉。这样小清新的画面背后也有一个简单易懂的故事,就如妈妈给小孩讲的睡前故事那样,很单纯。”

“看起来像是小人童话书中的插画”(看到了 Banner 图)

“它还有一个属性标签,那就是平台游戏。就像《马里奥》中的水管工那样,奔跑、跳跃,横版、过关。而我们的主角是一只(有点胖的)小鸟,只是有那么点遗憾呢,它连跳都不会。”

“好,不会跳,那总会飞吧?”

“不行,羽毛是 P上去的。”

“而且跳跃是平台游戏的灵魂啊,若是把那水管工去了双腿,那别说是公主了,连见到蘑菇的机会都没有了,更别谈勇斗恶龙的故事了。”

“那主角会升级吗?”

“不会,没有蘑菇这种道具。”

“那能拿起武器吗?”  

“不能,游戏中连物品栏都没有。”

“那主角有技能吗?”

“没有。”

“那它会什么啊?”

“只会两样,唱歌跺脚。”

“噗”

Continue reading

Windows 下 Python 双版本共存解决方案

Standard

Python 是一门很不错的语言,语言简单易学,又不失脚本语言的灵活性,还有海量的第三方库,覆盖的很全面。但也有不少“硬伤”,比如 Python 2.x 和 Python 3.x 版本之间的不兼容等等。

虽然我遇到的问题并不是很普遍,但还是把整个过程记录下来,以供以后查阅。

问题描述

平常我使用 Python 的环境一般是 Python 2.7,因为一些历史遗留的原因一直没有更换。但总会遇到一些傲娇的 package 需要 Python 3.x 的环境。因为 Python 不是向下兼容的,所以如果把原来的 2.x 代码放到 3.x 的环境下运行那肯定是要报错的。所以便需要两个版本共存。

我的需求是,平时使用的时候 python 指向的是 Python 2.7,用 python3 来表示 3.x 的环境,同时不希望修改系统的环境变量,免得引发一系列连锁问题。

解决方案

解决的方法其实也很简单,假设原来的安装目录是 C:\Python27,那么我只需要在这个目录下新建一个名为 python3.bat 的文件,其中的内容是:

@ echo off
C:\Python34\python.exe %*

这样也不需要修改环境变量,直接打 python3 可以进入命令行,或者用 python3 xxx.py 在 3.x 环境下来执行某个文件。

Continue reading