AI講座
はじめに
AIとは簡単に言ってしまえば、
cpuを少しでも強くしたいとか、人間では不可能な行動をさせてみたいといった
ことを実現させることができるものです。
ですが、AIを作るということはキャラ作製の応用のため、
cns記述の理解が多少なりともないといけないという点が壁になります。
最近はAIを作る流行があるようなので、AI作成初心者を対象とした基本的なことのみに絞って書いています。
また、ここではキャラ作製の応用であるAIについてのみ書いていくため、
cns、cmdファイルの開き方が分からない等の説明は省略させていただきます。
まず、ここで紹介するAIの作り方は-3ステートを使った方法になります。
理由はcmdに書くと人間のステートかcpuのステートか分かりづらくなるためです。
-3ステートならAI専用のファイルを作ることができるため、AIのon、off設定なんかもしやすいです。
また、AIスイッチには特殊AI用コマンドを使ったやり方になります。
そのため、最大で128個しか作れないcommandに既に空きが無い場合はこの方法では作れないことになります。
[AIを作るのに絶対必要なもの]
未使用のvarが1つ
Commandの空きが最低一つ
(Commandは128個までしか作れません)
[AIを作る前に調べる必要があるもの]
[statedef -3]の場所
有った場合は、そこにAIの記述を書いていくことになります
無い場合は、何も気にしなくて良いです
キャラのステート番号
mugenを起動して、トレーニングモードでキャラのステート番号を調べます。
デバッグモードをonにして、各ステートの番号をメモして下さい。
([state no : X]の部分です)
コモンステート以外のステート番号をメモしておくことで、AIを作るのが楽になります。
また、
[Statedef -2] ;この記述より下に書いてください、無い場合は追加してください
[State
-2]
Type = DisplayToClipboard
Trigger1 = 1
Text = "AI:%d, Pos X:%f, Pos Y:%f"
Params = Var(X), P2BodyDist X, P2BodyDist Y
IgnoreHitPause = 1
SuperMoveTime = 9999
PauseMoveTime = 9999
上の記述をそのままコピペしておくと、製作が楽になります。
これはデバッグモード中に特定の値を表示させることが出来る記述です。
「Var(X)」のXにはAI用に使うVarナンバーを書くことで、スイッチが入っているかどうかを確認できます。
それ以降の記述はX軸とY軸の相手の距離を表します。
他にも、「DisplayToClipboard」は色々と使い方があるので、試してみるといいかもしれません。
cmdファイルを開いて、AIをセットさせるために必要なAI専用のコマンドを作ります。
[例]
[Command]
Name = "AI_00"
Command = a, b, c, x, y, z
Time = 0 ;Time=0推奨です!
[Command]
Name = "AI_01"
Command = b, a, c, x, y, z
Time = 0
とりあえず、人間が不可能な難解なコマンドをたくさん用意してくださいw
(多ければ多いほどいいです)
この理由は後で説明します。
補足ですが、まずコマンドはNameが違うコマンドを128個までしか作ることが出来ません。
また、「"Name=AI_00"」のコマンドをたくさん用意すれば128個の制限にひっかからずに
大量にコマンドを作れるんじゃないか?と思った人がいるかもしれないのですが、
実はこの方法だと、内部的にはコマンドを一個作ったのと変わらないようです。
実際、実験したことがあるのですが、mugenのcpuはNameが違うコマンドをランダムで読んでいる
だけのようなので、同じNameのコマンドをいくら増やしても意味が無いようです。
次にcmdに書かれている技のステートを見てください。
[例]
;立ち弱
[State 200]
Type = ChangeState
Value = 200
TriggerAll = Command = "a"
TriggerAll = Command != "holddown"
TriggerAll = StateType != A
Trigger1 = Ctrl
大体こんな感じで書かれています。
これに先ほど準備してもらったvarを使ってAIの行動を制限させます。
[例]
;立ち弱
[State 200]
Type = ChangeState
Value = 200
TriggerAll = Var(59) = 0 ;以下、分かりやすいようにvar(59)で統一します。
TriggerAll
= Command = "a"
TriggerAll = Command != "holddown"
TriggerAll = StateType != A
Trigger1 = Ctrl
こんな感じで全技に「TriggerAll
= Var(59) = 0」を書き加えてください。
これはどういうことをしているかというと、
AIを好きなように行動させるためにはAIの行動を制限させる必要があります。
そのため、varが1にセットされたときにはこのコマンドと条件を満たしても
技が出ないようにしているのです。
つまり、このAIの作り方ではvarが1にセットされた時点でAIが発動するという仕組みになっています。
この時点で分かった方もいるかもしれませんが、先ほど書いたコマンドを難解にしたのは、
自分がプレイしている最中にAIが暴発する可能性があるためだからなのです。
そうなってしまうと、自分では動かせなくなってしまいますので注意です。
このコマンドを使ってAI発動のステートをまずは作ります。
[例]
[Statedef -3] ;この記述以降に書いてください、キャラによっては記述自体が無いので、書き足す必要があります。
[State -3, AI]
;-3ステートの場合は-3と絶対書いてください!
Type
= VarSet
TriggerAll
= Var(59) = 0
;AIがまだ発動していないときにvarがセットされる
TriggerAll
= RoundState = [1,2] ;イントロ中、戦闘中にvarをセット。
Trigger1
= Command = "AI_00" ;先ほど書いたコマンドを書いていってください。
Trigger2
= Command = "AI_01"
Trigger3 = Command = "AI_02"
Trigger4 = Command = "AI_03"
Trigger5 = Command = "AI_04"
Trigger6 = Command = "AI_05"
V = 59
Value = 1
[State -3, AI] ;-3ステートの場合は-3と絶対書いてください!
Type
= VarSet
TriggerAll = Var(59) >= 1 ;AI発動中
Trigger1
= RoundState >= 3 ;戦闘後にvarスイッチを切る。
V
= 59
Value = 0
補足すると、
「TriggerAll = RoundState = [1,2]」としている理由は、
「RoundState
= 3」のときにvarがセットされてしまうとラウンド終了後もAIが動き続けてしまうため、
試合が終わらなくなってしまうためです。
最初に書きましたが、AIコマンドは出来れば多い方がいいです。
というのも、この方法はラウンドの最初からAIが必ず発動するというわけではないのです。
なので、トリガー(AIコマンド)を増やして、AIが発動する確率が上げているのです。
(問題が無ければ、128個のコマンドを全て使っても大丈夫だと思います)
ここでようやく本題に入りますw
先ほども言ったようにAIに行動させるということは制限させるということです。
そのため、ワンパターンなAIになりがちになるためかなり細かく書いていかなければなりません。
(自分もそんなAIしか作れませんが…)
[例]
;立ち弱
[State 200]
Type = ChangeState
Value = 200
TriggerAll = Var(59) = 0
TriggerAll = Command = "a"
TriggerAll = Command != "holddown"
TriggerAll = StateType != A
Trigger1 = Ctrl
これは先ほど例に使ったcmdに書かれていた人間用攻撃ステートです。
これと同様に-3のAIステートに同じものを書いていくのですが、AI用に書き換えなければなりません。
[例]
;立ち弱
[State -3]
Type = ChangeState
Value = 200
TriggerAll = Var(59) = 1 ;varが59にセットされたとき
TriggerAll
= StateType != A
Trigger1 = Ctrl
見てもらえれば分かるように、コマンドが有りません。
コマンドが無い理由は簡単で、トリガーをコマンドにしても確実にAIに入力させることが出来ないからです。
そのため、最初からコマンドを条件にしないのです。
それと、「TriggerAll
= StateType != A」のように技を出す上で
必須な条件はコマンド以外は削除しない方がいいです。
例えば、この「TriggerAll = StateType != A」を外してしまうと、
空中でも立ち弱が出るようになってしまいます。
ただ、このままではAIは自分が空中以外のときにコントロール可能な状態であれば
いつでもこの技を出すようになってしまいます。
そのため、色々な条件を追加していく必要があります。
ここでは、すぐ上に書いた条件の追加のために必要なトリガーの内、
AIを記述する上で知っておきたいトリガーのみを自分なりに解説していきます。
いきなりと思うかもしれないのですが、この先かなり難しくなっていくので、
一度説明を入れた方が分かってもらえると思って書いていきます。
(トリガーを理解している方はこの章を飛ばしちゃってくださいw)
自分の状態または相手の状態を確認するトリガー
statetype = S or C or A or L;自分の状態を確認する、S=立ち、C=しゃがみ、A=空中、L=倒れている状態を指す
p2statetype = S or C or A or L;相手の状態を確認する
movetype = I or A or H ;自分の状態を確認する、I=通常、A=攻撃、H=やられ状態を指す
p2movetype = I or A or H ;相手の状態を確認する
stateno = 任意の数字 ;自分のステート番号を確認する
p2stateno = 任意の数字 ;相手のステート番号を確認する
ctrl = 0 or 1;自分のコントロールが可能かどうかを確認する、0=コントロール不可、1=コントロール可能
canrecover = 0 or 1 ;自分が受身可能かどうかを確認する、0=受身不可、1=受身可能
距離を確認するトリガー
p2bodydist X = 任意の数字 ;自分と最も近い相手の横方向の距離を確認する
p2bodydist Y = 任意の数字 ;自分と最も近い相手の縦方向の距離を確認する
backedgebodydist = 任意の数字 ;自分と画面後方の端の距離を確認する
frontedgebodydist = 任意の数字 ;自分と画面前方の端の距離を確認する
それ以外で必要なトリガー
random = 0〜999 ;ランダムに0から999の数字をセットする
movecontact
= 任意の数字 ;相手に攻撃が当たったかどうかを確認する(ヒットとガード両方含む)
0は当たらなかった時、それ以上の数字は当たってからの有効フレーム数
movehit
= 任意の数字 ;相手に攻撃が当たったかどうかを確認する
0は当たらなかった時、それ以上の数字は当たってからの有効フレーム数
moveguarded
= 任意の数字 ;相手に攻撃が防御されたかどうかを確認する
0は防御されなかった時、それ以上の数字は防御されてからの有効フレーム数
※ちなみに、AIを作るうえでのMove〜系は基本的には、!
Move〜か、Move〜という使い方で
数字を使う必要は無いと思います。
数字を使う場合は、攻撃が当たってから遅れ気味に何かをさせるとき等、あまり使用しません。
「MoveHit = 2」=攻撃が当たってから2フレーム目のとき
「MoveHit = [1,2]」=攻撃が当たってから1〜2フレームのとき
life = 任意の数字 ;ライフの値を確認する
power = 任意の数字 ;パワーの値を確認する
おまけで覚えおきたい事
トリガーは、以下の記述を加えることで対象を変えることが出来ます。
enemy, = 自分から見て遠くの敵を対象とする(タッグ戦以外のときは、敵を対象とする)
enemynear, = 自分から見て近くの敵を対象とする(タッグ戦以外のときは、敵を対象とする)
target, = 指定されたtargetを対象とする(hitdefでIDを付ける事で攻撃が当たった相手を限定できる)
helper, = 指定された自分が出したhelperを対象とする(IDを付ける事で限定できる)
※例えば、「enemy,ctrl」で相手の行動可能状態を判断することが出来ます。
かなり書きましたが、これを覚えればほとんどのAI行動を記述することが出来ます。
是非、がんばって覚えてください。
ちなみにまだまだトリガーはたくさんありますのでw
それらも合わせて覚えればかなり限定的な条件も記述できるようになります。
上に書いたトリガーを使って色々な作り方の例を出していきます。
[例]
;立ち弱
[State -3]
Type = ChangeState
Value = 200
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl ;ここから下の記述でAIの行動を限定させていきます。
Trigger1
= P2StateType != A ;相手が空中状態以外のとき
Trigger1
= P2MoveType != A ;相手が攻撃状態以外のとき
Trigger1
= P2BodyDist X = [0,40] ;相手とのX方向の距離が0から40のとき
Trigger1
= Random = [0,200] ;ランダムの値が0から200のとき
これは上で使っていた立ち弱ステートの例にAI用の条件を足したものです。
説明していくと、この立ち弱は攻撃ステートです。
そして、攻撃を相手に当てるための記述を「Trigger1」に書きました。
そのため、相手が攻撃状態のときには攻撃させず、
相手との距離をかなり近いときに限定し、
相手が空中状態以外のときに攻撃させるようにしています。
つまり、攻撃が当たる位置にいることを条件にしているのです。
けん制用の場合には、「Trigger2」にもっと距離や相手の状態を広げて記述
していけばいいわけです。
[例]
;立ち中
[State -3]
Type = ChangeState
Value = 210
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl
Trigger1 = P2StateType != A
Trigger1 = P2MoveType != A
Trigger1 = P2BodyDist X = [0,50]
Trigger1 = Random = [201,400]
Trigger2 = StateNo = 200 ;自分のステート番号が200のとき
Trigger2
= MoveHit ;相手に攻撃が当たってからこのステートにいる間
Trigger2
= Random = [0,499]
;しゃがみ中
[State -3]
Type = ChangeState
Value = 410
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl
Trigger1 = P2StateType = C
Trigger1 = P2MoveType != A
Trigger1 = P2BodyDist X = [0,50]
Trigger1 = Random = [201,400]
Trigger2 = StateNo = 200
Trigger2 = MoveHit = 1 ;相手に攻撃が当たって1フレーム目のときのみ
Trigger2
= Random = [500,999]
今回は「Trigger2」に注目してください。
この例ではいわゆるチェーンコンボをAIにやらせるための記述を書いています。
前の例の立ち弱攻撃が当たったとき、「Randomの値が0〜499」の場合は210へ、
「Randomの値が500〜999」のときには410へ移行するようにしています。
[movehit]が210と410のステートでは使い方が違いますが、
[Random]を使うと、その値になったときにステートが変わるようになるため、
コンボが安定しないことがあります。
[Random]は1フレームごとに値が変化するため、攻撃が当たった瞬間はトリガーの値ではなくても
その後に値が変わってトリガーの条件を満たすこともあるからです。
そのため、コンボを確実に安定させるために[MoveHit
= 1]という使い方をさせる場合もあります。
また、今回のように攻撃ステートから、次の攻撃ステートに飛ばすようなときには
「Ctrl」はいりません。
攻撃中は基本的にコントロール不可ですから、コンボしてくれなくなってしまいます。
こんな感じで、分岐させるようにすれば色々なコンボをするAIになってくれます。
[例]
;昇竜拳
[State -3]
Type = ChangeState
Value = 1100
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl
Trigger1 = P2StateType = A
Trigger1 = P2MoveType = A
Trigger1 = P2BodyDist X = [10,50]
Trigger1 = P2BodyDist Y = [-80,-30]
Trigger1 = Random = [0,500]
この例ではAIに対空技である昇竜拳でカウンターをとらせるための記述をしています。
そのため、相手が攻撃状態で空中にいるときに限定して技が出るようになっています。
そして、注意していただきたいのですが、-3に書く方法も-1ステートに書くのとあまり変わらず
上に(先に書かれた)ステートが優先されます。
そのため、優先してAIに出させたい技はなるべく前に記述することを薦めます。
今までの例を自分のキャラ用に調整して使えば攻撃に関するAIの記述は大丈夫(?)だと思いますw
次は攻撃以外でのAI行動の記述です。
[例]
;ジャンプ
[State -3]
Type = ChangeState
Value = 40
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl
Trigger1 = P2StateType != A
Trigger1 = P2MoveType != A
Trigger1 = P2BodyDist X >= 50
Trigger1 = Random = [501,700]
Trigger2 = StateNo = 220
Trigger2 = MoveHit
Trigger2 = Random = [500,999]
ジャンプに関する記述ですが、攻撃のときとさほど変わりはありません。
AIの行動の限定は自分と相手の距離、状態をトリガーにしたものがほとんどなのです。
ちなみに、「Trigger2」はジャンプキャンセルのステートです。
これも、チェーンコンボの例と同じです。
[例]
;バックステップ
[State -3]
Type = ChangeState
Value = 105
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Ctrl
Trigger1 = P2MoveType = A
Trigger1 = P2BodyDist X >= 60
Trigger1 = BackEdgeBodyDist > 30 ;画面後方の端の距離が30以上のとき
Trigger1
= Random = [701,900]
これはバックステップで相手に攻撃を空振らせるためのステートです。
今回「BackEdgeBodyDist」を使ったのは、
後ろ端にいる場合、バックステップを使っても後ろに下がれずに攻撃をくらってしまうためです。
(当たり前のことですが、結構重要ですw)
[例]
;ガード
[State -3]
Type = ChangeState
Value = 120
TriggerAll = Var(59) = 1
Trigger1 = Ctrl
Trigger1 = InGuardDist
Trigger1 = Random = [0,700]
ガードステートです。
相手が攻撃をするときにガードさせているというだけです。
[例]
;空中復帰
[State -3]
Type = ChangeState
Value = 5210
TriggerAll = Var(59) = 1
TriggerAll = Vel Y > -1
TriggerAll = Alive ;生きているとき
TriggerAll
= StateNo = 5050
Trigger1 = CanRecover ;復帰することが出来るとき
Trigger1
= Random = [0,700]
空中復帰をさせるための記述です。
これも難しいことは無いです。
これで、AI記述に関しては終了です。
今までのを見てもらえれば分かるとおり、
ほとんどのAI専用ステートに使うトリガーは同じです。
一つ作り方さえ覚えてしまえば、なんとかなるので
是非、挑戦してみてください。
ここでは、AIの記述に関する小技とか強AIを作るための記述を少し紹介します。
[正確にAIの行動を分岐させる方法]
「Random」は記述一つ毎に別の値をランダムに出してしまう点と毎F値が変わる点が
場合によっては使いにくいことがあります。
そういった場合は、「VarRandom」を使ってください。
[例]
[State
-3]
Type = VarRandom
Trigger1 = Time = 1 ;ステートが変わるたびに、1フレーム目のとき
Trigger2
= MoveType = I ;普通の状態のとき
Trigger2=
GameTime %60= 1 ;一秒ごとに
V
= 58
Range = 0,99
これを作っておいて、トリガーに「Random」の代わりとして使えばいいだけです。
このvarをもう一つ使うことの利点は、値のランダムに無駄が無いこと、rangeを好きなように
設定できること、その値が変わるタイミングを指定できることです。
[レベル設定可能なAIを作る方法]
今流行っている、レベル設定が可能なAIの仕組み紹介です。
主な使用用途は強さや行動が全く違うAIを作るために用いるといった感じです。
[例]
[State -3, AI]
Type = VarSet
TriggerAll = Var(59) = 0
TriggerAll = RoundState = [1,2]
Trigger1 = Command = "AI_00"
Trigger2 = Command = "AI_01"
Trigger3 = Command = "AI_02"
Trigger4 = Command = "AI_03"
Trigger5 = Command = "AI_04"
Trigger6 = Command = "AI_05"
V = 59
Value = 1 ;ここの値を変えることでAIのレベルを設定します
AIスイッチの値を変えて、AI用に書いた行動の分岐をさせるのが一般的です。
例えば1なら弱いAI、2なら強いAIにするようにするわけです。
[例]
ガード
[State -3]
Type = ChangeState
Value = 120
TriggerAll = Ctrl
TriggerAll = InGuardDist
Trigger1 = Var(59) = 1 ;レベル1のとき
Trigger1
= Random = [0,200]
Trigger2 = Var(59) = 2 ;レベル2のとき
Trigger2
= Random = [0,400]
上の記述はガード確立が変化する記述です。
当然ですが、もう一つのレベルを用意するということは、
今まで書いてきたAI用の全行動にレベル2の記述を書かなければいけないということです。
[次のラウンドにVarを持ち越す方法]
次に、Varを持ち越す方法を紹介します。
一見すると、あまりAIと関係無いと思うかもしれませんが、
ここで紹介している難解なコマンドをAIに入力させてAIをセットする方法の場合、結構重要です。
キャラ設定のデフォルトでは、次のラウンドになるたびに
全てのVarはリセットされるようになっています。
ですが、前にも言ったようにここで紹介しているAIの作り方だと、
ラウンド開始からAIがセットされるわけではないのです。
そのため、ラウンドが切り替わるごとにAIをセットし直すことは
致命的でもあります。
[例]
IntPersistIndex = 60 ;持ち越すVarを決める
FloatPersistIndex
= 40 ;持ち越すFVarを決める
キャラのcnsファイルの最初の方に書かれている上の[例]の記述を見つけてください。
デフォルトではこうなっているはずです。
これを、
IntPersistIndex = 59 ;AIのVarが(59)の場合(使っているVarの数字を入れてください)
FloatPersistIndex
= 40
こう書き直してください。
[IntPersistIndex]は書かれている数字の一つ手前までのVarをラウンドが切り替わるごとに0に戻します。
(この場合はVar(58)までを0に戻す)
ここでは、AIのVar(59)を戻さないためにこう書き加えているのです。
注意して欲しいのですが、この[IntPersistIndex]は性質上
手前側に持ち越したいVarがあった場合、
例えば、[IntPersistIndex
= 10]というときには、
Var(9)までを0に戻して、それ以降の全てのVarを持ち越すことになります。
そのため、Varを多用したキャラは誤作動する可能性が高いです。
次に、AIをセットする記述に2ラウンド目以降の記述を追加します。
[例]
[State -3, AI]
Type = VarSet
TriggerAll = Var(59) = 0
TriggerAll = RoundState = [1,2]
Trigger1 = Command = "AI_00"
Trigger2 = Command = "AI_01"
Trigger3 = Command = "AI_02"
Trigger4 = Command = "AI_03"
Trigger5 = Command = "AI_04"
Trigger6 = Command = "AI_05"
V = 59
Value = 1 ;この下に新しく追加
[State -3, AI]
Type = VarSet
TriggerAll = Var(59) >= 1 ;AIがセットされた状態
Trigger1
= RoundState = 4 ;ラウンド終了後
Trigger2
= Win = 1
;勝ったとき
Trigger3
= Lose = 1 ;負けたとき
Trigger4
= DrawGame = 1 ;引き分けたとき
V
= 59
Value = -Var(59)
[State -3, AI]
Type = VarSet
TriggerAll = Var(59) <= -1 ;AIを停止させた状態
Trigger1
= RoundState = 2
;ラウンド開始
V
= 59
Value = -Var(59)
追加した記述を説明すると、
ラウンド終了後にAIが誤作動しないようにVarを一旦、-の値にセットして
-の値になっている状態でラウンドが開始された場合、
即座にAIがセットされる仕組みです。
レベル式AIであっても、-の値で掛け算をしているだけなので、
次のラウンドでも、そのレベルでAIがちゃんと入ります。
ただ、これだけ対策してもラウンド1の最初がAIにとって鬼門に
なってしまうのは事実です。
これがとても気になる方は、平成a様のAIManualに書かれている
Helperを使ったAIフラグをお勧めさせていただきます。
平成a様のAIManualは実戦を想定した記述が多く、
賢いAIを作るために最適なので、AI製作者には是非読んでいただきたいです!
[人間にはできないことをAIにやらせる方法]
最後に、人間ではできないことをやらせる強AI用の記述を1つ紹介
[例]
;真空波動拳
[State 3000]
Type = ChangeState
Value = 3000
TriggerAll = Var(59) = 0
TriggerAll = Command = "sinnkuu"
TriggerAll = Power >= 1000
TriggerAll = StateType != A
Trigger1 = Ctrl
こんな感じで書かれている人間用の超必殺技ステートを、
;真空波動拳
[State -3]
Type = ChangeState
Value = 3000
TriggerAll = Var(59) = 1
TriggerAll = StateType != A
Trigger1 = Power >= 1000
Trigger1 = Life > 500
Trigger1 = Ctrl
Trigger1 = P2StateType != A
Trigger1 = P2MoveType = A
Trigger1 = P2BodyDist X >= 60
Trigger1 = Random = [800,999]
Trigger2 = Life <= 500 ;パワーの条件の変わりにライフが500以下のときに
Trigger2
= Ctrl
Trigger2 = P2StateType != A
Trigger2 = P2MoveType = A
Trigger2 = P2BodyDist X >= 60
Trigger2 = Random = [800,999]
最初の方で技を出す上での必須条件は外さない方がいいと言いましたが、
人間に出来ないことをやらせるためにその条件を変えています。
この場合、人間がこの技を出す場合にはパワーが1000以上必要でしたが、
AIは「Trigger2」の記述の追加で、
ライフが500以下になったときにパワーの制限なしに使うことが出来るようになっています。
こうして必須条件を変化、削除することによって
恐ろしく強いAIにすることも可能だったりしますw
最後に
AI講座というエラそうなタイトルが付いていますが、
ここでやっていることは、実際は例を挙げてアドバイスしただけですw
そのアドバイスも既出のものがほとんどかも知れないのですが…、
例を使って自分なりに分かりやすく書いたつもりです。
自分もまだAIについては未熟な点が多く、
間違っているところが多々あるかもしれません。
それでも、何かしらの役に立てないかと思い、このAI講座を
書いてみた次第です。
もし、間違い等あれば掲示板に報告してくださるとありがたいです。
AIは作る人によって多種多様な作り方があります。
ここに書かれていることを参考にして、みなさん風に発展、進化させていってもらって
面白いAIを持ったキャラが出てきてくれるといいなと思っています。
最後に見づらくて、異様に縦に長いこの講座を読んでくれた皆様に感謝ですm(_ _)m