AIエンジン

不思議のすごろくの戦闘シーンを再開中。
キャラクターを進めたりしてみて、なんとなくわかったのは、ゴチャキャラ系をやるにはAIがないんだよな。
ということで、さあ画面に配置したぞ動けと思っても動かせない。


AIって程大それた物じゃなくてもとりあえずキャラ動かそうかなと思ったんだが、うーん待てよと。
AIを6パターンくらいに分類するのもいいけど、どうせゴチャキャラっぽい自動戦闘でやるなら、AIくらい別で定義でもいいなということで、AIのエンジン化を少し考えてみる。

AIエンジン

AIエンジンってのはいろんなタイプがあるんだけど、一番好きなのは賢いキャラが強いとは限らないというタイプ。
将棋のAIものとかもそうなんだけど、思考はいくらでも出来るんだけど思考をすればする程時間がかかるから、考えられる能力 = 強さじゃないと。
将棋AIは大分CPUが進化してきちゃってるけど、シンプルなプログラムにはシンプルなりの強さがあって、まあ一番合理的なAIが全体的に見れば一番強いけど、特定状況下ではこっちのがいいよなとかもありえるってのがいい。


てことで、AIについてなんだけど、基本的な構造はこんな感じでねーのと。
a. (思考速度)msecにつき一命令を実行可能
b. 命令は基本的に種別と、それに紐づく諸々(cは命令種別、dからhは種別ごと詳細)
c. 種別
c.1. 攻撃
c.2. 移動
c.3. 回転
c.4. 判断
d. 攻撃
d.1. 回数
e. 移動
e.1. 方向
e.2. 移動量?時間?
f. 回転
f.1. 角度(90右、90左、180)
g. 判断(多くなるため省略)


魔法とか休憩とか防御とかもあるかもだけど、とりあえず思考は時間を消費する必要があって、判断量が多ければ多い程遅くなる。
で、色々と判断しながら、こう攻撃したり移動したりしていく感じですかなと。

AIエンジンを使う場合の実問題

基本、俺の作るゲームってのはランダム生成が基本なので、AIエンジンを作る場合でもAIエンジン用データのプリセットを何種類か用意してそれを使い回すなんてことは考えてない。
エンジンを作ったら、そのエンジンに乗っけるデータは自動生成出来るのがいい。


でもAIエンジンを使う場合、適当にAIを生成すると破綻すんだよね。
ということで、最低限の行動ってのが多分必要。
それがさっきのルールに従い例えばこんなの作ると、大変。

[判断][前][敵]
	[攻撃][1]
	[goto][最初]
[判断][左][敵]
	[回転][左]
	[goto][最初]
[判断][右][敵]
	[回転][右]
	[goto][最初]
[判断][前][障害物無し]
	[移動][前][1]
	[goto][最初]
[判断][左][障害物無し]
	[回転][左]
	[goto][最初]
[判断][右][障害物無し]
	[回転][右]
	[goto][最初]
[判断][後][障害物無し]
	[回転][後]
	[goto][最初]

せめてこの程度にはしたい。

[判断][接敵][前]
	[攻撃][1]
[判断][敵方向][前方]
	[移動][前][1]
[回転][敵方向]

AI戦闘ものだと索敵効率がすごく重要になるから、もっと複雑であっていいんだけど、状況判断はAI実行前からある程度出来てて、その上でどの行動を選択するか程度にしないと、行動選択を適切にさせたいのか、回路を組ませたいのかわからんくなる。
今回だと俺はカルネージハートを作りたいんじゃなくてファーストクイーンを作りたいわけで、行動選択のが重要。


てことで、この程度のものを最低セットにしつつ、拡張の思考回路をどう組み込ませるかってのが重要かなと。
例えば囲まれてる状況を嫌うAIなら、前方にいる敵を殴るより状況判断によって退却を優先するはずなので、[判断][接敵][前][以外] → [移動][後][1]を入れるとか。
遠距離攻撃のAIだと、[判断][接敵][前] → [移動][後][1] → [攻撃][1]とか。


作って、、

みた、と、いつものように一日作業でざっとあげたいとこなんだけど、正直苦戦しとる。
なんか全然浮かばねぇなぁと思ったんだけど、考えてみたら俺AIのプログラムまともに書いた事ないんだった。
そらまあif (this.hp < 90) { this.escape(); }みたいなプログラム直書きなり、ソーシャルゲームとかを自動で遊んだりするBOT程度ならあるけど、汎用的なのってよく考えたらないんだよ。遊ぶ方では結構やったけど。


特に条件分岐と状況伝達の汎用的な設計がもんげーむずいっす。このAIエンジンだけで2,3日かかりそう。
出来上がる前に嫁の陣痛始まる予感がちらほら。。


しかしファーストクイーンすげぇよなぁほんと。
俺もせめて現代のCPUの力借りて、少しでも近づけるように頑張る。