当前位置: 首页 > 编程日记 > 正文

游戏AI之初步介绍(0)

目录

  • 游戏AI是什么?
    • 游戏AI和理论AI
    • 智能的假象
    • (更新)游戏AI和机器学习
  • 介绍一些游戏AI
    • 4X游戏AI
    • 《求生之路》系列
    • 角色扮演/沙盒游戏中的NPC
  • 游戏AI 需要学些什么?
    • 自治智能体
    • 群体智能
    • 感知
    • 状态机(重要)
    • 行为树(重要)
    • 寻路/搜索/规划(重要)
    • 黑板
    • 模糊逻辑(不常用)
    • 杂项技巧
    • 脚本驱动(重要)
    • 机器学习(有潜力)
  • 游戏AI 基本设计
    • 感知
    • 决策
    • 行为
    • 小结
  • 参考

游戏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

1409576-20181129113340093-631290847.jpg

《群星》《文明》《王国风云》等为代表的4X游戏,战略游戏的一种,其主要的四个游戏目的分别是:
eXplore(探索),eXpand(扩张),eXploit(掠夺),eXterminate(毁灭)。

为了让玩家在4X进程中受到阻挡,4X游戏AI必须得足够聪明做出决策,
但又同时为了不让玩家觉得无法胜利,它往往不是采用最优策略,而是使用更“人性化”的策略,
(例如反应延迟,走的路径稍微扭曲,模糊决策等做法)。

《求生之路》系列

1409576-20181123114432533-523983455.png

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

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

1409576-20181123114435910-1404177291.png

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


游戏AI 需要学些什么?

下面列出部分游戏AI所需掌握的知识和简要介绍:

自治智能体

智能体,通俗点意思是含有AI的对象物体。这些对象往往拥有自治动作(即什么情况就该做出什么反应)。在《看门狗》《GTA》里,街上走路的人或者开动的汽车,就是一个自治智能体。主角开车如果冲向它们,这些自治智能体能够自行判断并做出躲开的动作。

群体智能

如其名,与自治智能体相对,“群体智能”一般用于编队的AI或者集群的AI。例如足球游戏里,AI操控一方所有球员互相配合传球踢球。又或者射击游戏里,AI操控一支小队通过战术进攻据点。

感知

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

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

状态机(重要)

“状态机”是一种表示状态并控制状态切换的设计模式,常常用于设计某种东西的多个状态。
例如一个人有站立状态,跑动状态,走路状态,蹲下状态,开火状态等...
当应用在游戏AI时,它也可以作为AI的决策结构(以前老游戏的AI决策结构几乎都是采用状态机)。

可参考:游戏设计模式——有限状态机 - KillerAery - 博客园
可参考:游戏AI之决策结构—有限状态机/行为树(2) - KillerAery - 博客园

行为树(重要)

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

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

寻路/搜索/规划(重要)

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

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

“搜索”其实应该跟寻路并在一起,只是游戏AI有可能还会用到图搜索。
在《群星》里,通过一条条“航路”连接千千万万个星球,这时候AI就要每次在决策派遣舰队时,
需要考虑到达这张“图”的各个星球的权值和最优期望。

“规划”则是游戏的预处理,例如提前构建路线,划分区域等,以便游戏进行后利用预先处理好的数据进行高效的算法操作。

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

黑板

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

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

模糊逻辑(不常用)

为了让游戏AI更人性化,模糊逻辑很有必要。做游戏AI往往不是做最优解,而是做像人类的解。
在某些时候,例如:某个AI战斗结束后,判断如果子弹数量少,则回基地取弹药,
“子弹数量少”这个条件就可以做成一种模糊逻辑条件。

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

杂项技巧

这里主要是各种各样的杂项技巧,或者欺骗玩家的障眼法,也是老鸟们所说的“Trick”。
通过“抖动”,"平滑"等技巧可以增强拟人性,让AI愚笨的像个人。

脚本驱动(重要)

使用脚本可以随意编写出逻辑代码而无需再次编译,从而极大减少修改逻辑的成本。
游戏AI的逻辑修改往往很频繁,使用脚本编写AI逻辑无疑是必要的。
此外游戏程序最常用的脚本语言——Lua.

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

机器学习(有潜力)

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

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

但缺点也是有的:

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

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

若对Unity的机器学习插件感兴趣:Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置) - KillerAery - 博客园
Unity 用ml-agents机器学习造个游戏AI吧(2)(入门DEMO) - KillerAery - 博客园


游戏AI 基本设计

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

基于这个便自然而然分出以下三个模块:

  • 感知
  • 决策
  • 行为

感知

一般的游戏AI,首先需要获取到感知的信息。

例如:

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

决策

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

例如:

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

可以把决策模块想象成一个大脑(为了类比,可以把下面的“决策模块”字样看成“大脑”):
决策模块能够获取智能体模型的感知信息,分析之,并返回行动决策。

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

行为

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

//一个智能体类例子
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);
};

小结

这样,一种简单基本的设计就浮现了:

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

初步介绍到此结束,下一篇博文将详细介绍感知。

参考

[1]《游戏人工智能编程案例精粹》

[2] FINNEY的博客 AI分享站


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

转载于:https://www.cnblogs.com/KillerAery/p/10003678.html

相关文章:

Google Adsense实用防踢技巧总结

我们都知道,对个人草根站长来说,Google AdSense是网站收入的主要来源之一,我在这里介绍一些常用的技巧。 希望通过这些技巧能够增加大家的Google AdSense收入,并防止自己的帐号被删除。大家喜欢的话就顶下吧! 广告的位…

PAT(甲级)2018年冬季考试 7-3 Vertex Coloring

1. 起先我的思路是,对于每一种方案,把相同颜色的下标放到一个集合,对于每一个集合判断里面的元素互相之间是否有着邻接关系。有一个用例超时,20/25。 2. 转变思路,对于每一种方案,遍历邻接关系&#xff0c…

蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路

小蚂蚁说:当前,数字化信号已经逐渐深入到社会的每个角落,影响着用户的心智和行为,来到数字化时代门口的银行,需要注意到数字化信号。西安银行通过引入蚂蚁金服移动开发平台mPaaS,对手机银行进行架构升级&am…

(四十七)Quartz2D引擎初步

Quartz2D是跨平台的,同时支持iOS与Mac。 支持圆型裁剪,可以实现圆形头像等功能,也支持手势解锁、折线图等的制作。 对于复杂的UI界面,还可以通过Quartz2D将控件内部的结构画出来,可用于自定义控件。 实际上iOS大部分控…

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT

目录 体会 代码(非满分) 改进 AC代码 体会 这题主要是考察对STL中string,map,vector的应用以及自定义sort()应用。 类型1和2的处理很容易。 类型3要求对于指定date,按照每个考场进行分类,记录不同考场的人数,按照人数非升序&#xff…

DOS、Mac 和 Unix 文件格式+ UltraEdit使用

文件格式 区分DOS、Mac 和 Unix分别对应三种系统从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种文件模式 区分ASCII模式和Binary模式 通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本模式和二进制模式。文本传输器使用…

灰度图像--图像分割 Scharr算子

学习DIP第46天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习…

FileUpload生成图片水印,文字水印(转载)

/** <summary>/// 生成缩略图/// </summary>/// <param name"originalImagePath">源图路径&#xff08;物理路径&#xff09;</param>/// <param name"thumbnailPath">缩略图路径&#xff08;物理路径&#xff09;</para…

1151 LCA in a Binary Tree (含求LCA的通法)

目录 解法一思路 结果 解法一改进 解法一改进结果 ​解法二思路 解法一代码 解法一改进代码 解法二代码(AC) 解法一思路 1. 根据先序和中序建树 2. 对树进行深度优先遍历&#xff0c;找到每一个结点的父节点(注意&#xff1a;由于值的范围是int&#xff0c;直接用可…

cf 414B Mashmokh and ACM 动态规划

题目链接&#xff1a;http://codeforces.com/problemset/problem/414/B dp[i][j]表示长度为i、最后一个数字为j的合法序列总数 dp[1][1...2000]都是1 后面用dp[i-1][j] 去更新 dp[i][j*t] (1 < j*t < 2000) 即用因子去更新它的倍数 表面上看是2000^3的复杂度会爆 其实不用…

解决:angularjs radio默认选中失效问题

添加ng-model后checked"checked"失效&#xff0c;可见angularjs也不好&#xff0c;会失效html标准属性解决&#xff1a;添加ng-checked"1"<input type"radio" ng-model"sel_course" value"1" ng-checked"1" /…

在ireport报错 报 jdk5找不到的解决办法

在ireport安装目录下&#xff0c; etc目录下有ireport.conf&#xff0c; 其中有jkdhome设置&#xff0c; 把前面的#&#xff08;注释&#xff09;去掉&#xff0c; 换成自己的jdk目录就行 双引号不要去掉 jdk地址放在双引号之间 比如 改成 jdkhome"G:/ACD/jdk1.5.0&quo…

如何通过中序和层序序列建立二叉树

有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 7 11 28 8 运行结果 这个过程和建立二叉查找树(BST)的过程是非常相像的&#xff0c;将laSq[laIndex]插入到根为root的子树中&a…

BZOJ 3573 米特运输

Description 米特是D星球上一种非常神秘的物质&#xff0c;蕴含着巨大的能量。在以米特为主要能源的D星上&#xff0c;这种米特能源的运输和储存一直是一个大问题。 D星上有N个城市&#xff0c;我们将其顺序编号为1到N&#xff0c;1号城市为首都。这N个城市由N-1条单向高速通…

[学习笔记]最小割之最小点权覆盖最大点权独立集

最小点权覆盖 给出一个二分图&#xff0c;每个点有一个非负点权要求选出一些点构成一个覆盖&#xff0c;问点权最小是多少 建模&#xff1a; S到左部点&#xff0c;容量为点权 右部点到T&#xff0c;容量为点权 左部点到右部点的边&#xff0c;容量inf 求最小割即可。 证明&…

10分钟学会Google Map API

http://space.itpub.net/14734354/viewspace-374828 前几天玩了玩Google的Map API&#xff0c;感觉还不错&#xff0c;很简单。但凡有过任何编程经验的同学&#xff0c;看完以下的教程&#xff0c;都可以在10分钟内掌握它的主要功能。另外我还做了个简单的小例子&#xff0c;有…

1143 Lowest Common Ancestor(建树与不建两种思路)

目录 解法一 解法二 解法一 这题可以不建树&#xff0c;直接利用BST的性质&#xff1a;左子树<根节点<右子树&#xff0c;对先序序列进行遍历&#xff0c;如果有某个元素大于等于u,v中较小的且小于等于u,v中较大的&#xff0c;则可能是根节点。 这题数据弱&#xff0…

UIScrollView

UIScrollView&#xff08;包括它的子类 UITableView 和 UICollectionView&#xff09;是 iOS 开发中最常用也是最有意思的 UI 组件&#xff0c;大部分 App 的核心界面都是基于三者之一或三者的组合实现。UIScrollView 是 UIKit 中为数不多能响应滑动手势的 view&#xff0c;相比…

MySQL练习题:常用函数

1. 以首字母大写&#xff0c;其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名4. 用#来填充员工职位job的结尾处&#xff0c;按10个字符长度输出。5. 去除字符串 hello world 两边的空格&#xff0c;并将单词间的空格改…

我的WINCE4.2历程(10)

2010-04-02 今天的主要工作&#xff1a; 1&#xff09;RTC4513驱动调试&#xff0c;又做了一些尝试&#xff08;检查GPIO口的第二功能设置是否正常&#xff09;&#xff0c;结果还是不正常&#xff0c;FAINT。 2&#xff09;回顾了截止到目前取得的进展&#xff1a; a&#xff…

1069 The Black Hole of Numbers

注意两点&#xff1a; 1. 不足4位要补足&#xff0c;不仅仅是一开始要考虑&#xff0c;每次得到一个差值&#xff0c;都要考虑 2. 到0也会停下&#xff0c;不仅仅是一开始可能发生&#xff0c;也可能是过程中的某一个差值 另&#xff1a; vector<int> 是可以作为函数…

详解Asp.net MVC DropDownLists

来自网络&#xff1a; Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面面. DropDownList,ComboBox,无论你喜欢怎么称呼这些&#xff0c;他们毫无例外的会被生成…

3D中的OBJ文件格式详解(转载)

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导&#xff0c;也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型&#xff0c;想把它…

比特币测试网络搭建

转自 https://blog.csdn.net/yzpbright/article/details/81004202 比特币 一、安装 Docker 二、安装和运行比特币测试网络(bitcoin-testnet) 1.下载比特币测试网络(bitcoin-testnet)的Docker镜像 docker pull freewil/bitcoin-testnet-box 2.运行Docker镜像 docker run -t -i -…

1136 A Delayed Palindrome 需再做

注意点&#xff1a; 1. 大整数即高精度整数&#xff0c;数据结构bign要会定义 2. 记得写构造函数或者通过别的方式初始化bign 3. len属性记得手动更新 4. int d[maxn]数组是顺位存储&#xff0c;意味着字符串要逆序读入 AC代码 #include<cstdio> #include<iostr…

ES5-Array-push(),pop(),shift(),unshift()

参考文章&#xff1a;push()&#xff0c;pop() push方法用于在数组的末端添加一个或多个元素&#xff0c;并返回添加新元素后的数组长度。 注意&#xff0c;该方法会改变原数组&#xff0c;而不是创建一个新的数组。var arr [];arr.push(1) // 1 arr.push(a) // 2 arr.push(tr…

visual studio 2005 新建C++空项目无法调试的解决方案

(1)项目属性→配置属性→链接器从→调试→生成调试信息→将“否”改为“是(/DEBUG)”。(2)项目属性→配置属性→C/C→调试信息格式→将“禁用”改为“用于编辑并继续的程序数据库(/ZI)”。(3)项目属性→配置属性→C/C→优化→优化→将“最大化速度(/O2)”改为“禁用(/Od)”。转…

jQuery.append()、jQuery.html()存在的XSS漏洞

使用jQuery.append()、jQuery.html()方法时&#xff0c;如果其中内容包含<script>脚本而没有经过任何处理的话&#xff0c;会执行它。 简单的示例代码如下&#xff1a; 1 var xssStr <script>console.log(1)</script>; 2 $(#test).html(xssStr); 控制台会打…

1132 Cut Integer

注意&#xff1a;取余得到的后半段b可能为0&#xff0c;所以要预先判断&#xff0c;否则会出现浮点错误。 写成 if(b!0&&z%(a*b)0)是不能避免浮点错误的&#xff0c;因为z%(a*b)已经发生。需要更换两个条件的位置&#xff0c;把前提放在前面&#xff0c;即 if(b!0&am…

.net之工作流工程展示及代码分享(二)工作流引擎

在介绍完表单类的时候&#xff0c;接下来介绍工作流引擎&#xff0c;主要由四个类组成&#xff0c;分别是流程、流程步骤、流程实例、流程步骤实例类。 流程类&#xff1a; 1 [Serializable]2 public class Flow3 {4 [XmlAttribute]5 public Guid …