;######################################################################################### ; ;  AI擬似学習 〜当身〜       作者 BK ; ;#########################################################################################  当身の擬似学習の解説を見たことないので作ってみました。  なるべく詳しく解説したつもりです。 ;######################################################################################### ;  更新履歴 ;######################################################################################### 09/01/19  なんとなく作ってみる 09/01/20  とりあえず完成  16:50 いろいろ修正 09/01/22  一部の当身に対して機能しなかったのを修正 ;######################################################################################### ;  使うもの ;#########################################################################################  使っていないVar … 3個以上 最低2個でも大丈夫かもしれない             ここでは5個使います  たったこれだけ! ;######################################################################################### ; ;  AI擬似学習 記述 ; ;######################################################################################### ; まず、以下の記述を[Statedef -1]または[Statedef -3]より下に記述します。 ;## ここから ############################################################################# [State -3, 擬似学習用var] type = varset trigger1 = !ishelper var( 変数 ) = 0 ;当身されたか否かの変数 リセット [State -3, 擬似学習用var] type = varset trigger1 = !ishelper trigger1 = !MoveReversed ;当身されていないとき var( 変数 R ) = enemynear,stateno ;敵のステート監視 ;## ここまで ############################################################################# ; 次に以下の記述を[Statedef -2]より下に記述します。 ; 別のところに記述するとうまく機能しません。 ;## ここから ############################################################################# [State -3, 擬似学習用var];これはなくても良いかもしれないが一応 type = varset trigger1 = !ishelper trigger1 = MoveReversed ;当身されたとき var( 変数 ) = 1 ;当身されたか否かの変数 オン [State -3, 擬似学習用var] type = varset trigger1 = !ishelper trigger1 = var( 変数 ) ;当身されたか否かの変数 オンのとき trigger1 = var( 変数 A ) = 0 ;今までに当身をされていないとき var( 変数 A ) = var( 変数 R ) ;敵の当身ステートを記憶 [State -3, 擬似学習用var] type = varset trigger1 = !ishelper trigger1 = var( 変数 ) ;当身されたか否かの変数 オンのとき trigger1 = var( 変数 A ) != 0 ;前に当身をされたとき ;statedef 0で当身するのは凶・神キャラ等を除けばないかと…… trigger1 = var( 変数 A ) != var( 変数 R ) ;前にされた当身と違うとき var( 変数 B ) = var( 変数 R ) ;敵の当身ステートを記憶 [State -3, 擬似学習用var];3つほどあれば十分かと type = varset trigger1 = !ishelper trigger1 = var( 変数 ) ;当身されたか否かの変数 オンのとき trigger1 = var( 変数 B ) != 0 ;前に当身をされたとき trigger1 = var( 変数 A ) != var( 変数 R ) ;前々にされた当身と違うとき trigger1 = var( 変数 B ) != var( 変数 R ) ;前にされた当身と違うとき var( 変数 C ) = var( 変数 R ) ;敵の当身ステートを記憶 ;[State -3, 擬似学習用var];3つ以上使いたいとき お好みで 一番左の;←は取ること ;type = varset ;trigger1 = !ishelper ;trigger1 = var( 変数 ) ;当身されたか否かの変数 オンのとき ;trigger1 = var( 変数 C ) != 0 ;前に当身をされたとき ;trigger1 = var( 変数 A ) != var( 変数 R ) ;前々にされた当身と違うとき ;trigger1 = var( 変数 B ) != var( 変数 R ) ;前にされた当身と違うとき ; : ; 上を参考に好きな数だけ入れましょう ; : ;var( 変数 X ) = var( 変数 R ) ;敵の当身ステートを記憶 ;## ここまで ############################################################################# ; 後は当身してほしくない技のtriggerに trigger∇ = var( 変数 A )=0||(var( 変数 A )!=0&&var( 変数 R )!=var( 変数 A ))||(var( 変数 B )!=0&& …… ; という感じに記述すればOK ; 長くてめんどくせーよ!っていうひとは以下の記述を追加しましょう。 ; Statedef -1、-2、-3 どれでもよいです。 ; Varをもう1個追加することになるので、そこだけ注意してください。 ;## ここから ############################################################################# [State -3, 擬似学習用var];トリガー用 type = varset triggerall = !ishelper triggerall = var( 変数 A ) != 0 ;当身されたことがあるとき trigger1 = var( 変数 R ) = var( 変数 A ) ;相手のステートが当身ステートのとき trigger2 = var( 変数 R ) = var( 変数 B ) ;相手のステートが当身ステートのとき trigger3 = var( 変数 R ) = var( 変数 C ) ;相手のステートが当身ステートのとき ; : ; 記憶した数だけ入れましょう ; : ;trigger∇ = var( 変数 R ) = var( 変数 X ) ;相手のステートが当身ステートのとき var( 変数 Y ) = 0 ;攻撃してはいけない [State -3, 擬似学習用var];トリガー用 type = varset triggerall = !ishelper trigger1 = var( 変数 A ) = 0 ;当身されたことがないとき trigger2 = var( 変数 A ) != 0 ;当身されたことがあるとき trigger2 = var( 変数 R ) != var( 変数 A ) ;相手のステートが当身ステートでないとき trigger3 = var( 変数 B ) != 0 ;当身されたことがあるとき trigger3 = var( 変数 R ) != var( 変数 B ) ;相手のステートが当身ステートでないとき trigger4 = var( 変数 C ) != 0 ;当身されたことがあるとき trigger4 = var( 変数 R ) != var( 変数 C ) ;相手のステートが当身ステートでないとき ; : ; 記憶した数だけ入れましょう ; : ;trigger∇ = var( 変数 X ) != 0 ;当身されたことがあるとき ;trigger∇ = var( 変数 R ) != var( 変数 X ) ;相手のステートが当身ステートでないとき var( 変数 Y ) = 1 ;攻撃しても大丈夫 ;## ここまで ############################################################################# ; そして、当身してほしくない技のtriggerに trigger∇ = var( 変数 Y ) = 1 ; というように記述しましょう。 ; これだけ! ;######################################################################################### ;  ちょっとした解説 ;#########################################################################################  何をしているのか気になる人、今後沢山AIを作っていく予定の人のみ読むことをお勧めします。  間違っている可能性もあるので、一応注意。  この当身の擬似学習は、   ・大抵の当身はこちらのステートを奪うこと   ・Statedef -1、-3 が、こちらが相手のステートにいるときは参照できないこと  を利用しています。  具体的には   ・Statedef -3 の変数 Rで常に相手のステートを監視する      ↓   ・当身でステートを奪われたとき、Statedef -3 は参照できないので    相手の当身発動時のステートが変数 Rに残る      ↓   ・変数 Rを変数 A、B等に記憶する  といった仕組みです。  さて、一通り見て一部の製作者の方やAI作者の方は  「MoveReversedをトリガーにして var(XX) = enemynear,stateno で大丈夫じゃない?」  と思うかもしれませんが、これではうまくいきません。  なぜかというと、MoveReversed は「当身をされてからの時間」を返すトリガーなので、  「当身をされた瞬間」を返すことができません。  一部のキャラは問題ないかもしれませんが、大抵のキャラは当身が成功した瞬間に別のステートに移ってしまうので、  MoveReversed では相手が移った先のステートしか記憶できません。  ここで、勘のいい人なら  「enemynear,stateno を enemynear,prevstateno にすれば?」  と思うでしょうが、これもだめです。  なんで?と思うかもしれませんが、(実際作っているとき僕も思いました。)  MUGENの仕様(?)なのか、相手が reversaldef の p1stateno でステート移動した際、  prevstateno が相手の reversaldef 発動時のステートを参照することができません。なんじゃそら。  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ……と、こういった理由があるので、当身の擬似学習はここに書いた方法以外では難しいと思われます。