戻る

 MUGENメモ AILvの話 by ADI
7:57 2009/09/13 基本記述終了・眠い
18:42 2009/09/13 ちょいちょい。
3:27 2009/09/14 追記修正
0:55 2011/05/27 いまさら間違ってた確率を修正

  ● 序 ●

 ここで書かれる「AILv」は、AIにおける強さを調節する全てを示す。
 レベル制AIの意義とは、強さを調整させることにより、
  用途に対して柔軟な対応を可能にするものである。

 それはAI同士で拮抗させた戦いを行わせる為に必要ともなり、
  特に多数のAIを用いるリーグ戦といった場合には不可欠ともなりえる。

 そのAILvについての話を行う。

( 一部参考:平成a氏のAI説明書 )

  ● 分類 ●

 レベル制AIのAILv用記述は大別すると、2つの種類によって分けることができる。

 特定の数値を条件とする「分類型」
 数値と数式を条件にする「変動型」

 条件式としては、Lv数値用Varに対し
□ [ > < = ]だけの条件が「分類型」
□ [ +-/*% ]などの数式が「変動型」
 というような分け方である。

 Varでなくファイルによって設定する場合は、
  動作をレベル毎に区切って変える分類型に属する。

 また分類型と変動型を複合していることも少なくない。


  ● 記述 ●

□ 分類型
 レベル毎に異なる動作を行うように記述し、強さを変える。
 その為それぞれは別々に記述されている場合も多く、
  ファイルを別々に用意する、という形が多いのもその為。

 Varで管理する場合は、
Trigger*** = Var(*AILvVar*)=1 ;イージー
Trigger*** = Var(*AILvVar*)=2 ;ノーマル
Trigger*** = Var(*AILvVar*)=3 ;ハード
Trigger*** = Var(*AILvVar*)=4 ;ベリーハード
 といった条件式で「分類」を行っている。
 記述箇所が共通している場所以外では、
Trigger*** = Var(*AILvVar*)>xx
Trigger*** = Var(*AILvVar*)<xx
Trigger*** = Var(*AILvVar*)=[xx,xx]
 という記述はあまり用いられない。

 行動パターンを細かく変えたりすることもできるが、
  細かく設定しすぎると、動作の記述が膨れ上がる問題も。
 その為イージーなどは最小限の記述しかしない場合もある。


□ 変動型
 統一された動作であっても、確率や細かい数値を変え、強さを調節できる。
 代表例としてはレベルを1〜10と決めて置き、基本的なAIに
Trigger*** = Random <= Var(*AILvVar*)*100
 という条件をそれぞれの行動条件へ入れるタイプ。
( これはLv1で毎F10%、Lv10で100%という条件式 )

 こちらはAILv用記述をいじることで段階数を増やすことも容易で、
  完全な複合型の例ではあるが999999段階というAIも存在する。
( 1%氏のアヌビス二刀流ポルナレフAIの事
  攻撃999段階+防御999段階で、戦闘中に上昇する機能を持つ。 )

 また記述次第では数値の微妙な調整もできる他、
  変動型を基本にした一部複合型はとても多い。

 10段階での記述の例としては
Trigger*** = Random <= Var(*AILvVar*)*Var(*AILvVar*)*10;顕著に。
Trigger*** = Time > 65 -Var(*AILvVar*)*6 ;レベルに応じて遅延
 など。勿論これも一例に過ぎず、様々な記述法がある。


□ 複合型
 完結に言えば、分類型と変動型の条件式双方を用いている事。
 代表例は10(変動型)+1(分類型)、11段階のAIだろう。

 いわゆる「Lv11で超反応を使う」と言うようなもので
  基本的には上記の変動型の代表例と同じだが、反撃用の条件に
;遅延記述。Lv11以上遅延無視。
Trigger*** = Time>15-Var(*AILvVar*) || 10<Var(*AILvVar*)
  などの記述が用いられていること。
 記述の方法やTime>xxの数値は様々ですが、大きな特徴は、
  ||(もしくは)を用いて、特定のレベルより上で無制限にする記述。
 超反応の遅延以外にも、特殊ガードの乱用や永久などの開放、
  いわゆる「通常、使ってはいけないもの」の制御もよくある。

 記述上、分類型を基本にして変動型を加えるよりも、
  変動型を基本にし分類型を加えるほうが、無難。


  ● 他の用途 ●

 こうした「分類型」や「変動型」は単一のAILv用Varだけでなく、
  細かい設定などにも用いられていることはある。
 例えばブロッキングレベルなどの、特殊ガードの確率を変動させたり、
  積極的に攻撃するか消極的に行動するかなどの動作を変化させたり、
  超高性能な技の使用率やトリカゴなどのスイッチ、
 あげればキリなど無く、様々なところで使われうる。

 そうしたもののも「レベルを変化させる」役割を持っている為、
  「設定項目」であってもAILvとして役を成していると言える。
 ただ傾向の設定で最優秀が決まっていなかったり、
  あまり数値を大きくしすぎると不安定になるような項目もあったり、
  一概に「最大値=最も強い」と言うことはできないが。

 AILvという表現に統一しているが、
  「レベルを変えられる」ならばAILvたりえる、と私は考える。



  ● 分類型の制作について ●
 同一ファイルに分類した記述を行う場合、
  段階数は記述上最初から決めておく方が好ましい。
 段階数は多すぎても大変である為、3〜5くらいが丁度いいか。

 名称を用いる場合は馴染み深い Easy,Normal,Hard と
  VeryEasy,VeryHard などを用いるのが無難だろう。
 特殊な例としてはその上に UltraHard,ExtremeHard がある。

 ただし、名称相応の強さがないと拍子抜けされる為、
  キャラクターの強さと自身の技量に相談をしておこう。
 気にかけるべきはそれぞれが、どの程度の強さか。

 例として利便上名称などを用いるがあくまで例。
 段階数や強さに応じて調整を行うこと。

 Var管理での記述は上記に書いたとおり。
Trigger*** = Var(*AILvVar*)=1 ;Very Easy
Trigger*** = Var(*AILvVar*)=2 ;Easy
Trigger*** = Var(*AILvVar*)=3 ;Normal
Trigger*** = Var(*AILvVar*)=4 ;Hard
Trigger*** = Var(*AILvVar*)=5 ;Very Hard
 ファイル別なら後からの追加は容易だが、
  Var管理で新しく下側に難易度を追加したい場合、
  それぞれの数値を繰り上げてやら無いと、
  3:Normal 4:Hard 5:VeryHard 6:Weak 変になる。


■ エクストリームリー(Extremely)
 強さの調整を度外視し、「強いだけ」の限界に挑戦する難易度。
 キャラ性能を最大限引き出し[理論上最強の動作]を実現するAI。

 特殊ガードはフル活用し、無敵回避や当身なども最大限利用。
 攻撃などによって隙を作らないように。
  無闇な攻撃は厳禁で、永久があるのならば遠慮なく使う。
 死に技や下位互換になっている技などは一切用いない。

 飛び道具があれば最遠距離からのトリカゴもありだが、無闇にはしない。
 遠距離用の隙の少ない技がなければ、攻撃せずに近づく。
 中距離からは突進技、飛び込んで空中からの攻撃。
 近距離なら最短F攻撃からコンボ、対空も超反応などを考慮して迎撃。
  もしくは0F投げか、待ちに徹して超反応で返すなど。

 遠距離戦が得意なキャラであれば自分からは近づかず、
  遠距離で戦い、近づいてくる相手を的確に迎撃させる形。
 当身キャラであれば、相手の距離や速度などを考慮し、
  擬似学習装置も考慮に入れ、技を最大限使えるようプログラムする。

 相手に勝たせるつもりのないレベルで、
  キャラによってはワンチャンスから10割もありうる。


 ただし、実際にこうしたAIを搭載する場合は、
  「勝つためだけのレベル」と注意書き等しておく方が無難である。
 もしくは明記しない隠しレベル、別スイッチのExレベルにするなど。


■ いわゆる ベリーハード
 エクストリームリーを調整し、勝利より「勝負」を優先する感じの難易度。
 ベリーハードとは言うものの、エクストリームリーなベリハAIもあるが、
  あくまで、いわゆる。

 まず第一にガード、特殊ガードや回避の確率を調整。
 永久やトリカゴといった戦法を続けないように調節し、
  ロマン技などがあれば、たまにそれを狙うようにする。
 使っていなかったが使えないわけでない技などを使わせるようにする、など。

 反撃反応などの確率は若干へらすだけで、超反応は維持。
( Random<250でも6Fで80%(82.2%)になる為、との程度かは調整。 )
 強い相手と拮抗した試合を行うためのレベル。
 挑戦するに楽しいレベル、という感じかもしれない。


■ いわゆる ハード
 ベリーハードを調整し、易しくしたような難易度。

 超反応を低確率、もしくは反応に遅延処理をかけ、
  高性能な技の確率を下げたり、使いにくい技もちらほらと使わせる。
 ガードをゆるくし、特殊ガードなども低確率になどなど。
 使っていないロマン技、魅せコンボなども狙うようにさせ、
  コンボの成功率自体にも手を加えるなどもする。

 勝つ事よりも魅せることに重点を置くような、
  見てみても楽しいレベル、という感じかもしれない。


■ いわゆる ノーマル
 ハードからさらに易しくする難易度。

 反撃の超反応を封印し、反応自体を遅く、低確率に。
 ガード、特殊ガードの割合もハードの半分程度にまで。
 行動自体の確率も Random<100~50 くらいにし、
  使えない技なども同等の確率でふるなどの、弱体化。
 また対象とする範囲を一回りくらい広げ、
  当たらない位置でも必殺技や超必殺技などをふる。
( Random<100(6F約46.86%) Random<50(6F26.49%) )

 格闘ゲームの基本が出来ていれば、
  並キャラで十分勝てるような程度のレベル。


■ いわゆる イージー
 相手に勝たせる為の難易度。

 ガードはたまに、特殊ガードは封印
 攻撃へのガード以外の反応は一切無し。

 行動の頻度を Random<10 程度まで落とし、
  近接で隙の大きな技や、遠距離に当たらない技をふる。
 超必殺技は当たるか当たらないかの所でぶっぱなし。
 コンボも低確率、などなど。

 格ゲー初心者であってもそこそこ勝てるレベル。
  レバガチャボタン連打でも倒せるくらい。


■ いわゆる ベリーイージー
 基本的に動作を行わない難易度。
 動作はあっても Random<1 程度だとか。

 同じキャラのMUGEN本体のCPUAIに負ける程度のレベル。
 と言うのはやりすぎかもしれない、サンドバッグモード。


■ といっても
 あくまで例。
 それぞれ同量くらいの記述をするとなると、
  ファイル量が膨大になりすぎる、あまりオススメできない。
 イージーではガードと基本攻撃だけという簡単な記述もありえるし、
  自分で戦ってその難易度だと感じる程度が望ましいだろう。


  ● 変動型の制作について ● (変動基本の複合型も含む)
 基本的には単一のAI制作と変わりない。
 基本のAILv確率以外は、細かい数値にAILvを反映させたりする程度の為、
  強さに関しては分類型のベリーハード辺りを基本にすると丁度いいか。
( あるいはエクストリームリーを分類型の記述で入れ、
  レベルを下げるごとに遊びや無駄の記述を増やしていく、など。 )

 レベル記述と制作を一貫して行いたい場合は、
  作る前に段階数と調整に何の数値を使うかを決めると、滞りが少なく済む。


■ 段階数
 代表例は1から10の10段階に、超反応を分類型で分ける+1の11段階。
  そこからさらに+1で12段階などもある。
( エクストリームリー的な場合は、その辺りにするべきだろう。 )
 その場合は、1から10段階が基本の変動型で、
  それ以降は分類型による特殊な動作が主、のはず。

 10段階以外には調整を2倍にした5段階、10分の1にした100段階になど。
 変動式の基本がRandomによる確率変動である為、
  基本だけでは1000段階辺りが限度になる。
 戦闘中にレベルを変動させるわけでもなければ、10段階で十分だろう。


■ 記述例
 あくまで例。上記にある例もまとめている。
 記述例では10を上限にして説明を行う。


□ 確率(Random)のみ
;基本の確率。レベルに応じて確率が増える
Trigger*** = Random <= Var(*AILvVar*)*100

;レベルが低い場合、より低確率になる
Trigger*** = Random <= Var(*AILvVar*)*Var(*AILvVar*)*10
Trigger*** = Random <= Var(*AILvVar*)*Var(*AILvVar*)*Var(*AILvVar*)

;レベルに応じて確率が減る(効率の悪い技など)
Trigger*** = Random > Var(*AILvVar*)*100


□ 時間(Time)を用いる確率など
;Lv10なら6,Time、Lv1なら60,Timeの遅延。Lv11では計算上遅延無し。
Trigger*** = Time > 65 -Var(*AILvVar*)*6

;ガードなどの反応遅延として。どちらかが相応のTimeが必要。
;(Lv10ならTimeが 12:12 9:16 6:24 4:36 3:48 2:72 1:144 の時)
Trigger*** = Var(*AILvVar*)*Time*EnemyNear,Time >= 1440

;反応用確率。相手の6,Timeを1とし、Lv10なら60,Timeで100%になる。
Trigger*** = Random < ( Floor( EnemyNear,Time/0.6 ) * (*AILvVar*))


□ パワーゲージ(Power)を用いる確率
;Lv10でゲージなら1本で毎F10%の確率
Trigger*** = Random < Var(*AILvVar*)*Power/100


□ 距離判定に用いる。
;低レベルの場合、距離の範囲を広げる補整(Lv11以上では範囲が狭まる。)
Trigger*** = P2BodyDist X =[xx,xx+(40-Var(*AILvVar*)*4)]

;低レベルの場合、高さの範囲を狭める補整(Lv11以上では範囲は広がる。)
Trigger*** = P2BodyDist Y =[yy-(40-Var(*AILvVar*)*4),yy]

;後ろの壁までの距離の判定。壁際が苦手な場合などに。
Trigger*** = BackEdgeBodyDist < Var(*AILvVar*)*5


□ Varaddなどに用いる
 特定の条件中、専用のVarに加算し続け、
  一定数を超えた場合に反応を起こさせる処理の加算に用いる、など。
[State -3, Count];反撃用
Type = VarAdd
var(*専用Var*) = Var(*AILvVar*)
Trigger1 = MoveType != A && P2MoveType = A;攻撃中でなく対象が攻撃中
Trigger2 = EnemyNear,P2MoveType = H;相手の対象が攻撃を受けている
Trigger3 = 0&&Var(*専用Var*):=0;どちらかにも当てはまらない場合リセット

[State a, Counter];反撃
Type = ChangeState
Value = *反撃技ステート*
TriggerAll = *その技の基本条件*
TriggerAll = *その他の条件*
Trigger1 = Var(*専用Var*) > 600;Lv10で60,Time、約一秒
( EnemyNear,P2MoveTypeは「近い敵の,対象の状態」 MoveTypeは自分の状態
  タッグ時、相方が近い敵の攻撃を受けている最中も含まれるかどうかの違い。 )


□ 例としてあげたものの
 別に全てを使う必要は無く、基本の確率だけでも構わないが、
  その場合にはレベルの上下における変化が小さすぎ、
  実感として分からないと言う可能性が高くなる。
 ただ元々、変動式のLv1程度の変化は分かり難いが。



  ● 個別Var 技封印・確率指定 ●
 AILvVarとは別に、専用のVarを使い、
  極めて高性能な技や特殊ガードなどの封印や確率指定を行うもの。
 特にこれといった基準は無い為、


 技封印であれば、1/0のON/OFF、Var(**)と!Var(**)だけでいい。
 確率の場合はVarを0~100とあたりと考え、
  Random%lt;Var(**)*10とすればいいだろう。
Trigger*** = Var(**) ;スイッチON (1)
Trigger*** = !Var(**);スイッチOFF(0)
Trigger*** = Random<Var(**)*10;確率(Var)%
Trigger*** = Random<Var(**)*Var(**)*10;Lv


 AILvとは関係無いが、もし項目が多すぎてコンフィグの記述が肥大化する場合、
[State a, Varset];コンフィグ設定
Type=Varset
;■
Trigger1=1||Var(**):=***;←この数値を〜
;■
Trigger1=1||Var(**):=***;←この数値を〜
;〜説明〜
;■
Trigger1=1||Var(**):=***;これを〜
;〜説明〜
;■
var(**)=;←この数値を〜
;〜説明〜
 と言った記述方法を取ることで、いくらか削減することができる。
 「:=(コロンイコール)」はVarsetの記述を:=に収めてくれる便利な式。


  ● 最中・レベル変動式 ●
 試合中に自動で数値を変動させるタイプのレベル数値。
 隠しステータスとして変動させる場合もあれば、
  例で出したように、AILv自体を変動させることも。

 AILv自体を変動させる場合は、例に出したとおり、
  段階の多い変動型の方が作りやすい。
( 分類式でのAILv変動式は、工夫をしなければ無謀である。 )

 設定項目では無いが、極めて不利の場合最中にレベルを上げたり、
  極めて有利になった場合レベルを下げたりなど、
  試合中に強さの調整を行う、という事も一応可能。
( ただレベルの調整は一歩間違えると惨事になりかねないが。 )
 AIによってはライフを基準として調整する場合もあるし、
  極めて有利になった場合に動作を中断するものもある。

 設定だけが調整ではない、というわけだ。

 ラウンドをまたいでの変動式などの準備は、[Varの初歩]を参照。
 レベル変動式を実装する場合は、しっかり調整すること。
  慣れていなければ無闇に挑戦するものではない。


  ● ボスモード ●
 一定レベル以上にした時や特殊な設定の時、動作だけでなく、
  能力の上昇やゲージの自動回復などが伴う[エキストラモード]
 これはキャラ性能を引き上げることによって調整を行う方式。
 AIによっては特定のパレットカラーで、こうしたモードになるものも。

 見かたによっては「チート」にも見える為、扱いには注意。

 分類としては、
  体力自動回復 パワーゲージ常に全快 固有ゲージ無制限
  攻撃力増大 防御力増大 アーマー付加 常時覚醒状態
 などなど。

 ただし、あくまでこれらは「ボスモード」であって、
  AIだけでない「キャラ性能の向上による調整」である。
 その為、もう一度いうが、くれぐれも扱いには注意すること。

 こうした機能を持ったAIは大抵注意書きなどが成されている。
 また制作するのならば、エフェクトやマークによって、
  1目で分かるようにしたほうが好ましい。



 この文章は09/07/29の辺りから書き始めたメモを、
  大部分を修正し書き直したものです。
 原文は[AILv論・AIに関する話]にあります。



 神キャラに属するような、Cnsプログラムのパズルによる、
  特殊な防御システムと攻撃システムを有している場合ならば、
  「誰のプログラムが最も優秀か」のような比べ方はできますが、
 そうでない場合、極端に言ってしまえば、
  「誰が一番手加減していないか」という比べ方しかできません。
 「強い=優秀」ではなく「強い=強めに作られた」と言ってしまえる為。
( ただ、だからと言って、強い相手に当たるのはどうかと思う。 )

 大会を行う場合も優勝したからといって、「強い」ではなく、
  「有利な調整になっていた」という事もできなくはないのです。
 その為、重要なのは結果でなく「試合そのもの」であると私は思います。
  「面白い戦いであったのかどうか」
 「強い=面白い」というのは「ありえない」と考えるべきです。


 例えばAI対AIの大会で、
  選出キャラのバランス無視や無調整などは、ただの暴挙です。
 結果が明白になるようなバランスは、ただの公開処刑です。
( ネタであれば笑って済まさることもありますが。 )

 その為AI同士での大会を行う場合などは、
  キャラの性能を考慮してキャラ選出やAIなどの調整を行い、
  誰が優勝してもおかしくないようなバランスにすることが、
 望ましいと私は考えます。
 ただキャラに対しての露骨な下方調整も、どうかとは思いますが。

 また当身キャラ・波動昇竜キャラ・投げキャラ・射撃キャラなど、
  キャラクターによって得意、不得意がある為、そうした考慮も。
 少なくとも完封(パーフェクト二回)のある組み合わせは避けること。


 AI制作者によっては、最高レベルの使用を控えてもらう、
  もしくは禁止などの注意書きが成されている場合もあり、
  最高レベルで戦うことだけが全てではない、という人もいる。
( 本文で説明した[エクストリームリー]の位置なのだろう。 )




戻る