即时战略游戏(比如 WAR3)的 AI 是怎样实现的?
我的图书馆
即时战略游戏(比如 WAR3)的 AI 是怎样实现的?
【苗忆南的回答(171票)】:
War3的AI没有必要使用你提及的算法,或者说,根本无法使用。
有相关经验表明,的AI如果采用神经网络等算法,会傻得出奇。
使用学院派算法的AI总会做出匪夷所思的动作,让人无法理解,游戏性尽失。
其主要原因在于遗传算法、模拟退火算法、神经网络算法、各种分类算法等等,都是高度概括化的,旨在找到最优解/或者找到全局关系。但是我们的AI实际不需要最优解和全局关系,一是你的电脑没那么叼,这么复杂的情况,如果真的高度概括出来了,其复杂程度是很高的,你的电脑也带不动,其次是算法在训练过程中收敛也会很慢,因为样本太过复杂,所以也许要花上很久(几年?猜的)来收敛,如果我们降低收敛精度要求来使速度加快,AI就会变得非常傻,做游戏明显不能这样。即使上述问题都被解决了,还有个问题就是,电脑得到了最优解和最优数学模型,你作为玩家就没有胜利的希望了,这游戏 给谁玩?
即使设计公司神经病般的决定如此设计,每当你的游戏有更新,兵种变化,数据变化,整个算法 就要重新训练,玩家需要重新下载AI的全部内容,对用户的体验和公司的工作效率都有损害。
战略类游戏的AI,还是有限状态机。
根据不同情况分类做不一样的事情,全都设计好,设计的尽量详细,就OK了。
关于其复杂度:
这类AI的程序体往往超乎想象的长,当然具体长度和游戏本身的设计也有一定关系,和游戏其它部分代码的设计优化程度也有关系,但是即使在较优环境中,其AI长度也是很长的。具体原因就在于其事无巨细的分类了所有情况,规定了AI在不同时间不同情况所做的不同事情,作为一个战略类游戏,尤其是即时战略类游戏,这是十分复杂的,情况十分多,因此程序本身也会相当的长。
但是他运行速度又快!又像人类在玩!又给了玩家胜利的可能!又容易设计和更改!
何乐而不为呢?
【五八的回答(17票)】:
我war3作图五年,题主问的那些算法一个都不清楚----那时候才初三好吗 - -#
做AI其实得票第一的那位已经说得很好了:暴雪也好,你也好,造个AI是陪人玩的,不是把人虐的满地找牙……事实上,暴雪内置的AI编辑器也十分简单,界面基本上分为两部分:
获取资源进行发展的部分----设计一个混合的发展树(里边有建筑科技小兵,包括分矿、第1/2/3英雄等)
----根据发展树逐一建造资源能够提供的东西
----*这弊端很明显,暴雪官方的AI永远是一个模样,并没有多样的战术
----**AMAI可以有各种奇怪的战术,比如 Tower Rush 吹风流 骷髅海等等……
消耗资源进行对战的部分----设计一个进攻树(里边包含野点(低中高级)和敌人基地),进攻树可以重复
----设计一些小分队阵容,比如一个近战阵容可以包括大G狼骑等等,一般还要加上英雄,每次貌似随机出一队人去进攻
----交战时,既能自己释放就不用说了;血少的会往后撤退,谁打自己的英雄友军就打谁,这是临场战略
----*实际上,这样的AI还是不够智能,至少战术上从来不顾及玩家。比如你的AI盟友总是笑呵呵的打个叹号,然后等都不等你就出征了……
仔细想想对战大体不就是这么两件事么:找资源和耗资源。这两个处理好就可以应付大部分情况。
除此之外,还有一些杂项设置,比如根据攻击护甲类型自动选目标优先攻打,优先干掉敌方英雄……
如果要研究代码肯定让楼主失望了,但要做个战略AI大概就是这些相对简单的步骤,这通常已经能取悦大部分玩家。
如果真的能做出那种战无不胜的AI,那么说到暴雪时大家一定不会认为这是个伟大的游戏公司,他早就有更赚钱的生意了。
【skycannnan的回答(21票)】:
我来卖个萌 呵呵
有限状态机 几乎是2005年以前所有游戏的ai解决方案
但是即使是 有限状态机 ,在刻画复杂的游戏场景时,也会陷入冗长的代码链之中而丧失代码可读性
所以 behavior tree(行为树)出现了
本质上说,behavior tree的原理并不比 有限状态机 高明多少
但是behavior tree可以大大简化ai控制流程,使解决方案更加清晰
一个用有限状态机写的ai控制,用behavior tree大概只需要1/3的代码,并且可读性更强
要了解behavior tree,请查看cry engine 相关资料,
或者havok的行为树资料更加翔实
同时也有一个基于c#的实现,叫做tree sharp ,可以搜下
【知乎用户的回答(11票)】:
war3的AI我没写过,别的即时战略游戏的AI我倒是分析过。举个例子,神话时代、帝国时代3、国家的崛起的AI都差不多,前半截出农民分配矿工去不同资源上都是设定好的,几分几秒造哪种建筑出什么兵种都是设计好的。然后都是照方抓药,人类来什么兵AI就派某种兵来顶,发生什么状况就会触发什么预案,都是设计好的。所谓自我学习的AI也只不过是把某情况触发某预案的阈值变量变化了,不会出现特别复杂的“算”法,没什么可算的,都是条件触发罢了。国家的崛起的AI不过是一堆几kb的C++语言文件。至于微操方面的AI也是如此,一堆条件触发罢了。
【伍一峰的回答(11票)】:
赞同楼上所有***。
传统即时战略 [1] 的AI其实可以分为两个部分,一个是资源管理AI,一个是战争AI。
资源管理AI就是决定建筑、科技树、建兵的AI。
资源管理AI一般采用的是规则式AI。
规则式AI简单来说,就是一大堆if-else语句。
它有两个主要的部分,一个是工作记忆,另一个是规则记忆。[2]
工作记忆储存已知的游戏世界信息,这部分是动态的。
规则记忆储存设游戏计师设计的的规则。
所说,规则都是pre-scripted的。
而当工作记忆符合规则记忆的某一条规则时,相应的行动就会被触发。
这样做的好处是,游戏设计师拥有完全的掌控权。
而它的坏处也是十分明显的----因为是pre-scripted,所以整个规则是静止的。
但是毕竟在即时战略中,“正确合理”的发展方式就那么几套方案,所以规则式AI带来的好处多于坏处。
当然,规则式AI也有一些手段来动态学习。
例如给规则的触发条件并不是一些具体的“钱多少、兵多少”,而是权重。
每次分析时,根据上一次触发的结果的好坏来调整所有规则的权重,然后选出权重最高的规则,触发相应行为。[3]
然而动态有时会带来不确定性,所以采取与否,需要看游戏的设计来决定。
战争AI其实可以分为两层 [4],一层是将军AI,一层是士兵AI。
将军AI的工作是分析游戏世界,然后告诉所有士兵AI “去哪里,做什么”。
士兵AI的工作是分析自己附近的游戏世界,然后决定相应的行为。
在将军AI分析游戏世界时,有可能会采用Planner[8]、Utility-Based AI或者Neural Network[11]等能够带来不确定性的AI算法。
我对Planner不熟悉,就不多说了,大家可以看看[8]链接。
Utility-Based AI是指一套打分系统,根据游戏世界的信息对行为库[5]打分,然后选出或者组合出[6]一套行为[12]。
Neural Network是指几层神经元,例如经典的三层网络----输入层、隐藏层、输出层,世界信息通过输入层输入Neural Network系统,然后输出层输出一个结果[7]。
上面提到的这些算法有一个共同的好处,能够根据游戏世界的变化带来不确定性。
因为即时战略中的战争部分是最难预测的,玩家可以有无穷无尽的战术变化,所以将军AI需要更加动态来产生更加动态的战术。
然而,这些算法,特别是Nerual Network,它们产生的结果的过程是“黑箱的”----即使是我设计的将军AI,我也不知道它是怎么工作的...游戏设计师可以说失去了掌控权。
不过,有研究表明,神经质AI在即时战略中表现最好[9]....或许,这也是算是 “出其不意”吧...
相反地,士兵AI需要比将军AI更加静态。
如果你把士兵拉到敌人旁边,他却在那边Idle的话...
所以楼上都有提到的有限状态机、行为树等更加静态的算法[10]会更合适,因为游戏设计师可以设计好士兵的行动规则。
例如弓箭手在距离敌人大于XX米的情况下射箭,距离小于X米的时候肉搏,士气低于XX的时候走佬。
如果用Neural Network来实现这些设计的话就会哭笑不得...对的,我就用过Neural Network设计过士兵AI,是我们大学的神经网络的作业...
除了上面的提到的算法,还有另外一些提高游戏性的算法可以采用。
模糊逻辑,Fuzzy Logic,让游戏世界的信息模糊化,带来合理的不确定性。
势力图,Influence Map,让游戏世界的信息可视化或者是规范化,有助于将军AI分析。
随机,Randomization,在适当的时候做出适当的随机选择[13]。
注释或资料来源:
[1]我个人喜欢划分《星际》《红警》《帝国》等游戏为“传统即时战略”,通常都有资源管理和战争两部分组成。区别于塔防、即时战术等即时的策略游戏。
[2][3]资料来源:《中的》第十一章,规则式AI。
[4]也可以是多层,视乎需求而定。
[5]行为库指的是一个很多单元行为的集合。一个例子就是行为树里面的“行为”。
[6]单元行为如果设计得好、相互没有依赖关系得话,它们之间可以相互组合。
[7]“结果”可以是一个行为的代号,也可以是一个权重。
[8]Planner资料来源:
[9]资料来源:
所说,称之为框架会更加合适。
[11] 提到《全面战争》有用到Neural Network,但是我对文章的说的 “Neural Network用在士兵AI上” 表示怀疑,我猜测是用在将军AI上的。
[12]一个利用Utility-Based AI的成功例子
[13]感谢
【kubisoft的回答(5票)】:
当然是状态机,楼上几位已经说得很好了。
我能补充的是:
1. 类似遗传算法这种AI算法都是计算量极大、需要等几小时、几天、几个月才能出结果的算法,而游戏的AI必须在一个tick内迅速作出决定;
2. 重量级的AI算法是解决不知道***的问题用的。对于已知***的问题,当然直接给***就好;
3. 游戏中的AI有两个目标:更像人/更有趣。为了让他更像人,直接采用预定的策略就可以;为了更有趣,加入一些随机因素就成。
【知乎用户的回答(5票)】:
游戏的AI只有一个目的,那就是让玩家玩的爽。
模拟退火,神经网络这些算法不能达成这唯一的要求,所以游戏中一般不会采用。
现在业界用的最多的是行为树,可以简单理解为加强版的状态机。
【承天一的回答(3票)】:
war3里是不可能使用类似“遗传,模拟退火”等学院派算法的,主要还是有限状态机,消息机制,控制行为,群状态控制等,具体到策略上的规则依然是人为设定好的。
推荐的书是游戏ai编程里最经典的教程,你可以去大概翻翻前几章便可以对游戏的ai设计有个基本大致的认识。
【Freelancer的回答(1票)】:
自己可以打开地图的jass脚本去看的,星际里也有script可以看。
War3时代,底层寻路是地图分Tile之后的A *寻路,上层逻辑估计就是FSM有限状态机,经过这些年发展,现在游戏里寻路还是基于导航网格(NavigationMesh)的A*,上层AI很多是Behavior Tree来实现的。
游戏和工程的AI目标完全不同的,游戏的AI是看起来聪明、表现多样;工程上我熟悉的多是为了解决组合爆炸问题,通过AI算法求解。但工程上的AI算法也有各种限制,例如遗传算法的过度收敛、收敛到局部解、神经网络的权重训练出来人不可理解、多少个神经节点能解决特定问题的没有定义,等等等等还有大量问题,这些对于游戏开发这种需要控制开发周期和确定性结果的工程设计都不利啊!所以游戏这种密集开发的软件工程,一是AI不需要这么复杂的算法就能实现,二是AI算法很多不稳定和难理解控制并不适合游戏快速迭***发。
顺带一提,游戏中的AI系统底层A*是图算法,上层Behavior Tree只是个框架,方便逻辑书写的。当然这个世界上也有各种尝试把学院派AI应用在游戏的项目,例如,每年还有AI比赛这是篇伯克利AI的报道,自己当年毕设就通过这平台搞了个星际微操的遗传神经网络玩了玩,满好玩的。
ps:个人感觉很多游戏里的操作集是有限的,游戏AI在工程意义上去拟真玩家是可解的,某种意义上游戏AI是可以率先通过工程手段通过图灵测试。
【黎清水的回答(3票)】:
和传统的的任务思路还是有一定区别的哈 是一些模糊逻辑状态机之类的东西
没有研究过 但是在以前看云风老师的一篇讲游戏中的人工智能和模糊逻辑的博客中推荐的是下面这本书 lz可以看看感受感受?
【leephilip的回答(1票)】:
有人用强化学习来写星际AI,链接:
【HARDCOREGAME的回答(1票)】:
1 请从角色体验和游戏类型考虑AI的复杂度
2 有限状态机适应大多数系统
3 BT可以有效解决分支逻辑的体验表达
4 寻路和群组可能会涉及到A*的算法深入 但还是有替代方案
5 基于目标的AI是一个业界尝试的新思路
6 请制作让玩家觉得有趣“聪明的”AI 不是搞科研
【田彪的回答(0票)】:
估计是状态机,要不太复杂了
【陈金桂的回答(0票)】:
有限状态机可能需要多个,如果只有一个状态机,攻击和移动就互斥了,就不能上下半身分离边打边跑了。我厂工行为树。
【李伟的回答(0票)】:
有限状态机
【钟典的回答(0票)】:
遗传算法?模拟退火算法?如果真的我们要在所有游戏中这样实现游戏ai,那么我们数学系的学生就业就不会那么困难了。
前面已经把这个问题答得很透彻了,有限状态机是最“经济”的解决方法。随之而来的行为树规范了这种方法。这些方面我也不专精,所以就不再赘述。
我只想提一下以前初中的时候很无聊做魔兽地图的时候,有一项就是添加ai。其实魔兽地图编辑器的ai脚本基本上不需要创作者多少编程知识和数学知识,你只需要把什么时候怎么做告诉就好了。
所以游戏ai的难度在于,人要实现预知大体上的所有可能性。
馆藏&68106
TA的推荐TA的最新馆藏
喜欢该文的人也喜欢