===========================================================================
7.1AI框架、代码顺序对AI的影响
===========================================================================
---------------------------------------------------------------------------
先说说AI框架对AI的影响。
在Cmd里面,通常一个状态只会由一个changestate控制,因为一个changestate里面足以应付所有按键输入的情况。
但是在AI里面,只用一个changestate控制所有情况是不科学的。
AI需要做的事情有很多,例如切反、连段、立回等。如果把他们全部塞在一起,就算作者自己也会觉得晕。
此外,因为代码顺序也会对AI造成影响(下文会详细提及)。
我们通常会把AI按照功能分成不同板块,分开编写,最后按顺序结合起来成为一个完整的AI。
这个就是我们所说的AI框架,其作用在于使AI更有条理,避免顺序冲突和方便阅读。
---------------------------------------------------------------------------
然后说说代码顺序对AI的影响。
虽然看上去随意调换代码的顺序对AI不会有影响,但事实并非如此。
在第3章我们有提及过运算符优先级,其实不单运算符是如此顺序执行,所有代码的执行顺序都是类似的。
因为代码的读取是从上到下、从左到右,所以在上面的代码先执行,其次同一行的代码前面的先执行。
请看下面两段代码:
[State -1, 升龙]
type = ChangeState
value = 1100
Triggerall = Var(59) > 0
Triggerall = Roundstate = 2
Triggerall = Statetype != A
Triggerall = ctrl
Trigger1 = EnemyNear,Movetype = A
Trigger1 = Random < 500
[State -1, 立防]
type = ChangeState
value = 130
Triggerall = Var(59) > 0
Triggerall = Roundstate = 2
Triggerall = Statetype != A
Triggerall = ctrl
Trigger1 = EnemyNear,Movetype = A
人物在非空中可控的情况下被对方攻击时,上面两段代码就会被触发。
如果是按照上面的顺序安排升龙和站姿防御两段代码的话,人物在第一帧所做的动作将会是50%几率凹升龙,50%触发防御。
但是如果将两段代码顺序反过来的话,人物在第一帧所做的动作将会必定触发防御。
从上述的例子可见按,如果两段不同功能的代码的触发条件类似,一不注意就会因为次序不同而产生不同的结果。
这个也就是为什么要注意代码顺序,以触发自己想要的代码。
===========================================================================
7.2AI框架范例
===========================================================================
---------------------------------------------------------------------------
说到这个首先得列出平成氏AI教程所提及的AI框架:
順番をまとめると
[AIフラグ]
│
[切り替えし]
│
[ガード]
│
[(起き攻め)]
│├[地上]─[地上起き攻め]
│└[空中]─[空中起き攻め(詐欺飛び)]
[(連続技関連)]
│├[地上]┬[地上目押し]
││ ├[地上隙突き]
││ └[地上繋ぎ]
│└[空中]┬[空中目押し]
│ ├[空中隙突き]
│ └[空中繋ぎ]
[(地上)]
│├[地上移動関係]
│└[地上立ち回り技振り]
[(空中)]
├[空中移動関係]
└[空中立ち回り技振り]
这个是很多AI作者都在使用的一个AI框架。笔者使用的AI框架也是在这个基础上建立起来的,再次感谢平成氏OTL
不过为了方便解释,下文会使用笔者自己常用而比较熟悉的在平成氏框架基础上作修改的AI框架进行讲解:
[AI开关]┐
││
[AI helper]│
│├ 1
[变量]│
││
[对策、双打]┘
│
[抓硬直、受身狩]┐
││
[抢招]├ 2
││
[切反]┘
│
[起攻、压制、诈飞]┐
│├[地上]│
│└[空中]│
│├ 3
[连招、目押、倒地追击]│
│├[地上]│
│└[空中]┘
│
[立回、骗招、乱动]┐
││
[防御]│
│├ 4
[移动]│
││
[蓄气]┘
笔者使用的这个模板主要是根据该板块对AI强度的影响来排列。
这么排列的好处在于对AI最有利的行为总会被最先运行。
下面开始对每个板块进行解说(下面会有很多格斗游戏术语,对格斗游戏不熟悉的读者建议先去查阅相关资料)。
---------------------------------------------------------------------------
1. 第一大板块里面的板块是关于AI前期准备和特殊需要提前处理的代码。
[AI开关]顾名思义就是第五章所说的AI开关。
[AI helper]的内容会在第十五、十六章详细讲,此处要做的建立用于学习和记录的helper。
[变量]就是一些AI会用到的作为辅助的本体变量。
[对策、双打]因为是属于特殊情况,一个是面对特殊人物才会触发,一个是双打情况才会触发,和普通的1V1的战斗有所不同,
所以放在前面以防被其他代码干扰。
2. 第二大板块里面的板块是一些令人物在非优势情况(通常是对方攻击时)下取得优势的板块。
[抓硬直、受身狩]是关于对方卖(攻击、受身)硬直时抓住机会打击对方获得先机。
[抢招]是指对方出发生较慢的招式时我方用发生较快的招式用时间差优势反先打击对方。
[切反]指的是用无敌、霸体等强力性能反击、回避对方招式。
因为一般来说抓硬直和抢招可以使用连段取消链比较低层的招式,而切反一般是处于取消链高层,所以为了效益会把切反放在后面
(当然无敌升龙还能接连段的话那没所谓...不过真有这么随便无敌升龙还能接连段的BUG人物吗)。
3. 第三大板块里面的板块是一些令人物在优势情况下扩大优势的板块。
[起攻]是指对方在倒地起身动作不受控制时,我方可以比对方优先做出攻击动作进行压制。
[压制]是关于对方在防御硬直内、自己有飞行道具掩护等对自己有利的情况下为了打开对方防御的进攻。
[连招]明显就是已经击中对方之后为了增大伤害而一直打下去的连段(Combo)了。
4. 第四大板块里面的板块是一些令双方相持情况下令自己可能获得优势的板块。
[立回]这里的定义和格斗游戏的(双方在未接触情况下为了获得优势而做的所有行为)有点不一样,特指自己(通常来说)没有收
到对方威胁的试探性攻击。
[防御]...字面意思。
[移动]是指走、跑、跳等单纯令人物位移的动作。
[蓄气]...也是字面意思(当然也有连段把对方打倒接蓄气的,那种写进连招后面也无妨)。
===========================================================================
7.3AI框架顺序须知
===========================================================================
---------------------------------------------------------------------------
上面这两个模板仅供参考,希望各位读者不要死记硬背照抄,而应该结合自己的需求和理解进行修改。
但是要对这些模板进行修改的话,有一些顺序是建议遵守的。
简单来说,就是两个不同功能的板块的触发条件类似的话,更有利的一个尽量放在前面。
1. [抢招、切反] -> [防御]
如同7.1里面所举的例子,两者都是被攻击时触发的板块,顺序如果反过来的话,有可能一直铁壁防御了。
2. [抓硬直] -> [立回]
对方出现硬直时,我方没有收到威胁而且对方不受控制,通常会用尽可能造成高伤害的起手,而不是试探性攻击。
3. 其实好像没啥了...其他的基本不会因为顺序有太大冲突...
个人比较建议遵守的是 [立回] -> [防御] -> [移动],[抓硬直、抢招] -> [切反]。
起码进入攻击范围会先攻击,进入防御范围会先防御,而不是乱走动;以及能最大化连段的收益。
---------------------------------------------------------------------------
这么一来,万事俱备只欠东风。理论知识和准备工作都做好了,下一章开始就是实际动手了AI...呵呵呵...
\ /
\ ∧_∧ /
| ∩( +ω+)∩ |
/ \ / \
/ (⌒つ⌒) \
做好觉悟了吗
===========================================================================
课后作业:
1.
新人人物作者通常会在Cmd文件犯一种常见的错误。如下:
;Stand Light Punch
[State -1, Stand Light Punch]
type = ChangeState
value = 200
triggerall = command = "x"
trigger1 = statetype = S
trigger1 = ctrl
;Crouching Light Punch
;偟傖偑傒庛僷儞僠
[State -1, Crouching Light Punch]
type = ChangeState
value = 400
triggerall = command = "x"
trigger1 = statetype = C
trigger1 = ctrl
;Light Kung Fu Palm
[State -1, Light Kung Fu Palm]
type = ChangeState
value = 1000
triggerall = command = "236x"
trigger1 = statetype != A
trigger1 = ctrl
为什么这个顺序会导致state1000这个招式使用不出来?
2.
如果把[AI开关]和[AI helper]这两个板块放在整个AI框架的最后,会对AI有什么严重的影响吗?
以上教程由口水轩撰写