目录
-
- 创建影响力地图
- 策略评估技术
- 有关态度的一切:为意见、声望和NPC个性构建单元
- 个人观点
一、创建影响力地图
前言
本节和下一节将介绍这样的一些技术:让AI主体能够从战术和战略的角度深入了解游戏世界中的角色和当前的游戏状态,还将讨论与不同的游戏类型和虚拟环境相关的技术。
影响力地图
影响力地图是AI主体关于游戏世界知识的空间表示,让计算机玩家能够根据游戏环境的物理/地理表示获悉当前游戏状态的战术视图。影响力地图的结构还使得根据环境中不同位置的特征做出智能的推断成为可能。
并不存在惟一标准的创建影响力地图的算法,创建和应用影响力地图的方式在很大程度上取决于游戏的战略和战术需求以及AI主体所在的游戏世界的设计。
一个简单的影响力地图
影响力地图几乎可用于任何类型的游戏世界地形中——方形网格、六角形网格和三维环境。本节假设为2D网格,我们首先将游戏世界划分为一系列的方形单元格。根据需要初始化单元格的初始值,给单元格加上某种类型的“影响力”,如“战力影响力”。每个友军个体加上一个正值,敌军则为负值。接下来将每个单元格影响力扩散到邻近单元格,这样层层扩散直到没有影响力为止,全部单元格影响力扩散后最终的影响力地图就是我们需要的,AI将根据这张影响力地图进行决策选择(如影响力大于1的数说明我军优势大于敌军,AI选择将边界向前推进进攻;影响力小于1的,说明敌军优势大,则AI会选择收缩边界,增强优势权重)。以上就是一个简单的影响力地图,接下来会介绍稍复杂的影响力地图逻辑。
影响力地图中的单元格数据
实际游戏中的影响力地图要复杂多了,每个单元格都存储一些关于游戏世界的数据,实际上,每个单元格都是一个小型数据库,其中存储了位于该单元格的所有个体和资源的相关数据。以下是单元格通常包含的一些统计数据类型:
战斗力:单元格当前个体的战斗力(攻击、攻击范围、活力、海军、空军、步兵、骑兵等);
易被攻击的资产:单元格中玩家当前资产的估算值(如兵营、资源采集器等);
区域可见性:一个数字,指多长时间以来,该地区对玩家一致是可见或不可见的(如许多游戏中的战争迷雾);
尸体数:单元格内多少个体死亡及其死亡时间;
资源:待采集的各种资源(如木材、游戏货币资源);
通行性:通过该单元格的难易程度(这个值用于更准确地将单元格的影响力传播到其他单元格,分别存储8个通行性值,每个对应一个离开该单元格的方向)。
影响力地图通常分别跟踪游戏中每个玩家的这些变量——简而言之就是维护多个并行的影响力地图。需要注意的是,当AI玩家过多时(超过3~4个),性能将难以控制。
当然也可以只为玩家维护一个影响力地图,并允许所有AI玩家访问它。在有隐藏地图或战争迷雾的游戏中,会构成AI的“作弊”行为,在某些情况下会导致次优的行为。
计算合意值
与其直接将单元格的基本统计数据作为决策的根据,不如将它们合并为一个“合意值”。这是一个通过计算得到的值,它指出了单元格对特定决策的合意程度。通过比较不同单元格的合意值,可以确定对某种任务而言,哪些单元格比其他单元格更合适。
最有用的计算公式是简单的加权和。根据要作的决策,选择每个单元格中与之相关的变量,并根据每个变量对决策的影响程度乘以一个相应的系数,然后将乘积相加得到合意值。
计算不同的合意值时,具体选择的参数很大程度上取决于游戏的需求和游戏设计的独特特征。系数的选择也是主观的,必须仔细调整才能够获得最佳结果。模拟退火或竞争进化方法是可行的,但可能不可取。注意:可能需要对用于统计数据的不同度量单位(如个体生命值、火力等)进行补偿。以下是一些合意值:
攻击和防御愿望:我们通常可以分别计算玩家及其敌人的“脆弱分数”。敌人的脆弱分数高表明我们可以轻松地破坏该地区的资产,因此考虑攻击该单元格中的敌人;AI玩家的脆弱分数高表明我们在该单元格中有重要的资产,易被攻击,需要保护它们。通常,有很多资产和重要资源但附近的守军很少的区域脆弱;
探索:对于使用隐藏地图或FOW的策略游戏而言,AI玩家将派遣侦查员以刷新战场视图。一种不错的探索方法:优先探索不可见但时间最长的影响力地图单元格。进行这种决策时,其他重要的因素有单元格中的敌军影响力和区域的通行性。
防御资产的位置:不能移动的防御资产应部署在脆弱资产附近;关隘是部署防御资产的好地方。通过预先计算通行性值,可以确定影响力地图上的地形关隘点;关隘点是影响力地图中与其他高通行性区域相连但周围是通行性低单元格的高通行性单元格。
资源采集资产位置;
设备生产资产位置;
脆弱资产位置;
确定最佳单元格大小
影响力地图的单元格大小可以是任意的。但单元格太大,则影响力地图将难以识别诸如地形关隘点等小型要素;单元格太小,则难以控制,导致大量重复计算、内存。
在实践中,最好适当地设置单元格大小,建议单元格的宽、高设置为刚好容纳10~20个标准“个体”并肩排列,然后仔细调整单元格大小以获得最佳效果。
可能的问题:如果个体跨越两个影响力地图单元格,将可能导致不同的结果。如果采用影响力传播,这就不是什么问题了。一种不错的解决方式:定期地(可能是每次计算影响力地图)调整整个影响力地图的空间偏移量,使用随机或周期的偏移值。类似海洋中飘动的渔网,由海浪的冲击前后移动。
影响力传播
计算影响力地图中每个单元格的初始值后,需要将每个单元格的值传播到附近的单元格。这一过程被称为修匀或模糊化。
传播只不过是使用“衰减规则”将每个单元格的影响力扩散到邻近单元格。衰减规则决定了给定单元格的影响力在地图上扩散时,将如何随距离的增大而降低。选择何种衰减规则有一定的主观性——需要进行调整以获得最佳结果。
指数衰减最有用:选择0~1的衰减常数(通常为0.6~0.8),然后每次将影响力扩散到邻近单元格时,将该常数作为乘数。假设衰减常数为0.75(75%),则邻近单元格值为原值75%;与之相距一个单元格的值为原值的56%(0.75 * 0.75),以此类推。衰减常数必须与单元格大小相称:要将影响力传播相同的距离,则单元格越小,需要的衰减值越大。
其他有用的衰减规则有线性衰减(每次扩散到邻近单元格时,影响力减小固定值)和高斯过滤器。
注:传播的影响力可能永不为0(使用浮点数)。这意味每个单元格都将其影响力扩散到所有单元格。最简单的解决方案是,当影响力值小到一定程度(修匀后的影响力太小,不会带来任何差别)时,终止传播。终止常数最好通过实验确定。此外,让影响力传播相当大的距离通常是个不错的主意。
还有另一种影响力传播技术,它是基于四叉树。所有单元格的值都沿四叉树传递到上层,这样可使高层的四叉树单元格来获取其子单元格的大概“修匀”值。不幸的是,这种方法以随意的方式传播单元格影响力,传播距离与四叉树的结构密切相关,同时影响力沿某些方向的传播距离可能比其他方向远的多。这种技术的灵活性和准确性都较低。
考虑地形
要考虑地形对影响力地图的影响。最简单的方式是使用预先计算的每个单元格的通行性值(离开单元格的方向,如果无法通行则取消该方向的影响力传播),将其作为衰减值乘数,然后以类似于宽度优先搜索算法或淹没填充(flood-fill)算法的方式将影响力从单元格传播出去。
另一种技术是需要预先计算邻近单元格之间的所有可能。对于每个单元格,在地图预处理期间执行寻径步骤,计算从该单元格到附近所有单元格的最短路径(如果最短路径小于最大路径距离)。然后将计算得到的每个目标单元格的距离存储起来,作为传播影响力时到目标单元格的实际距离。若没得到目标单元格路径,则认为影响力无法传播到该单元格。
优点:提供准确地影响力传播。
缺点:难以应用到动态环境中(如果游戏世界允许环境变化如建造、破坏),预先计算的传播值就不再是真实情况了。其次这种方法需要大量的预处理时间。
特别考虑
地形的影响随军种而异,每个影响力地图单元格必须分别计算不同的军种,并根据地形以不同的方式传播它们的值。如海军的影响力只在水上传播,山脉不能阻止空军前行。
其次,有些军种火力范围很远,则在它可以移动到的任何位置,其火力范围也应与此相同。要针对每个影响力单元格考虑这一点,一种不错的方式:按火力范围分别跟踪远程打击个体(可能按影响力单元格宽度的倍数进行分类)。通过传播扩散这些远程打击类别的影响力,然后将其影响力从受影响力的每个单元格再扩散N个单元格,且影响力值保持不变。这样战舰便能打击远离海滨的内陆地区,虽然它无法登陆。
根据未来的位置而不是当前位置将移动装置添加到地图中将使影响力地图更加准确。简单的方法是推测法——根据速度向量预测5~10秒后的位置。
刷新影响力地图
一种为定期地重新计算整个影响力地图(也许每隔1~10秒)。注:快速刷新可能并不会使AI更有效。
另一种是按需刷新——延迟计算技术。仅当给定的单元格被查询时才计算其中的值——搜索、计算该单元格最大距离范围内所有单元格。这种方法更灵活其次可以在查询时指定传播参数和合意值。
3D环境的影响力地图
将2D网格用于创建3D影响力将不能准确反映游戏环境地貌。不过3D环境的AI寻径通常是基于一种导航网。导航网由一系列互联的凸多边形组成,它描绘角色在游戏世界的哪些地方可以移动。我们可以将导航网的每个多边形作为一个影响力地图单元格。多边形之间的连接描述了影响力的传播途径。影响力将随其沿每个网节点传输(通行性值)的距离而降低。
二、策略评估技术
前言
上一节介绍了如何创建影响力地图,提供了一种地理级战术评估方式。本节将介绍一套对策略决策很有帮助的技术,为AI主体或玩家提供了在战略和功能级对游戏的当前状态进行评估的方式。这些技术适合于涉及到经济管理、资源分配决策和技术进步等游戏。
资源分配树
资源分配书是一种树结构,表示玩家控制的所有资产的特定用途。这种树以层次结构的方式,按功能对当前所有的个体和资源进行分类。
这种表示法的用途在于,它让AI玩家能够对游戏中所有玩家的战略优点和弱点进行评估,还为各种经济生产和资源分配决策提供了很好的基础。
树的最顶端是根节点,表示玩家的所有资产。根节点的下面是游戏中可用资产的主要类别,如下图所示。
和影响力地图一样,AI玩家也应针对游戏中的每个玩家,维护一个这种数据结构的实例。其他玩家的图形表示当前玩家对每个玩家的策略资产的了解情况和功能划分的估算。
资源分配图
在任何给定时刻,AI玩家通常只给给定个体指定一种功能决策,因此建议根据个体当前的职业对其进行分类。
注意,在任何时刻,资源分配数都只包含我实际拥有或能生产的资产。
计算希望的资源分配
资源分配树结构提供了一种简答、自然的确定合适资源分配的方式。可以从树根开始依次向下进行处理,给树中的每个节点指定优先级。
首先,将根节点的值指定为1.0,这表明希望的资源分配比例为100%。在每个节点,将其当前值按一定比例分配给各个子节点。沿树向下不断重复这一过程,为每个树节点指定“希望的分配”值。
划分每个节点值的算法取决于游戏的设计。为响应游戏世界的状态变化,每个非叶节点都必须有定制的逻辑代码,以不断更新其值在子节点之间的分配。这需要不断进行调整,以获得最佳结果。
判断当前的分配情况
同时,我们可以使用资源分配树来计算每个节点的当前分配值。这让我们能够将实际拥有的资产进行划分。
这种计算的方向相反——从最下面开始,沿树向上到达根节点。例如,我们遍历当前负责防御的每个长矛兵,计算它的估算值(如长矛兵防御力和生命值相乘)。然后将这些长矛兵得分相加,将结果作为防御下面的“长矛兵”节点的当前分配值。接下来,将这个值向上传递给父节点“军事”,后者将其从子节点那里收到的所有数字相加,并将结果传递给父节点。最后,根节点接收所有子节点输入,并相加得到一个很大的浮点数,这个数指出我们当前所拥有的所有资产。
计算出总资产值后,便可以将各个节点的值重新规格化到0~1之间:再次访问数中的每个节点,将其“当前分配”值除以根节点的值。
至此,我们可以直接将每个树节点的当前分配值同期望的分配值进行比较,以判断超出(或少于)预算多少。
策略决策
最终的分配树表示提供了一种优秀的、维护军力平衡的方式。如果在一场战役中失去了20个长矛兵,则“长矛兵”节点及其所有父节点的分配值将小于希望的分配值。当然这不意味一定要用新的长矛兵来替换。当“长矛兵”节点的父节点获得填充新的子节点所需的资源后,它可能认为最佳的措施是生产一队骑士营,因为现在已获得了生产骑士的技术,并将其加入了分配树中。
资源分配树主要用于判断制造什么样的新设备以及如何给已有的设备指定合适的角色。首先是需要找到哪些迫切需要增加资源的节点,然后确定为解决这种问题,是对已有的个体重新布防合适还是生产新个体合适(将其他节点下的个体移到该节点下或者新生产个体添加到该节点下)。
资源分配树还为设计独特的玩家个性提供了很好的途径。只要调整资源分配树中对应的部分的系数,以侧重或冷落特定的节点。通过稍微调整资源分配树的不同部分,可使AI玩家侧重于某种个体,在经济增长和国防之间取得不同的平衡,喜好特定的战略资产类别,甚至改变AI玩家的风格。
当关心的是战斗时,维护一个预先计算的“战斗平衡表”(其中包含个体的相对强弱),并将其作用于资源分配树的“军事”分支的决策。这是一个2D查找表,让AI能判断任何个体同其他个体战斗的效果(比如重甲兵克制轻甲兵,长矛兵克制轻骑兵)。通过分析表示对特定敌人的了解情况的功能资产数,可以直到敌人军力组成情况,并重点生产能最有效打击敌人的资产。
资源分配树适合存储其他的各类统计局数据。可在影响力地图单元格中存储的几种因素也可在功能资产树节点中存储。
另外,记录数中的哪些节点被证明是有效地以及哪些节点遭到敌人的攻击也是一个不错的注意。前者让我直到长矛兵对付另一个玩家很有效,因此将分配更多资源到长矛兵;后者让我直到敌人倾向攻击我的哪些资源,以后会采取更多保护措施。
值的估量
找出合适方式来估量每个个体在其特定树分支的值是面临的最大挑战。每个节点的数值必须与其分支中所有其他个体的值相称。“军事”分支表示个体对战斗的贡献,需要考虑攻击力、移动速度等。“资源采集”节点应考虑资源采集速度、以及可能存在的移动速度......要找到关联这些值的合适方式,需要进行试验以获得对您游戏而言最佳解决方案。
另一个可能的挑战是处理多种资源的经济体系(生产不同个体需要耗费不同数量不同类型的资源)。
依存图
依存图是一种数据结构,指出了游戏中不同资产类型之间的所有依存性。依存图包含所有基于依存的关系,如游戏的“技术树”、“建造树”。
主要的依存类型是创建依存。它指出了要建造特定的资产必须满足的一些条件。下图是一个小型的依存图,其中只包含了创建依存:
依存图
创建依存还可以包含资源依存和其他更抽象的依存:支持依存。如兵工厂需要黄金和木材,而黄金、木材来自农民的劳动;魔法师需要神力,而神力只能来自神殿。缺少神殿,魔法师将无法制造符咒。
和前面讨论的数据结构一样,AI玩家应维护多个并行的依存图,自己和其他玩家各一个。
依存图节点
依存图中的一个节点通常包含多种不同类型的数据。其中有用的类别有:玩家当前拥有的某种类型的个体总数、这些个体的总估算值以及当前正在生产的这种个体的总数。依存图的节点类似于功能资产树的节点,它们主要区别在于:资源分配树值记录当前可用的资产,依存图记录所有可能的资产。
经济规划
依存图最主要、显而易见的用途是确定完成目标的步骤。
首先满足哪种依存是着眼于当前和规划未来之间的折衷。纯粹的反应式AI将使用资源分配树列出它能立即生产的所有资产,并选择最合适的节点。更侧重于规划AI将分析依存图中所有节点以确定值得追求的长远目标,查询功能资产树以判断哪些依存可能是最有价值的,并向其前进,而不管它位于图中多深的位置。
当满足依存的方式有多种途径时(通过A或B都能到达C),这种处理方式将变得微妙。游戏设计者可以聪明地避开这种类型依存或者使用标准的搜索算法来快速解决问题。
寻找脆弱的依存
依存图可以用于分析玩家的优势和弱势以及查明对付最脆弱的依存。如在《魔兽争霸3:冰封王座》中,破坏敌方的英雄祭坛,将迫使敌方无法建造高级兵工厂以及花费宝贵的时间复活、招募英雄;杀死敌方农民将延缓敌方的发展;这些都是一种聪明地破坏性策略。
判断依存图给定的节点是否脆弱的因素有三个:
1.内在价值:有些资源本身很宝贵。资产在图中的位置越深,通常内在价值越高;
2.强的子依存:有些资产会由于其能够创建或支持的东西而值得攻击;
3.弱的父依存:父节点相对较弱(支持资产不多)且易于攻击(保护不好)的节点。
无论是攻击还是防御,我们都可以采用相同的推理。对于攻击,我们通常选择对付最宝贵的依存;防御时,我们根据依存图来提防这样的攻击——加强防御,并建造备用建筑。
策略推理
依存图的一个优点:为根据不完全的资料推断其他玩家的当前资产和可能采取的策略提供了依据。
推理方向有两个:向前推理和向后推理。
向前推理:我们知道特定玩家拥有特定的个体或资源,因此断定他很可能满足子依存。如见到弓箭手靶场后,我们断定敌方有弓箭手了。
向后推理:我们沿依存链向后走,根据给定的个体断言使其依存将得到满足。见到了弓箭手,我们确信对方建造了靶场,虽然我们没有侦查到。
这中概率推理,和贝叶斯网(Bayes network)的推理技术极其相似。
我们也可以根据推理断定某些节点不太可能出现。如在游戏的某点设置玩家经济状况最大可能值——可以用建造时间或影响力地图的数据得到推理,则某些依存将导致其他依存得到满足的可能性较小。
玩家个性
和功能资产树一样,我们也可以使用依存图赋予AI玩家独特的个性。优先需要调整的是依存图中各个节点的脆弱性。通过增大或缩小不同节点的脆弱性值,可以让AI玩家提高或降低这些资产的重要性。调整对手的依存图这些值将改变我们将这些地方资产作为攻击目标的可能性;调整自己依存图中的这些值将改变我们的经济发展方式和我们将采用的技术。
要设置初始优先级,一种简单的方法是选择给定AI玩家一组终极“目标”。对于图中最深的所有节点,找到一种合适算法,根据合意性对这些依存进行排序,并最终得到良好的合意值。然后将合意值传递到依存图外层,从而明确告诉AI玩家哪种技术更合适。
如一类AI玩家患有“火力不足”忧虑,则增大该AI依存图远程资产的脆弱性,并调高对手依存图远程资产脆弱性-》优先打击敌方的远程火力,提高自身的远程压制力;一类AI玩家喜欢“卑鄙”地偷袭弱者,则增大其依存图刺客类资产的脆弱性,并调高对手资源采集资产脆弱性-》AI会偏好建造刺客单位并喜欢偷袭敌方的落单的农民、位于后方的弓箭手、法师等容易阵亡的单位。
总结
AI很大的一部分是决策,以良好的方式表示游戏状态将使AI玩家更容易进行决策。
影响力地图指出了敌人的位置,资源分配树指出了为了攻击敌人需要哪些东西,而依存图指出了如何建造这些东西以及制造后如何使其处于最佳状态。
三、有关态度的一切:为意见、声望和NPC个性构建单元
前言
态度系统可以被用来以意见和声望系统之外的方式丰富NPC行为,如作为决策树或行为树的输入,作为社会网络建模部分,丰富NPC的个性。
本节展示基本的态度理论,以及一些可以用来连接其他部分AI的轻量级实现建议。
简介
情感和态度是让我们称为人类的一大部分因素,如果要为我们的游戏角色开发类似人类的行为,开发者需要解决人类行为这些复杂的概念。游戏角色是真正人类的夸张模仿:更简单、极端。这简化了实现困难。我们要做的不是完全正确的科学。可以把它叫做认知工程学或甚至心理学破解。
态度
态度是“一种通过评价特定实体的喜好或厌恶程度来表达的心理学倾向”。
对态度结构最重要的是评价度量。还原到最基本的核心,它意味着掌握着态度的一个人做出他喜欢或不喜欢态度对象的程度判断。
态度的构建单元
态度只有当游戏中发生了可以影响态度的事件(选择事件)时才需要刷新。
价(Valence)
一个单独的态度应该包含喜好/厌恶的可估价度量,通常称为价。每个态度至少需要带着一个整数或者浮点数值来表示这个度量,当然它可能会使一个双极值(如表示同意/不同意)。
价的范围并不明确。最简单的方法是使用-1.0~+1.0,但实际的程度并非是线性的,且可以跨越很多量值。如“轻微”、“盲目火热”,下面是两种可能的选择:
1.评估范围仍然设置为-1.0~+1.0,但把S型曲线作为反应曲线;
2.让评估值在很小的范围,比如{1.0~5.0}来表示对数形式的5个级的量值。
效力(Potency)
效力用来度量态度是多么强烈。效力和价不同,它可以是非常强烈的政治中庸,有一个近似于0.0的价,但却感觉十分强烈。这种情况的发生是因为一个态度表示的是一生中与态度对象接触的积累,但却表达为一个瞬间的值。
比如一个人第一次尝试做某事(第一次春游、第一次收红包等)。省略效力的度量是有可能的,但如果这么做,需要一些其他的技术来减弱那些巨大并不可惜的态度的转变。
任何实际的态度系统也许都会在严重的突发情节(如严重的背叛)下发生故障。这里最好是避开这种情况。态度类需要实现一个方法,可以强制地重置价和效力到任何想要的数值。然后但戏剧性的时刻发生时,游戏脚本系统只需要使用那个方法强制重置所有被影响的态度,态度持有人需要被调整为更合适的态度数值。人类极端的情感是非常复杂的,对于现在来说,尝试在游戏AI模拟这种极端情感是不现实的。
持续时间(Duration)
随着时间的逝去,人们会忘记一些事,并且极端的态度和不好的记忆会随着时间变得缓和。持续时间可以用很多方式来表达,因为衰变会或多或少地遵循对数形式,所以半衰期的方法是一种表达方式。
如果游戏只跨越很短时间,那么态度和记忆会保持新鲜,持续时间被忽略。如果游戏时间跨越很久,就需要一些衰退函数并根据持续时间来衰减态度强度或价。其次,要考虑NPC的个人因素,也许有些事对它们来说影响巨大,应该设置很长的半衰期(让它们的态度只有很少甚至没有衰退)。
模型如下所示:
class CAttitude
{
private:Entity* target; //指向一个游戏实体的态度对象Valence valence; //需要Valence的类型定义Potency potency; //需要Potency的类型定义
int month; //作为半衰期的游戏时间(按月计算)
public:CAttitude (Entity*);Decay; //计算另一个月的衰减Float Product; //价 * 效力//等
}
复杂的态度对象
态度类中经常需求一个有用方法:当处理复杂态度对象时,可以从它们具有的多个属性上获得一个全面的或总的评价。
对于线性表示,似乎一个归一化的SRSS(平方和开方)就可以工作很好。但是,每个态度的价乘以每个态度的效力,然后乘积相加,再做归一化,这个值会更好。
如果使用的是一些其他的表示,如Sigmoid非线性函数或对数曲线,产生这个总值需要更多的运算开销。
态度和行为
这是另一个拥有广泛理论的领域。当对象的态度达到一定程度,就会可能发起一些行为,这取决于AI的决策。
首先是对行为的态度。所有NPC可以做出的行为都可以关联一个态度,这个态度表示NPC感觉这个行为是否可取的趋向和程度。比如一些策略游戏中为改善关系可能存在的联婚,但是一个特定的人物(族长或国王)可能认为它是完全反面的(减低家族或国家的影响力)而不予考虑,或只有当回报到了极端的阈值(礼金)或者特殊情况(财务出现大问题或者被能文善武的准女婿说服)才会有可能同意联婚。
其次是行为意向(Behavioral Intention,BI)。BI在态度和行为之间,一个行为发生前必须有一个BI连接它。比如一个NPC有足够正面的态度帮助玩家包含给与金钱、分享秘密。这些行为只有在条件正确时才发生,比如NPC有足够金钱才会给财务破产的玩家金钱救急;NPC只有拥有有价值的秘密才会分享给玩家。
BI可以被用来事先准备好那些帮助行为,接下来用来与测试条件。如果满足测试条件,行为可以真正发生。
说服和影响
在理论中,一个人或者A组说服B组来采取或变换态度的效率,依赖于大量的布置在偶然事件中的因素。说服者A被称为发送者,说服信息的目标为接收者。发送者至少需要对接收者来说是可信的并被接收者所喜欢和熟悉。接收者必须要注意信息,可以处理信息,并且完全直到信息是关于什么的。信息本身可以是原因、情感。如果表现为原因,它必须在接收者听起来是合乎逻辑的。同样,如果说服信息提倡的态度对于接收者现在的态度来说太过极端,而超出接收者可以接受的立场(简而言之是好感度不足目标的好感度需求),那么说服信息就容易失败。
态度的社会交换
NPC彼此之间也有不同的态度,这就进入了平衡理论。平衡理论是社会网络建模中很强的一部分,也是本节范围之外的另一种人类行为方面。
在很多游戏中,不同的NPC都只对玩家有态度,而彼此之间不持有态度。如果游戏设计中没有理由保持NPC之间的态度信息,那就不理会它们会大大简化设计。
然而,如果游戏玩法包含了联盟、背叛,那么一些游戏设计会从这样的一个系统(NPC彼此持有态度)中获得收益。但这样增加的复杂度会让你头大。
这一种复杂度是完全算法开销。对于可以有态度的N个角色来说,有N*(N-1)种配对,产生N平方的复杂度。
一种策略是通过分配更少的关键NPC到更小数目的组中并跟踪它们,以减少N的大小。
个人理解:将不同的关键NPC分割成不同组里,如不同王国分配到国家组;一个城市的NPC只与该城市的NPC彼此有态度联系除非是特殊的主要NPC;但游戏需要进行决策时再访问特定的组。比如王国进行联盟决策,只会访问国家组的关系进行最选择,也许也会访问国王组获取彼此关系作为决策影响权重。
意见系统
作为玩家,你的行为会让NPC尊敬或厌恶,他们对你形成意见。对此选择一些度量进行衡量。从理论上讲,选择的属性应该尽可能地正交,每个属性都静态独立于其他属性。假设游戏中设置了几个不同的竞争组织,每个都有自己的行事风格。第一个为乐于助人、充满正义感的小头目领导;第二个喜欢厚颜无耻、公开暴力;第三个喜欢顺其自然、随波逐流。每个头目都喜欢按照是否符合他的组织风格来评价玩家或任何NPC的不同模式的态度。
当玩家逐步建立起他的地位时,不同头目会评价这些可感知属性的不同组合。充满正义感的头目作为最后的决策,也许会避开对他的风格来说太邪恶的玩家。一个搞砸太多工作的玩家会发现他的感知能力已经恶化,那些有利于他的任务将被停掉,这导致玩家不得不做更多低级任务来获得组织上老大对他的好印象。
只需要少数的属性/态度的度量能使这种游戏玩法变得可能。即使只考虑每个度量的高低程度(前提是极端的人物更有趣),这也会带来更多可能的玩家如何被感知和玩家声望如何被建立的组合。这些度量的其他组合可以使游戏策划构建剩余NPC的个性的一部分。
四、个人观点
AI的决策结构组成:信息采集、决策方案、根据个性选择决策方案。
在第一节(创建影响力地图)中介绍了游戏世界中的信息采集(主要是2D游戏),AI根据采集的信息了解到当前局势,知道敌我双方的主要信息。在第二节(策略评估技术)中,了解了策略决策的数据结构构造并设计个性化决策方案,然后分析第一节采集的数据进行决策。第三节(有关态度的一切:为意见、声望和NPC个性构建单元)则让我们了解AI个性化的情感,丰富了AI的个性。
其中第一、二节的内容偏向即时战略类游戏的设计(如红警、战锤40k),而第三节则偏向于包含社交的游戏(如骑马与砍杀、星露谷物语)。对于AI丰富的决策目前我有三种设计方案:
1.丰富、繁多的数据设计;
2.强大的算法;
3.大数据进行训练AI。
对于第一种方案,许多文字类游戏都偏向与此。它们都使用了大量的存储空间来保存这些数据,如图片、文字、语音等。这种技术相对比较容易实现,但是需要大量的人力进行重复开发,需要一砖一瓦的建造出来。其中我个人比较喜欢的就是《隐形守护者》与《权力的游戏》,隐形守护者拥有比较多的分支与优秀的美术以及文化内涵,但美中不足的是内容不够丰富。许多分支看似自由其实都是写死的剧本,倘若其中关键步骤未正确选择,则会“卡关”。与之相比,权力的游戏就好非常多,无论是游玩方式还是内容深度,而且游戏会记住玩家的每个选择,并对应关联修改后文的对话、选项等,让玩家能身临其境的游玩。且AI极高,玩家难以猜中每个选择背后的走向,而游戏会通过玩家的选择,指引到不同的结果。美中不足的地方就是游戏资源难获取,且汉化版有许多遗漏或机翻语句。其次就是美术会稍差些。
对于第二种方案,许多即时战略类游戏都偏向与此。它们使用不同的决策算法相结合来达到效果,这对技术要求相对要高的多,且对性能要求较高(AI需要大量的数学计算)。这类游戏我比较喜欢《幽浮2》与《战锤40k》,幽浮2在画面、AI、性能都有非常好的表现;而战锤40k在AI这一块表现的中规中矩,不过其游戏玩法上是比较丰富的,包括剧情模式、种族特殊性等方面。
第三种方案则是通过机器学习、深度学习等方法对AI进行训练。像人脸识别、图片识别、AlphaGo等,都是基于这些技术实现的。当然这对于开发者的专业性要求较高,且近几年这类技术在游戏行业发展较为有限。
这些方案各有优缺点,单一的采用一种方案是可行的,不过如果能组合使用AI将表现更好。个人不成熟思路:设计2种AI——女皇与皇帝。女皇AI类似蚁后、蜂后那样,拥有针对功能相对较高的AI,其下统御(管理)低智或无智的蚁群。皇帝AI类似中国的皇帝,针对全局进行决策,其下管理各类文臣武将(多种女皇AI)。皇帝AI根据获取的数据进行决策,并发布宏观的指令(如攻击某块地域或每回合生产目标资源数)给女皇AI,女皇AI根据宏观指令拆解到微观指令进行决策、实行(如移动到某块地形埋伏敌军,增大采集装置、农民数量)。皇帝AI可以通过大数据训练(类似AlphaGo)或者人为使用大量数据进行设计方案决策(第一种方案)。女皇AI则根据具体功能进行特定的算法实现(第二种方案)。当然,过多的女皇AI会对性能进行影响,此时我们可以再根据具体需要对算法进行拆分、优化(如普通的将领型女皇只需在设计好的几个方案中进行决策即可,不需个性化决策;而特殊的女皇则在局部进行个性化决策,如选择伏击方案,会聪明地选择前后夹击或者局部最优解的排兵布阵)。这样在玩家可见的战斗会显得聪明,而性能代价不会超出预期。而在玩家不可见的战斗则更加容易,比较简单的方法就是给与聪明的AI更高的权重。
学习资源
-
- 《游戏编程精粹2》第三章第六节
- 《游戏编程精粹2》第三章第七节
- 《游戏编程精粹7》第三章第四节
更详尽的内容和代码实现可在书中阅读。