游戏AI之初步介绍(0)
游戏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:
//...
};
决策(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决策结构几乎都是采用状态机)。
行为树(Behavior Tree)<重要>
“行为树”是一种以树状结构表达的决策模式,也是一种设计模式。这也是现代游戏AI最常用的决策结构。
寻路(Path Finding)<重要>
“寻路”是游戏里极为常见的操作,常用的算法有A* 算法,当然更优化的话则是依赖规划网格的寻路。
路径规划(Path Planning) 则是辅助改进寻路的,例如提前构建路线,划分区域等,以便游戏进行后利用预先处理好的数据进行高效的算法操作。
可参考:A*寻路算法 - KillerAery - 博客园
游戏AI之路径规划(3) - KillerAery - 博客园
脚本驱动(Script Driving)
使用脚本可以随意编写出逻辑代码而无需再次编译,从而极大减少修改逻辑的成本。
游戏AI的逻辑修改往往很频繁,使用脚本编写AI逻辑无疑是必要的。
此外游戏程序最常用的脚本语言——Lua.
机器学习(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战斗结束后,判断如果子弹数量少,则回基地取弹药,
“子弹数量少”这个条件就可以做成一种模糊逻辑条件。
模糊逻辑的一个扩展是 模糊状态机(FuSM)
传统状态机往往是个确定的状态,例如要么是On状态要么是Off状态。但是通过结合模糊逻辑和状态机,便可以有稍微On的状态、不太Off的状态等更多的选择性,这可以给AI设计师添加更多模糊状态对应的行为,这给游戏添加了更多乐趣:非常害怕时抛下武器逃跑,害怕时带着武器逃跑,有点害怕时且战且退...
黑板(Black Board)
“黑板”简单来说就是多模块间数据共享的数据结构。编写游戏AI引擎时,往往避免不了各模块之间的通信,而使用黑板模式无疑是极好的选择
协程(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)的更多相关文章
- Django 小实例S1 简易学生选课管理系统 0 初步介绍与演示
Django 小实例S1 简易学生选课管理系统 第0章--初步介绍与演示 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 初步介绍 先介绍下这个 ...
- Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置)
前言:以前觉得机器学习要应用于游戏AI,还远得很. 最近看到一些资料后,突发兴致试着玩了玩Unity机器学习,才发觉机器学习占领游戏AI的可能性和趋势. Unity训练可爱柯基犬Puppo 机器学习训 ...
- 游戏AI之模糊逻辑(4)
目录 人类的逻辑 模糊变量 模糊集合 模糊规则 模糊推理 去模糊化 库博方法 结语 if(condition) then dosomething... 这次主要围绕的是游戏AI该如何模仿人类地判断条件 ...
- 游戏AI之路径规划(3)
目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...
- 游戏AI之决策结构—有限状态机/行为树(2)
目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...
- 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...
- 如何建立一个完整的游戏AI
http://blog.friskit.me/2012/04/how-to-build-a-perfect-game-ai/ 人工智能(Artificial Intelligence)在游戏中使用已经 ...
- 实现简易而强大的游戏AI——FSM,有限状态机
http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏 ...
- 对弈类游戏的人工智能(5)--2048游戏AI的解读
前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对 ...
随机推荐
- 判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别
php函数function_exists (),method_exists() 与is_callable()的区别在哪? 先来讲下后两个:method_exists() 与is_callable(): ...
- DX11 Without DirectX SDK--使用Windows SDK来进行开发
在看龙书(Introduction to 3D Game Programming with Directx 11)的时候,里面所使用的开发工具包为Microsoft DirectX SDK(June ...
- 可能是史上最全的机器学习和Python(包括数学)速查表
新手学习机器学习很难,就是收集资料也很费劲.所幸Robbie Allen从不同来源收集了目前最全的有关机器学习.Python和相关数学知识的速查表大全.强烈建议收藏! 机器学习有很多方面. 当我开始刷 ...
- PAT1107:Sum of Number Segments
1104. Sum of Number Segments (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Pen ...
- Myeclipse10.7.1 导出war包报错
myeclipse10.7.1 导出war问题解决办法myeclipse10破解后,导出war包时报"SECURITY ALERT: INTEGERITY CHECK ERROR" ...
- spring cloud中利用sidecar整合异构语言(转)
用spring cloud sidecar的整合异构语言,以前做过没有做笔记,现在再做由于各种坑又浪费了一天,这里记一下 首先是官网:http://cloud.spring.io/spring-clo ...
- SSM-Spring-10:Spring中cglib动态代理
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 何为动态代理,就不扯皮了,上一篇博客刚刚提到,那cglib动态代理又怎么写,我拿个和上个例子相似的案例来写 具 ...
- 【手记】小心在where中使用NEWID()的大坑
这个表达式: --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它东西,但是如果把它用在where里面,就会发生很神奇的事情,比如这个查询: --创建一个只有1列3行的表, ...
- CSS+DIV定位分析(relative,absolute,static,fixed)
在用CSS+DIV进行布局的时候,一直对position的四个属性值relative,absolute,static,fixed分的不是很清楚,以致经常会出现让人很郁闷的结果.今天研究了一下,总算有所 ...
- springMVC框架在js中使用window.location.href请求url时IE不兼容问题解决
是使用springMVC框架时,有时候需要在js中使用window.location.href来请求url,比如下面的路径: window.location.href = 'forecast/down ...