游戏AI是什么?


游戏AI和理论AI

但是值得注意的是,但是游戏AI与理论研究的AI那些有所不同。

我们平时所熟悉的人工智能,大多数是指理论AI。(例如深度学习,机器学习)

而游戏AI往往很少应用到理论AI那些神经网络、深度学习等等理论AI所流行的技术。

智能的假象

游戏AI主要是程序员预先定义编写好可能发生的行为,而不具有理论人工智能那种自我“学习”的特性。

因为游戏AI主要职责是模拟出智能行为,而并非学习

(例如:街道上会避让车的人群,天空中乱飞的小鸟,来回巡逻的守卫,兵线上的小兵...)

可以说游戏AI是智能的假象。

要是游戏功能需要自我学习,尽可能做出最优策略,更应该使用理论AI(也是我们熟悉的那个人工智能),通过神经网络,深度学习等流行技术实现。

例如:围棋AI阿法狗,DOTA2的OPENAI

(更新)游戏AI和机器学习

以前觉得机器学习要应用于游戏AI,还远得很。

最近看到一些资料后,也尝试玩了玩Unity机器学习,才发觉机器学习占领游戏AI的可能性和趋势。

这让我对游戏AI和理论AI的看法有了变化,因此下面介绍也会提到机器学习。

因此现在看来,理论AI可以归纳为游戏AI的一部分。游戏AI应该分为人工制作的和机器学习训练的。

介绍一些游戏AI


4X游戏AI

《群星》《文明》《王国风云》等为代表的4X游戏,战略游戏的一种,其主要的四个游戏目的分别是:

eXplore(探索),eXpand(扩张),eXploit(掠夺),eXterminate(毁灭)。

为了让玩家在4X进程中受到阻挡,4X游戏AI必须得足够聪明做出决策,

但又同时为了不让玩家觉得无法胜利,它往往不是采用最优策略,而是使用更“人性化”的策略,

(例如反应延迟,走的路径稍微扭曲,模糊决策等做法)。

《求生之路》系列

作为一款FPS游戏,很难说《求生之路》里的怪物有多智能——它们本来就该是愚蠢而凶猛的。真正有技术含量的是它的“导演系统”,AI Director作为后台的核心,会根据玩家在游戏中的具体表现调控游戏的节奏。怪物出现的地点、数量,何处刷新道具等等,配合上根据形势动态变换的音乐,给了用户更真实的游戏体验。

角色扮演/沙盒游戏中的NPC

在一些自由度较高的游戏中,为了让玩家更好的融入这个世界,游戏会对NPC进行很多详细的设定。比如在《巫师》系列中,每个NPC都有自己的性格设定,包括会话数据库,让他们可以进行丰富的动作和对话。在GTA这种沙盒游戏中更是这样。

游戏AI 基本设计


智能体(Agent)

首先我们得理解一个术语:智能体(Agent)。通俗点意思是一个被AI操控的对象物体。

如果一个智能体拥有自治动作(即自己遇到情况就做出自己的行为反应),那么则称其为:自治智能体。

在《看门狗》《GTA》里,街上走路的人或者开动的汽车,就是一个自治智能体。主角开车如果冲向它们,这些自治智能体能够自行判断并做出躲开的动作。

然后在现实世界里,我们可以这样直观的理解智能:

一个正常的智能体,得先感知到周围的事物,才能思考下一步该做什么,才能做出反应行为。

基于这个直观理解的模型,我们便自然而然分出以下三个模块(事实上也是常用的AI设计方式):

  • 感知模块
  • 决策模块
  • 行为模块

感知(Perception)

一般的游戏AI,智能体所能获取的信息应该总是有限的。

引入“感知”的概念,用以模拟智能体的感官,从而让智能体能获取一定程度的信息,用于之后的决策判断。

例如:

  • 一个NPC的视野范围内看到了有一个丧尸。
  • 一个丧尸听到了玩家的脚步声。
  • 足球队队员之间的传达配合信息。
class AgentPerception {
public:
//进行一次感知探测
void check();
//访问感知目标结果
Information& getCheckResult()const;
private:
//...
};

可参考:游戏AI之感知(1) - KillerAery - 博客园

决策(Decision)

决策模块一般通过分析感知信息,进行计算,输出接下来想要做的行为的结果。

例如:

  • NPC决策模块检查了这个丧尸,判断到它是自己的敌人,所以输出了逃跑的决策。
  • 丧尸决策模块检查了这个玩家,判断到它是自己的敌人,所以输出了扑过去攻击的决策。
  • 中锋决策模块检查了前锋的带球情况,判断到它想传球,所以输出了要去对应的位置接球的决策。

可以把决策模块想象成一个大脑(为了类比,可以把下面的“决策模块”字样看成“大脑”):

决策模块能够获取智能体模型的感知信息,分析之,并返回行动决策。

  class AgentBrain{
public:
//计算得出智能体的决策
Decision caculate(Agent* agent){
//获取感知信息
Information& information = agent->mPerception.getResult(); //根据感知信息,让寄主执行行为
if(information...){
return Decision(MoveTo, ...);//移动到...的决策
}
if(information...){
return Decision(Attack);//攻击决策
}
//....
}
private:
//...
};

行为(Behavior)

一般的游戏模型应该提供相应的行为接口,然后行为模块负责处理决策,执行对应的行为。

//一个智能体类例子
class Agent{
public:
//智能体的各种行为接口
//...
void moveTo(cosnt Vector3& pos);
void attack();
protected:
//智能体的各种变量
//....
Vector3 mPosition; //当前位置
int mAttack; //攻击力
ViewPerception mPerception; //视野感知模块
};
class AgentAction{
public:
//处理决策,让智能体执行对应行为
void doAction(Agent* agent,const Decision& decision);
};

游戏AI 需要学些什么?


因为游戏AI需求多端,博主在查阅多方资料和平时实现时知道的所有可用的基础知识/解决方案/杂项技巧列举出来,当然对于重要的基础知识会mark出来。

有限状态机(FSM)<重要>

“状态机”是一种表示状态并控制状态切换的设计模式,常常用于设计某种东西的多个状态。

例如一个人有站立状态,跑动状态,走路状态,蹲下状态,开火状态等...

当应用在游戏AI时,它也可以作为AI的决策结构(以前老游戏的AI决策结构几乎都是采用状态机)。

可参考:游戏设计模式——有限状态机 - KillerAery - 博客园

行为树(Behavior Tree)<重要>

“行为树”是一种以树状结构表达的决策模式,也是一种设计模式。这也是现代游戏AI最常用的决策结构。

可参考:游戏AI之决策结构—行为树(2) - KillerAery - 博客园

寻路(Path Finding)<重要>

“寻路”是游戏里极为常见的操作,常用的算法有A* 算法,当然更优化的话则是依赖规划网格的寻路。

路径规划(Path Planning) 则是辅助改进寻路的,例如提前构建路线,划分区域等,以便游戏进行后利用预先处理好的数据进行高效的算法操作。

可参考:A*寻路算法 - KillerAery - 博客园

游戏AI之路径规划(3) - KillerAery - 博客园

脚本驱动(Script Driving)

使用脚本可以随意编写出逻辑代码而无需再次编译,从而极大减少修改逻辑的成本。

游戏AI的逻辑修改往往很频繁,使用脚本编写AI逻辑无疑是必要的。

此外游戏程序最常用的脚本语言——Lua.

可参考:C++与Lua交互之配置&交互原理&示例 - KillerAery - 博客园

机器学习(Machine Learning)<有潜力>

机器学习训练出游戏AI的优势在于:

  • 机器学习训练出的游戏AI,模型可能数据庞大,但是这完全可以部署于服务器。
  • 目前绝大部分游戏AI都是人工制作,工作量庞大。机器学习可以解放生产力,放台主机训练让其自己培养出更实的AI。

但缺点也是有的:

  • 过于复杂的环境,或者需要复杂交互的AI几乎很难训练出来(例如开放世界RPG游戏的NPC,它们都得有自己的一套复杂剧本台词和NPC行为)

因此目前看来,机器学习训练出来的AI可用于简单交互的AI,例如看到人就跑的小动物,更复杂的是会遵守交通规则的路人/车辆。

若对Unity的机器学习感兴趣:

群体智能(Group AI)

"智能"表示一个AI,而“群体智能”则表示集群的AI。例如足球游戏里,集群AI操控一方所有球员互相配合传球踢球。又或者射击游戏里,集群AI操控一支小队通过战术进攻据点。

如果对于一个智能体集群情况,使用大量的自治智能体(一个AI控制一个智能体)很容易出现CPU性能瓶颈:因为这些自治智能体互相不可知,需要经过复杂的获取信息阶段,复杂的决策阶段才可做出团队行为。

而集群AI,则可以看成一个AI控制多个智能体,这样集群的信息数据甚至是行为都可以共享,也方便集群AI统一调配管理控制下属各个智能体。

群体智能的一个GDC演讲:GDC2012讲座:《杀手:赦免》中的人群系统

模糊逻辑(Fuzzy Logic)

为了让游戏AI更人性化,模糊逻辑很有必要。做游戏AI往往不是做最优解,而是做像人类的解。

在某些时候,例如:某个AI战斗结束后,判断如果子弹数量少,则回基地取弹药,

“子弹数量少”这个条件就可以做成一种模糊逻辑条件。

可参考:游戏AI之模糊逻辑(4) - KillerAery - 博客园

模糊逻辑的一个扩展是 模糊状态机(FuSM)

传统状态机往往是个确定的状态,例如要么是On状态要么是Off状态。但是通过结合模糊逻辑和状态机,便可以有稍微On的状态、不太Off的状态等更多的选择性,这可以给AI设计师添加更多模糊状态对应的行为,这给游戏添加了更多乐趣:非常害怕时抛下武器逃跑,害怕时带着武器逃跑,有点害怕时且战且退...

黑板(Black Board)

“黑板”简单来说就是多模块间数据共享的数据结构。编写游戏AI引擎时,往往避免不了各模块之间的通信,而使用黑板模式无疑是极好的选择

可参考:游戏设计模式——黑板模式 - KillerAery - 博客园

协程(Coroutine)

协程(也叫微线程),它会在每个时间间隙更新执行一些代码,效果看起来就好像另一个线程在执行一样(但实际是同一个线程)。

游戏AI有大量的关于时间的动作(例如延时2秒执行某某操作),使用协程可以大幅简化一堆Update的计时代码。

Unity协程笔记:Unity C#笔记 协程 - KillerAery - 博客园

杂项技巧(Trick)

通过“抖动”(Dithering),"平滑"等技巧可以增强拟人性,让AI愚笨的像个人。

简单的解释抖动的话,就是说先计算一个最优解(不可战胜的AI),然后给这个最优解做一些随机数的修正,从而偏离最优解(有点难但可战胜的AI)。

资源分配树(Resource Alloction Tree)是一种树状结构,用于表示一个玩家的所有资产类型及其权重。决策时可根据资源分配树各个节点权重来执行不同的分配策略。例如在《文明5》里,各个AI文明有些偏重和平发展政策,有些偏重军事征服政策,有些偏重文化政策...通过不同的资源分配树可以制作特征各不同的AI。

依存图(Dependency Graph)则是一种有向图结构,用于表示不同资产类型的依存性。例如玩家进入中世纪时代才可以建造射箭场,建造了射箭场才可以生产弓兵,因此可以构造出这样一个依存图:中世纪时代->射箭场->弓兵。依存图常常被AI用来规划当前的发展路线,也可以用于推理对方玩家的科技树,从而调整发展策略(例如调整资源分配树权重)。举个例子:例如发现敌方玩家的一个弓兵,那么容易推断敌方玩家已经建造出了射箭场,那么在军事分配上就会偏向发展骑兵,而不是发展步兵(被弓兵克制)。

势力图(Influence Map)是将游戏地图划分网格,每个网格都有一个势力值(实际上也可以有其他数据),该值受周围元素影响。例如足球游戏里,每个球员AI有一张势力图,球和队友会对周围网格造成正值影响,而对手和边界会对周围网格造成负值影响...这样将所有影响元素考虑之后,球员AI会偏向将球踢向/传向势力值最大的网格。

参考


  • [1] 《游戏人工智能编程案例精粹(Programming Game AI by Example)》 Mat Buckland [2012-9]
  • [2] Finney的博客——AI分享站 http://www.aisharing.com/
  • [3] 《游戏编程精粹2(Game Programming Gems 2)》 Mark DeLoura [2001-10]
  • [4] 《游戏编程精粹3(Game Programming Gems 3)》 Dante Treglia [2002-7]
  • [5] 《游戏编程精粹4(Game Programming Gems 4)》 Andrew Kirmse [2005-9]

游戏AI 系列文章:游戏AI - 随笔分类 - KillerAery - 博客园

游戏AI之初步介绍(0)的更多相关文章

  1. Django 小实例S1 简易学生选课管理系统 0 初步介绍与演示

    Django 小实例S1 简易学生选课管理系统 第0章--初步介绍与演示 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 初步介绍 先介绍下这个 ...

  2. Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置)

    前言:以前觉得机器学习要应用于游戏AI,还远得很. 最近看到一些资料后,突发兴致试着玩了玩Unity机器学习,才发觉机器学习占领游戏AI的可能性和趋势. Unity训练可爱柯基犬Puppo 机器学习训 ...

  3. 游戏AI之模糊逻辑(4)

    目录 人类的逻辑 模糊变量 模糊集合 模糊规则 模糊推理 去模糊化 库博方法 结语 if(condition) then dosomething... 这次主要围绕的是游戏AI该如何模仿人类地判断条件 ...

  4. 游戏AI之路径规划(3)

    目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...

  5. 游戏AI之决策结构—有限状态机/行为树(2)

    目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...

  6. 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

  7. 如何建立一个完整的游戏AI

    http://blog.friskit.me/2012/04/how-to-build-a-perfect-game-ai/ 人工智能(Artificial Intelligence)在游戏中使用已经 ...

  8. 实现简易而强大的游戏AI——FSM,有限状态机

    http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏 ...

  9. 对弈类游戏的人工智能(5)--2048游戏AI的解读

    前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对 ...

随机推荐

  1. 判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别

    php函数function_exists (),method_exists() 与is_callable()的区别在哪? 先来讲下后两个:method_exists() 与is_callable(): ...

  2. DX11 Without DirectX SDK--使用Windows SDK来进行开发

    在看龙书(Introduction to 3D Game Programming with Directx 11)的时候,里面所使用的开发工具包为Microsoft DirectX SDK(June ...

  3. 可能是史上最全的机器学习和Python(包括数学)速查表

    新手学习机器学习很难,就是收集资料也很费劲.所幸Robbie Allen从不同来源收集了目前最全的有关机器学习.Python和相关数学知识的速查表大全.强烈建议收藏! 机器学习有很多方面. 当我开始刷 ...

  4. PAT1107:Sum of Number Segments

    1104. Sum of Number Segments (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Pen ...

  5. Myeclipse10.7.1 导出war包报错

    myeclipse10.7.1 导出war问题解决办法myeclipse10破解后,导出war包时报"SECURITY ALERT: INTEGERITY CHECK ERROR" ...

  6. spring cloud中利用sidecar整合异构语言(转)

    用spring cloud sidecar的整合异构语言,以前做过没有做笔记,现在再做由于各种坑又浪费了一天,这里记一下 首先是官网:http://cloud.spring.io/spring-clo ...

  7. SSM-Spring-10:Spring中cglib动态代理

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 何为动态代理,就不扯皮了,上一篇博客刚刚提到,那cglib动态代理又怎么写,我拿个和上个例子相似的案例来写 具 ...

  8. 【手记】小心在where中使用NEWID()的大坑

    这个表达式: --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它东西,但是如果把它用在where里面,就会发生很神奇的事情,比如这个查询: --创建一个只有1列3行的表, ...

  9. CSS+DIV定位分析(relative,absolute,static,fixed)

    在用CSS+DIV进行布局的时候,一直对position的四个属性值relative,absolute,static,fixed分的不是很清楚,以致经常会出现让人很郁闷的结果.今天研究了一下,总算有所 ...

  10. springMVC框架在js中使用window.location.href请求url时IE不兼容问题解决

    是使用springMVC框架时,有时候需要在js中使用window.location.href来请求url,比如下面的路径: window.location.href = 'forecast/down ...