当前课程知识点:游戏程序设计 > 第十五章 《游戏人工智能》 > 15.4 人工智能在游戏制作中的应用领域1 > 15.4 人工智能在游戏制作中的应用领域1
各位同学
刚刚两位老师也已经给大家讲了一下
一些游戏AI的一些综述
以及游戏AI里面
常用的一些算法
然后我这边了
主要针对
棋盘游戏和赛车游戏这两大类游戏
然后给大家讲一些
相关的一些具体的一些做法
首先
我们先讲棋牌游戏
棋牌游戏AI其实大家都比较好
可能日常生活里面可能接触比较多啊
我们看一下
棋牌游戏AI有哪一些
我们其实常见的就是像复杂到围棋
然后慢慢到象棋
以及最简单的像我们的井字棋
这些都是棋盘游戏
然后它特点了
其实就相当于两个人对战
然后我走一步
你走一步
这种是回合制的
然后我们可以看一下
大家都知道 各位同学有没有玩过这个井字游戏
应该都知道怎么玩是吧
OK 我们看一下
以这个井字游戏为例
我们请一位同学可以
讲讲他在这里面去怎么玩的
如果说你作为红方啊
在这面
你作为红方
你下一步你会走到哪里去
要么这位同学
如果是你作为红方的话
你怎么想
内侧中心
走这里是吧OK
那为什你会走这里
你怎么思考的
你应该说你是怎么一步去思考的
你为什么说你
你觉得走这里
你会不会在
在这个过程中
你会不会尝试一下
我在脑海里面先想一下我走这一步的时候
怎么走对方怎么走
假设下一步对啊
对方只要走那的话我就死了
那如果说你走的这一步是吧
你觉得对方会走哪里
走这里是吧OK
为什么你会觉得他走这里
他为什么就不走上面呢
还是假设
就假设他不走那了的
那我下一步走我就赢了
像刚刚那个同学
我们举个例子
我们在这里面这个是
刚刚说的这个过程吗
如果说我们假设我
我走了这一步
那对方有可能就走这里了
然后我就输了
是吧OK
那如果说
同样的道理
我们是不是也可以尝试走这里
然后对方也可以走这里
我也输了了
那
所以说
我们可以我尝试过所有的方法之后
然后发现
只有我走这里的时候
对方下一步
不管他走哪里
他都赢不了我
是吧OK
那我走完了之后
这个时候我们也会想
对方会怎么走
像刚刚的同学说
对方一定会走这里
为什么一定会走这里
他也会想说
如果说他走这里的时候
对方就红色这方走这里
然后他自己就输了
然后他也会去一步步去尝试
这个就是我们平常
下棋的一个思考的过程啊
然后这样的话
其实我们可以想一想
刚刚我们思考的过程
其实就是一棵树状结构
我们可以看一下
对一个棋盘游戏AI来说
我们怎么去建模怎么去思考
我们可以看一下
刚刚我们说的那个过程
其实就是我们游戏
棋盘游戏或说游戏AI里面
常用的一个方法叫博弈树
例如当前是这个状态
我们举个例子
就是这个状态是吧
我们对于我自己来说
我是玩家一
我红色方是吧
我可以选择有很多步可以走
然后我就可以有
我们列举一下这个红色的这一方
它可以有很多步骤
然后我走完之后
我们棋盘已经转化成新的一个状态
然后到了新的状态时候
其实我们也会猜想
玩家二他会怎么走
然后我们可以列出所有的
一步步往下走
然后这样的话
我们不断的往下扩展的话
我们就可以扩充出一个很完整的一个
博弈树
然后这里面其实
我们刚刚也说到啊
说我会输是吧
为什么我会输
其实这个时候我们应该会看到
如果说绿色方填在这里的时候
其实我们会对自己
对这个棋盘的盘面会有个估算
就像我什么情况下我是有优势的
如果说我举个例子
我们下象棋的时候
可能我还没有输
但我们知道
因为如果说象棋的话
它状态空间很大
这种情况下
其我们不一定说
一定可以想到想象的到
我最终的结果
所以说我们会去有个叫
局面评估函数
去评估当前这个盘面
对于我来说他的分数是多少
我举个例子
以红色方为例
像这个盘面是吧
如果说对于我来说
下一步我就可以赢了
所以说我的分数稍微比较高的
如果说
是这种盘面的话
其实就是刚刚这个盘面
对方下一步他就赢了
所以说
对于我来说
我的分数是比较低的
所以说我是一个负的十分
如果说这种牌面红方
我作为红方
我已经赢了
我已经连成三个了
所以说我给它一个很大分数
我输了
我给我一个很底的分数
这个就是一个棋盘的一个评估函数
当我们围棋或说象棋的话
他有各种根据我的当前剩下的棋的数量
以及我当前的
各种还有多少步可以走赢之类的
其实都可以作为我们计算这个评估函数的一个
因子
可以这样说
那我们作为一个棋盘游戏的话
其实我们的目标就是说在这里
在这个博弈树的这么多个分支里面找到
我下一步
在这一步里面我应该选择哪一步
这里面我应该选择哪一步OK
我们看一下
刚刚有说我们会去想我走
我怎么走
以及我会想对方怎么走是吧
OK我们看一下
第一个我们先看一下一层博弈树的时候
我们该如何说游戏很复杂的话
其实博弈树会很深
那我们先看一下一层博弈树的时候
我们会怎么去选择
如果说对于我这个玩家来说
我可以有很多步
然后每一步
的评估函数对于我自己来说
分数分别是六分八分和四分
那这样的话其实很明显
我一定会选择
对于我分数来说
最高的那一步去走
所以说我们可以理解成在这里面
对于我来说
我就是求下面这么多个节点
里面最大的一个节点
就求MAX的节点
对这步来说
然后
如果说我们是两层的博弈树
我们又会怎么去选择了
我们可以看一下
我假设我已经走到这里
我们搜索
搜索这么多层是吧
这层是对于
对方来说
是我的敌方
然后它走了
走完之后
得出来的一个分数
我们注意一下这里面
其实这些分数
都是以我的角度来
以我的角度就说或者说
以红方的角度
对玩家一的角度来评估的
所以说
这些分数如果说越高的话
说明其实对于玩家二来说应该是越差
或者说这分数越低的话
对于我自己来说其实是越有利的
是不是可以理解
这个能理解是吧
OK好
那对于我来说
假设对方
在这个分支里面
他一定会去选择哪一条路
如果说是
对方的话一定会选择我
对于我来说
分数最低的那个路径是吧
所以说一定会他选择在这个路径
所以说在这一个在这一层的时候
其实我们是
求下面所有节点的最小的一个
一个分支
这个可以理解吧
然后如果说
我们可以认为
只要我走这一步
对方一定会走这一步
我走这一步
他一定会走这一步
我走一步
他一定会选择
一分的这个走法
那如果说
这种倒推的话
就变成我去选择
我去选择的时候
我一定会选择我最高的一个分数
所以说我也会去选择这条路径
这个过程就是
这个整个的一个过程
其实就是
棋盘游戏AI里面
最常用的一个叫Minimax的一个算法
其实写起来复杂度并不高啊
我们可以简单回顾一下
在这里面OK
我们求最小节点
然后再上一层
然后求最大节点
然后再上一层求最小节点
然后求最大节点
那这样的话
这个就是
多集成的
那这种情况下我们一定会走这一步
走这一步棋
然后这里面有个很大的问题就在于
我刚刚也说了
我们有一个评估函数
我们评估函数里面其实
像我们刚刚的井字棋的话相对来说
我们好去评估
但是如果说我们是围棋
或者说是象棋的话
我们要计算一个评估函数
可能会很复杂是吧
那我们有没有办法说
去减支
对着这个树来说
我们能不能去减少我们的搜索空间啊
在这里面其实就是有个叫
跟这个Minimax
的一个配套用的
我们叫AIpha-Beta的一个剪枝算法
其实这个算法相对来说
其实也不算复杂
我们可以简单讲一下
这面有几步 第一个
我们是采用深度优先
深度优先搜索的算法
我估计大家学过
算法的话
数据结构算法的话
应该都知道深度优先是吧
我们一棵树里面我们
按深度优先搜索的话
就先一个节点走到最下面
然后每个节点
初始化一个值叫
α和β
这两个值一个是最
一个是无穷小一个无穷大
如果说在Max节点里面
我们只能改AIpha值
如果说在Max的节点的时候
我们只能修改β值
如果当且仅当这个条件满足的时候
我们才往下计算
怎么理解呢
我们可以看一下
在这个过程中
我们
刚上一步
我们初始化完了之后
因为这个节点是最小的节点
我对于这个节点来说只能修改β是吧
所以说
在这个地方
我根据它的值来修改β
我们看一下
所以说我们就把β
改到这里来
3改到这里来
这个β
然后我们看一下
α是不是小于β
你如果是小于β的话
我们才计算另外一个分支
就这个分支
满足条件
我们看
我们继续算
然后但是17
是比β还要大的
所以说我们这种情况下我们不改这个β
这种情况下
我们继续往上走
然后往上走的话
你们看一下这个Max节点
我们只能修改α
所以说
这种情况下
我们把这个3往上传递
然后改了α值
因为我们在这个地方只能改
Max的是吧
然后满不满足
刚刚那个条件啊
α小于β
OK没问题
我们继续往下走
然后在这一步
到了2然后我们看一下2
然后往回缩
然后2的话要改只能改β
在这面只能改β
以后变成3和2 这种情况下
我们看一下α是不是小于β
其实已经不满足条件了
这种情况下的话
我们就可以把这个分支剪掉
就是这个过程
我们有兴趣的同学可以后面
课后慢慢去研究一下
我们可以看一下整个过程啊
整个过程的话
我们可以看一下
一路计算的话
我们可以看一下
在这里面的时候也是满足
刚刚那个条件
就是不满足α小于β
所以说我们后面的这个分支
这个分支这三个盘面
我们就可以不用计算了
我们可以看一下
总共下来
这里面我们可以减到了
我们这种情况下的话
我们只需要评估123456
6个牌面
然后原来这里我们可以看一下
有很多个牌面
我们要算
所以说这个就是一个α和β的一个减枝
可以减少我们的计算
好我们再扩充一下
刚刚
我们说到
博弈树我们博弈树的时候
其实我是需要我走一步
对方走一步
但是在围棋里面
我们会发现围棋的状态空间非常大
我们都知道我们为啥
AIpha Go是吧
我们都知道AIpha Go
为什么最近才会被做出来
会用深度强化学习来做
以前围棋的AI是怎么做的
其实以前围棋的AI也是用刚刚说的博弈树
但是呢
这里面有个很大问题
就是我们围棋AI里面的状态空间太大了
我们没办法
整棵树遍历下来
但是写评估函数又很难写
因为评估函数我们
其实做过围棋的人或者下过围棋的人
可能都知道
这个评估函数很难写
我很难去评估
这个盘面的分数应该给他多少值
所以说你评估函数不准的时候
你用刚刚的那些Minimax算法
其实是没有效的
那这里面我们怎么去做呢
这里面啊
就是讲到一个叫蒙特卡洛树
搜索的一个方案
首先给大家讲一下
什么叫蒙特卡洛
其实学过概率论
一定知道
我们通俗一点的说法就是大数原理
就相当于我抛个硬币是吧
正面和反面
我只要抛的次数足够多的话
正面和反面的那个比例一定是接近一比一的
我举个例子
我们怎么去求这个π是吧
圆周率怎么求呢
我假设我有个方的盒子
然后随机丢很多豆子进去
然后看一下
它落到红色区域就是一个四分之一圆
然后蓝色区域就是圆的外面
然后我们看一下
根据比例的话
我们就可以算出
就落在红色里面的豆子
和蓝色里面的豆子的比例其实我们
是可以求算出来
这个排的值得
它原理就是通过叫蒙特卡洛的算法
对其实就是我们平常说的叫大数原理
然后怎么去用这个方案呢
我们看一下
当我们假设我们
这个就是我们刚刚说的这个博弈树
当我走到这一步的时候
我要去估算这个盘面
假设这一步啊
我要去估算这个节点的盘面的时候
我们刚刚说的方式
可能就把这个盘面是吧
这个数组
我们怎么去建模的
把整个图像
或者说把这个数组丢到一个函数里面
然后它得出一个分数给我
但是这个我们刚也说了围棋的话
可能这样做是行不通的
对那怎么做呢
我们就以这个节点往下走
我假设他往下
我随机让他随即走
我让他随机走
走到底
不管他用任何方法就是
白棋和黑棋随机走
我都是记筛子
然后让他随机走
走到最后
我看他随机的情况下
这一盘是红方赢是白棋赢还是黑棋赢
然后我让他们
在这一个下面随机走
一万局
我让他走一万局
我就看这一万局里面
我们都是随机的
没有人去管他
都是完完全全随机的情况下
我们看一下
对于我来说
黑棋来说
我赢了多少局
假设一万局里面我赢了
我赢了九万局
然后对方赢了
就一万局里面我赢了九千局
他赢了一千局是吧
那这样的话
我就可以认为
这个盘面对于我来说
我可以给他估的一个分数叫
零点九
就我赢的概率叫90%
对用这样的一个方法来去减少
我们对围棋或说盘面的一个搜索的一个
盘面的一个估算函数的一个计算
这个方案大家了解吗
有什么疑问吗
OK
或者说整个棋盘游戏AI里面
我们主要方法我讲了
大家有没有什么疑问
OK那我们继续
接下来我们讲赛车游戏
各位同学有没有玩过
我们这款游戏就我们公司的啊
QQ飞车
有没有同学玩过QQ飞车手游
玩过是吧OK
你玩过的话
你有没有发现里面
你如果说让你去做一个AI的话
让你去做一个AI
去玩这个游戏的时候
你觉得应该要怎么做
我们
我们假设我们看一下一个赛车游戏
我们怎么去建模啊
首先
第一个我们做一个游戏的第一步
做一个游戏AI的时候
我们得想想它怎么建模
刚刚说
我们假设这个车是吧
然后这里面就是一个中间
这里就是我假设这是一条轨迹线
或说叫赛道的中线
我们就认为赛道的中线
我去往前采样一个点
这个我假设就是虚拟成我的一个目标点
然后我
车头和这个目标点
形成了一个夹角
如果说最简单的一个模型
是不是可以这样做
我车来到这里的时候
当我的这个夹角往右偏了多少度的时候
我就应该按右键
-1. 1什么是游戏(上)
--选择题
-1.2 什么是游戏(下)
--选择题
-1.3 游戏是如何开发出来的
-1.4 游戏引擎(上)
-1.5 游戏引擎(下)
--单选题
-1.6 如何成为一个游戏开发者
--多选题
-2.1 什么是游戏服务器
--单选题
-2.2 游戏服务器的和分类发展
--单选题
-2.3 核心技术和实现难点
--单选题
-2.4 设计原理与方法论
--单选题
-3.1 三维坐标系统
--多选题
-3.2 向量与运算
--单选题
-3.3 矩阵与线性变换
--双选题
-3.4 四元数
--3.4 四元数
--多选题
-4.1 游戏循环概述(上)
--多选题
-4.2 游戏循环概述(下)
--单选题
-4.3 《无尽之路》的实现
--单选题
-4.4 支撑游戏的功能
--选择题
-4.5 支撑游戏的机制与系统
--多选题
-5.1 基本介绍
--5.1 基本介绍
--单选题
-5.2 随机数生成器
--单选题
-5.3 随机数分布与应用
--单选题
-6.1 什么是游戏玩法开发
--单选题
-6.2 建立愿景 Vision
--单选题
-6.3 划定边界 Scope
-6.4 迭代 Iteration
--单选题
-6.5 迭代 Iteration+抛光Polish
--单选题
-7.1实时图形渲染管道 宏观渲染系统
--单选题
-7.2实时图形渲染管道 应用阶段
--单选题
-7.3实时图形渲染管道 几何阶段
--单选题
-7.4实时图形渲染管道 光栅化阶段
--单选题
-7.5实时图形渲染管道 总结 参考
-8.1 物理回顾1
--单选题
-8.2 物理回顾2
--单选题
-8.3 材质 1
--8.3 材质 1
-8.4 材质 2
--8.4 材质 2
-8.5 材质3
--8.5 材质3
-8.6局部光照
--8.6局部光照
--单选题
-8.7 全局光照
--8.7 全局光照
--单选题
-9.1 动画介绍
--9.1 动画介绍
--多选题
-9.2 游戏动画介绍
-9.3 动画技术类型
--多选题
-9.4 骨骼蒙皮动画
--多选题
-9.5 动画流水线
--多选题
-9.6 动画前沿趋势
--多选题
-10.1 .基本概念
--多选题
-10.2 设计目标
--多选题
-10.3 传输数据分析
--多选题
-10.4 常用同步方案 1
-10.4 常用同步方案 2
-10.4 常用同步方案 3
-10.4 常用同步方案 4
--多选题
-10.5 方案对比
--多选题
-11.1 基本图元
--单选题
-11.2 图元距离(上)
--单选题
-11.2 图元距离(下)
--单选题
-11.3 图元相交测试+ 其他几何方法
--单选题
-12.1 著名物理引擎介绍
--单选题
-12.2 物理引擎原理(上)
--单选题
-12.3 物理引擎原理(下)
--单选题
-12.4 游戏中的物理体
--单选题
-12.5 物理引擎使用入门
--单选题
-13.1开发语言
--13.1开发语言
--单选题
-13.2 开发环境
--单选题
-13.3 腾讯开发组件介绍
--单选题
-13.4 网络通信+业务框架介绍
--多选题
-14.1 进程间通信(上)
-14.2 进程间通信(下)
-14.3 通信格式
-14.4 并发模型
-14.5 超时处理
-14.6 大系统小做(上)
--多选题
-14.7 大系统小做(下)
-14.8 架构层面的技术支持(上)
--单选题
-14.9 架构层面的技术支持(下)
-14.10 分布系统的关键能力
--多选题
-15.1 游戏人工智能综述
-15.2 人工智能在游戏中主要方法 上
--多选题
-15.3人工智能在游戏中主要方法 (下)
-15.4 人工智能在游戏制作中的应用领域1
--多选题
-15.5 人工智能在游戏制作中的应用领域2
-15.6 人工智能在游戏制作中的应用领域3
--多选题
-15.7 人工智能在游戏运营中的应用实践(上)
-15.8 人工智能在游戏运营中的应用实践(下)
--多选题
-16.1 游戏支撑系统(1)
--单选题
-16.2 游戏支撑系统(2)
--单选题
-16.3 游戏支撑系统(3)
--单选题
-16.4 游戏支撑系统(4)
--单选题
-16.5 游戏支撑系统(5)
-17.1 游戏逻辑服务器(上)
--单选题
-17.1 游戏逻辑服务器(下)
-17.2 外挂与反外挂(上)
-17.2 外挂与反外挂(下)
--多选题
-18.1运行环境
--18.1运行环境
--多选题
-18.2物理部署
--18.2物理部署
--多选题
-18.3系统的可运维性
--多选题
-18.4运维案列分析
--多选题