|
作者:rex2017 版权所有 违者必究
警告:本文可能存在各种算法缺陷,数值算法和仅供参考。
欢迎诸位大侠多多指出思路上的不足。以便于我继续改进。
出发点:
1.解决Achilles提出的AI行动缺陷。
1。明明我方有一个人已经快死了,即将开始攻击的野怪却突然掉头去打我其他血较多的成员。
2。前面一个怪已经把某人乱了一下,马上后一个怪又去乱他。
3。前面一个怪已经成功地把人眠了,后一个怪又把它打醒了。
4。怪方有人快死了,会补血的队友不给它补血。
5。本次战斗中已经有一个怪乱我方某人,被此人免疫掉了。后面还有怪去乱他。
6。怪方单位最强的手段是使用法术攻击,而偏偏此怪总爱使用普通攻击。
7。有的怪明明是很不堪一击,却总喜欢相互释放些对己方没什么用的辅助法术,
2.赋予不同NPC不同的战斗行为准则,一定程度上凸显NPC个性。
引言
AI,即人工智能。战斗AI,则是指在NPC在战斗中做出一定的智能化的表现。
表现在一个回合制游戏中,表现为NPC能够有针对性的选择目标,技能。而NPC在面对多个目标,拥有多种技能时候,这时候,可以进行的动作组合就多样化了起来。
比如一个NPC面对着3个玩家操作单位A1、A2、A3,4个盟友单位B1,B2,B3,B4。他有攻击能力,也有治疗能力。那么,NPC应该选择攻击A1还是A2还是A3,应该选择治疗自己,还是选择治疗B1,B2,B3,B4?
而在随机行动NPC,面对这些都可以执行的指令,做出的是随机的选择,可能会做出该攻击的时候反而治疗,治疗还治错人的错误选择。
而哪一些行为会让玩家觉得NPC有智能甚至是有个性呢?我们尝试例举以下一些NPC行为,也是本文着力去实现的一些行为。
1.高几率攻击一个濒死的目标。
2.低几率做出没有效果的行为。
3.低几率做出重复效果的行为。
4.低几率进攻不合适的目标(比如睡眠目标)
5.高几率对需要治疗的盟友进行治疗。
6.选择更有效率的进攻方式。
7.留意伤害自己的单位,对其加大攻击几率。
8.留意伤害自己盟友的单位,对其加大攻击几率。
9.会响应盟友集中进攻某一人。
基本框架
而为了让NPC在众多可以执行的指令中,选择出一条更符合当前需要的指令,我们要怎么做呢?
首先我们看人是怎么做的?
1.知道自己能做什么事情。
2.然后根据自己的判断标准判断做什么更有用
3.做有用的事情。
同样,让NPC具有AI,我们需要做的事情是类似的。下面一个AI的基本行为准则:
1.技能可执行判断
在NPC的技能集合中提取可以执行的技能。
2指令穷举
穷举当前所有能够进行的指令。
3计算指令优先度
判断这些指令的执行价值。
4指令优选
选择最终执行的指令。
Flash: http://aurogon.bbs.gamebar.com/attachments/month_1005/20100525_4e96f334978071502fbb4fNKLko2rOjV.jpg
指令可执行性判断
此步骤的主要职责:
1.排除不可执行情况,比如技能冷却中,技能需要条件不足(没有足够的魔法值等。)
2.兼容多阶段设计的NPC的AI脚本。锁定或解锁技能。
一个进行多阶段设计的NPC,在阶段变化之后,可能会停止使用某些技能,或者启用一些在前一阶段被锁定的技能。或者在AI脚本中,某些指令需要达到一个特定的点才允许执行。
基本规则应该是脚本和基本AI冲突的时候,优先执行脚本。
指令穷举
在获得当前可以执行的技能以后,根据指令对不同目标的针对性,穷举所有可以执行的指令。
一条完整的指令是 使用 某技能 针对 某目标。
比如某NPC当前可以使用的技能有3个:普通攻击(单体),特殊攻击X(单体),治疗(单体)。面对敌人A1,A2,A3。盟友B1,B2.
则穷举的指令集有9条:
1.使用普通攻击 针对 A1
2.使用普通攻击 针对 A2
3.使用普通攻击 针对 A3
4.使用特殊攻击X 针对A1
5.使用特殊攻击X 针对A2
6.使用特殊攻击X 针对A3
7.使用 治疗 针对 自身
8使用 治疗 针对 B1
9.使用 治疗 针对 B2
计算指令优先度
在确定穷举指令集以后。我们需要针对每一条指令量化它的使用价值。从而得出一个优先度的值。
这个是整个方案的核心。
我们稍后将详细讲解。
指令优选
在确定了每一条指令的优先度值之后。我们是不是直接执行最优的指令呢?
直接执行最高优先度方案是方案的一种。
但是在实际情况下,由于在指令优先度值的计算过程中,所设定的值往往是一个估算的倾向值,在经过一番加减乘除之后,未必完全符合这个参数对战斗状态的量化形容。
同时我们也不需要一直执行最优指令。偶尔犯点迷糊的NPC看起来更感性真实,偶尔也能让玩家心跳一把。有躲过一劫和天降厄运的可能。
提出一个优化度不高的指令选择模式:
提取指令优先级最高的N条指令,并更具优先度的比例投几率骰,根据点数决定最终执行的指令。
1.例如某NPC的指令优选度为3。那么他将选取优先度最高的3条指令。
2.如果最高3条指令中,指令1优先度100,指令2优先度60,指令3优先度40。
3.则有100/(100+60+40)=50%几率执行指令1,同理有30%执行指令2,20%执行指令3。
4.然后根据最后的随机骰来决定具体指令。
如果有优先度为负数的指令值,则增加最大负值到1,其他的的指令增加相应幅度。(或直接设定为1)
(本算法未进过数值平衡,仅供参考)
当然会有其他更好的优选法,我这里暂时提出这一种。
设计意图:
在面对一个不很需要治疗的盟友和一个也没有明显进攻价值的目标面前,无论是治疗盟友,还是进攻敌人,价值都不是很明显。那么就允许在这些行为之间做一个相对随机的选择。
增加战斗的随机性,不让每一场战斗开始一样,过程就一样。
NPC的指令取数范围的大小决定了一个NPC的行为模式,这个数越大,他就越容易做出非最优判断。直接执行优先度最高的指令即使指令取数范围为1的情况。但是即使是这样,只要未经过对优先度进行干扰的技能的影响,他所执行的非最优技能优先度也排行前例,总的来说是一个可以接受的行为。
指令优先度计算的局限性设定
总体优先度方案局限性设定
在提出基本框架之后,根据所考虑的范围和深度,指令优先度有相当多的实现算法。
在本方案中,我们考虑如下一些情况:
1.敌人威胁,战斗行为使目标产生对NPC的威胁。
2.目标状态,技能所针对的目标状态。
同时也例举几点不考虑的范围:
1.敌人可能进行的动作。
2.盟友可能进行的动作。
3.盟友对于战局的加值
即这是一个记住敌人的过去,但是只考虑现在不考虑未来的AI方案
行为类型与状态参数的局限性设定:
再进行更详细的解释之前,我需要缩小讨论范围,使得本文有一定的可读性。同时也减少讨论的复杂程度。
本次考虑的行为类型集例举如下:
1.伤害
2.击杀
3.治疗
4.复活
5.催眠
6.打断(吟唱)
7.命令(集中进攻某一人)
除了特别说明外,不考虑以多人为目标的行为。
本次考虑的状态参数例举如下
1.濒死(生命值低于20%,因为是战术点而成为一个特殊的状态,布尔型(仅有是否值))
2.睡眠 (布尔型,是否被催眠)
3.吟唱(进行法术准备,可被打断而导致法术准备失效,布尔型)
4.生命值
5.护甲值
核心公式
我们把指令分为以敌人为目标的进攻型指令和以本体及盟友为目标的防御型指令。
进攻型指令优先度=目标威胁指数(TTIN:target threat index number)+指令效能指数(IEIN: instruction effect index number)
Flash: http://aurogon.bbs.gamebar.com/attachments/month_1005/20100525_31f3acdf2bcc6e9fa0308B1KhkPbjt3d.jpg
防御型指令优先度=指令效能指数 (IEIN)。
Flash: http://aurogon.bbs.gamebar.com/attachments/month_1005/20100525_b767c564d0ab31f6c6a5kpcU75kqBFP8.jpg
目标威胁指数(TTIN)
TTIN计算公式
目标威胁指数(TTIN)=目标威胁类型1 参数(T1)× NPC对类型1威胁的敏感系数(S1) + 目标威胁类型2 参数(T2)× NPC对类型2威胁的敏感系数(S2) + …… + 目标威胁类型N参数(Tn) × 目标对类型N威胁的敏感系数(Sn)。
即TTIN=T1S1+T2S2+……+TnSn
目标威胁指数用于分析目标的行为历史,从而判断其是否有进攻价值。
威胁类型参数
根据行为类型集,我们得出如下类型的威胁
1.目标伤害NPC威胁 T_DTM (threat: damage to me)
2.目标伤害NPC盟友威胁 T_DTA (threat: damage to ally)
3.目标击杀盟友威胁 T_AKO (threat:ally Knock down)
4.目标治疗其队友威胁 T_DH (threat:do healing)
5.目标复活其队友威胁 T_DR (threat:do resurrection)
6.目标催眠自身威胁 T_STM (threat:sleep to me)
7.目标催眠盟友威胁 T_STA (threat: sleep to ally)
8.目标打断自身施法威胁 T_ITM (threat: interrupt to me)
9.目标打断盟友施法威胁 T_ITA (threat: interrupt to ally)
10.盟友进攻命令给目标的威胁增值 T_FC (threat:focus command)
11.目标装备威胁 T_E (threat: equipment)
实际分类中,完全穷举的分类是行为 × 行为可能目标。我们忽略了一些情况。比如不区分敌人治疗自己还是治疗队友。不考虑NPC自身被击杀以后被盟友复活的情况。而根据你所需要的AI灵活度,你也可以合并某些威胁类型。
解释特殊威胁
T_FC 集火命令
AI独有技能,一般为游戏中的头目怪所有。施放对象为单一玩家。
技能执行令之后,则对目标产生一个特定的威胁增幅。从而提升其他所有怪物进攻这个目标的倾向。
目前设计为永久影响技能,也可以考虑设计为状态标记技能。
T_E 装备威胁
战局开始时候,NPC并没有进行任何活动,状态也基本处于正常状态。那么决定第一轮攻击的目标就是目标的穿着。这个很好理解。
装备设计的时候,可以自带一个威胁值作为装备属性,一般是越高级的装备威胁越高,但是有的武器可能实用而不显眼,可以高攻击低威胁。有的武器可能华丽而不实用,高威胁地攻击。
特色道具可能针对某一类怪物有特殊威胁增加和减少,比如蜀山道服,则对妖属性的怪物增加100。理解为妖类的怪物认为蜀山弟子特别有威胁。
大致的参数设定
每一个威胁都具有一个通用值。表明在通用情况下,NPC对此类情况的一般倾向。
1.比如定义通用情况下,NPC对目标给盟友造成伤害的威胁认为是给自身造成威胁的一半。那么一定量伤害,对于NPC自身,如果产生100威胁值,那么如果是对盟友造成同样的伤害,那么产生50威胁值。
2.敌人的治疗也是根据治疗量来确定一个威胁值。治疗越大,威胁值越大。
3.复活威胁可以是一个固定的威胁值+复活后治疗量所产生的威胁值的和。
4.催眠这类状态型技能产生一个固定的威胁值,一般情况下应该高于数次普通攻击的值。
5.被打断施法可以产生一个固定的威胁值,也可以根据施放的技能不同而产生一个相应的固定威胁值。
威胁敏感系数
在NPC的AI类中,对于每一类型的威胁,都有一个相应的威胁敏感系数。默认都是1
比如S_DTM对应T_DTM,表明怪物对给自己造成伤害的目标的敏感程度(其他的就不一一列举)
特色设定:
当敏感度不再为1时候,NPC就体现出对某种特殊威胁的不同从而可以设计出有特色的怪物。比如:
1.高度击杀敏感:S_TDA参数为10,他会对击杀自己盟友的目标产生比普通怪物相比10呗的威胁增值。从而大大增加他进攻这类目标的优先度。游戏背景上的体现为这个团体之间的生死情谊比较浓厚。
2.低盟友伤害敏感:S_DTA参数为0.1,基本对于给自己盟友造成伤害的目标不关心。游戏背景上的体现为这种怪物对于盟友漠不关心。
3.高度治疗/复活敏感:S_DH /S_DR参数为5,他会对敌方阵营中进行治疗/复活的单位有5倍的威胁值增加响应,从而更倾向于攻击治疗者。
4.天生反骨:S_FC参数为-1,这种怪物反而会降低被集火命令影响的目标的攻击倾向。
追加设定:
NPC的AI类中增加一个逃跑阀值。对于T_DTM,T_DTA,T_AKO三类威胁敏感,(也可以设计为对乘以敏感系数之后的值敏感),不同的NPC这个阀值可以不一样,有些则不逃跑。
当这三个值的和达到这个阀值,NPC则会开始不顾一切的逃跑。游戏背景上的体现为NPC看到自己和周围的队友被打伤打倒,害怕了。
其他的可能的进行的特殊设计大家可以发挥想象的空间。不比拘泥于我的威胁分类框架。
指令效能指数(IEIN)
IEIN计算公式
指令效能指数IEIN=目标状态1针对参数(C1)×目标状态1响应系数(R1)×NPC对类型1状态的敏感系数(S1)+ C2×R2×S2+……+Cn×Rn×Sn
即IEIN=C1R1S1+C2R2S2+……+CnRnSn
指令效能指数用来分析目标的状态,从而判断 进攻他/保护他 价值的大小。
IEIN相对TTIN是一个较大的值,这个值用来偏转在特殊情况下NPC的目标。
状态针对参数
根据状态类型集以及目标类型,我们都可以得出以下技能对状态的针对参数,这些参数属于技能的子类参数,隶属于技能。
1.敌目标濒死 C_ED (consider: enemy dying)
2.敌目标睡眠C_ES(consider:enemy sleeping)
3.敌目标吟唱 C_EC (consider: enemy casting spell)
4.敌目标生命值水平 C_ELS (consider : enemy life status)
5.敌目标护甲值水平 C_EAS (consider :enemy armor status)
6.自身濒死 C_SD (consider:self dying)
7.自身生命值水平 C_SLS (consider: self life status)
8.盟友濒死 C_AD (consider : ally dying)
9.盟友生命值水平 CAS (consider: ally life status)
指令的状态针对参数举例
(数值设计仅供参考,未经过数值平衡。仅用于理解思路,增幅不一定是固定值,也可以是百分比)
普通攻击 (单体物理伤害技能)
1.对濒死目标的优先度增加 100
2.对睡眠目标的优先度增加 -1000
3.对吟唱目标的优先度增加 0
4.根据目标生命值比例,增加已经掉血的百分比,如敌人生命目前为60%,掉血40%,则增加40。
5.根据对方的护甲值,以120护甲为水平线,增加不足120的部分。比如对60护甲的目标增加60,对150护甲的目标增加-30。
一般性解释:
1.普通攻击是一个伤害性技能,可用于对濒死目标的击杀,100表明一般的怪物都会稍微加大对濒死目标的攻击倾向。
不带伤害的DEBUFF型技能则对濒死目标的优先度增幅一般为0.
2.对睡眠目标的优先度增加为一个很大的负值,则表明一般怪物都会强烈降低对被催眠目标的攻击倾向。
3.普通攻击不具备打断能力,所以对吟唱目标的优先度提升是0.
4.NPC会对低生命的目标产生小幅增值,表明一般NPC都会稍微增加对地声明目标的攻击倾向。
5.物理攻击技能会对影响物理攻击效率的参数产生优先度增减。
根据以上解释,也可以理解以下两个技能的参数设定。
冰龙缚(单体法术伤害技能,忽略护甲,打断施法)
1.对濒死目标的优先度增加100
2.对睡眠目标的优先度增加 -1000
3.对吟唱目标的优先度增加 100
4. 根据目标生命值比例,增加已经掉血的百分比,如敌人生命目前为60%,掉血40%,则增加40。
5.无视护甲。增加0。
回春术(单体治疗技能)
1.自身濒死优先度增加500
2盟友濒死优先度增加 300
3根据自身生命值比例,增加已经掉血的百分比的5倍,如自身生命目前为60%,掉血40%,则增加40*5=200
4.根据盟友生命值比例,增加已经掉血的百分比的3倍,如自身生命目前为60%,掉血40%,则增加40*3=120
状态响应系数
布尔型变量,值为1或者0。
状态响应系数是一个影响当前战斗中上所有拥有此技能的NPC在使用技能时,是否针对这种状态进行考虑。当不考虑时乘以0,则得到的0结果不影响优先度,如果考虑,则乘以1,不影响值的大小。
这个参数是用来模拟一个非常简单的学习系统。
比如护甲值响应系数R_EAS战斗开始时是0。即假设NPC一开始不知道你的护甲水平,但是当一个NPC攻击了该目标后,则把这个参数改写为1,即NPC经过交手,知道了你的护甲值水平,他就会开始考虑这个针对你的护甲来判断这个物理系的技能是否有效率。
本文出于框架性的考虑,没有考虑魔法属性防御,比如火魔防,水魔防等等。这些状态参数也可以做同样的设计。
状态敏感系数
在NPC的AI类中,对于每一类型的威胁,都有一个相应的状态敏感系数。默认都是1
比如S_ELS对应C_ELS(敌人生命值水平),表明怪物对不同生命值水平的敌目标的敏感程度。
特色设定
和威胁敏感一样,某些NPC可能对状态有着特殊的敏感度。
1.濒死击杀敏感:S_ED参数为30,这一类的怪物对濒死的目标表现出非常强烈的攻击欲望。
2.自我治疗敏感:S_SLS参数为5。这一类怪物堆自身的掉血状况非常在意,即使只受了轻伤,也有很大几率给自己治疗。
3.“我不喜欢睡觉的对手”:S_ES参数为-1,这一类怪物反而会增加对睡眠角色的攻击倾向。
思考题2则:
1.在ACHILLES提出的问题中,1和4同时出现。即NPC同时拥有伤害技能和加血技能,同时面对一个濒死的玩家单位和一个濒死的己方单位,NPC应该作何选择?如果在不同的NPC设计中体现对这两种选择的不同倾向?
2.玩家单位和己方盟友单位同时低血量,但是己方盟友拥有的攻击模式被玩家单位免疫,这个免疫是一个暂时性效果,一旦免疫解除,己方盟友的伤害输出远强于自身。自己暂时处于高血量安全状态,但是攻击力对低血量玩家单位威胁不高。请问怎样的设计才能使NPC优先给队友加血而不选择攻击低血量玩家爱单位,怎样的设计才能让NPC做出一个盟友在对方免疫解除后对战局产生巨大价值的判断?
|
|