議会制弾幕回避機関

説明

CPUによるシューティングの弾幕回避アルゴリズムに関する考察と、実際に実装したもの
(白い弾幕くんに組みこんだだけですが)の紹介です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

更新情報

 ・ 020810. 公開。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

詳細説明

では、詳しい説明をします。

目標

まず、CPUの目標を考えます。普通、人間の弾避けの目標は死なないこと、です。しかし
、ゲーム内の情報を全て持っているCPUにとって、死なないことは造作も無いことです。
つまり、次のフレームで弾に当ってしまう時にだけ、適当な方向に回避すれば良いので
す。 (もっとも、昨今の当り判定の小さい弾幕シューティングにしか通用しない議論で
すが)

白い弾幕くんをダウンロードして、 save/conf ファイルの veto と書いてある行以外を
全て削除するなり # を頭に付けるなりすれば、その完璧な回避を見ることができます。
(このファイルの説明は後程に)

ということで、死なない、は前提として、それ以外の目標を考えることになります。私
がちょっと考えたものでは以下のようなものがあります。

 ・ 得点を稼ぐ。
 ・ 内部情報を使わないで避ける。
 ・ 人間らしく避ける。

一つ目は非常に面白い問題だと思います。予測される成果として、パターン性の強いゲ
ームでは、学習させることによって、全一も夢では無いのではないかと思っています。
ただ、私はまともな弾を撃って稼ぐシューティングを作っていないので、今回はやめま
した。いずれ、ソースが公開されているシューティングを使って取りくんでみたい問題
です。

二つ目は、面白いとは思いますが、図形認識などの分野であって、なんかシューティン
グの問題では無くなってしまうのでやめました。つうかそんな気合いの入ったもの作れ
ません。作ることができれば、ありとあらゆるシューティングに外部から組みこんだり
できそうですが…でも多分現在のマシンではスペック不足でしょう。

で、三つ目に取りくんでみました。三つ目の予測される成果としては、人間のお手本に
なれるかもしれないということと、最初に示した回避方法よりも死ににくくなるかもし
れない、ということがあります。死ににくくなる、というのは、最初のアルゴリズムで
も、完全に8方を弾で埋め尽されてしまえば当ってしまうので、人間らしい、追いこまれ
ることを嫌う避け方をすれば 8方を塞がれる確率が減ることが予測されるからです。ま
あ、何よりもちょこまか頑張って避けるCPUを見るのは楽しいもんです。

実現方法

弾避けには様々なセオリーがあります。例えば、怒首領蜂道中によくある雑な自機狙い
弾が多いところでは大きく動いて切り返しを多用する、とか、大量の正確な自機狙い弾
が来るところでは、少しずつ動いて追いつめられないようにする、とかです。しかし、
この二つの例を見れば解る通り、それらのセオリーは、排反した性質を持つものも多く
、汎用的な弾避けアルゴリズムというものは、 (非人間的なものを除けば) 恐らく存在
しません。

そこで、行動パターンを何種類か用意して、それらを選択することになります。これに
よって様々な弾に対応することができるのですが、ばらまき＋自機狙い弾など、複数の
回避パターンを混ぜる必要が出てくることに気付きます。

と、書いてきたような経緯で思いついたのが、今回実装した、議会制の弾幕回避アルゴ
リズムです。この議会には、弾幕の特定の要素だけに注目した議員が参加し、それぞれ
勝手な意見を、意見に対する自信と共に述べます。その意見を議長がまとめあげて全体
の方針とします。

ちなみにこの意見というのは8方向に動くのと動かないのとで9択です。

意見に自信という要素による重み付けをすることによって、各弾幕に対して適切な処理
を行える可能性が増します。

例を一つ。先程の雑な自機狙い弾中心の弾幕が来ていて、大きく動いて切り返すことを
考えるアルゴリズムが、「右しか無いべ」と言い、少しずつ動くことを考えるアルゴリ
ズムが、「自信無いけど左かな」とでも言えば、議長は「まあ右かなあ」と判断する、
というようなイメージです。

現実にこんな非民主的なシステムがあったら怖いんですが、弾幕回避には、まあ、一定
有効なようです。

各アルゴリズム(議員)

では各アルゴリズムをご紹介。

議長のひと

一応プログラム的には別の議会の議員になれます。なんか意味があるかわかりませんが
。

既に説明済みですが、各議員の意見に自信係数を乗算したものが議長の意見となります
。

拒否するひと (veto)

一番最初に紹介した殆ど死なないアルゴリズムです。普段はなんら意見を言いませんが
、特定方向に動くと死ぬときにだけ、その方向を強く拒否します。

拒否権を持っている特殊な議員です。非常に自信の強い人なので、他が何を言おうとこ
のアルゴリズムが拒否すればその方向は採用されません。とんでもなく非民主的な人で
すが、こいつのおかげで、こいつが参加する議会は、8方向を閉ざされるまで死にません
。

反射のひと (reflection)

後先のことは考えず、現在の危険度のみを考え、その危険度が少なくなる方向を好みま
す。

危険度は、全ての弾に対して、自機に対する角度が少なければ少ない程危険で、速度が
速い程危険で、距離が近い程危険になるように評価し、その加算によって算出します。

全体的にどんな弾幕でもうまく避け、特に広範囲ばらまき弾や、誘導弾などの特殊な弾
幕には強いのですが、後先考えずふらふら動くだけであまり大きく動かないので、一つ
ところで避けていると地獄が来る自機狙い弾に多少弱いです。

自機狙い弾に対して自信値が低くなるようにしても良いと思うのですが、イレギュラー
な流れ弾なんかの処理もできるので、自信値は常に定数でかなり高目になっています。

忘れるひと (oblivion)

いわゆるこんこん避けです。命名は不適切な感じがしますが、発生した弾をこんこんし
て処理したことによって忘れる、というイメージで命名したものです。

弾の発生によって、それが自機狙い弾であれば、それを避けるのに必要な時間、着弾ま
での時間を計算し、回避開始前と回避終了時に少しずつ間があくような時間の予定で、
その弾の垂直方向に回避する計画を立てます。この予定は新たな弾の発生や、端への到
着で調整します。

完全に自機狙い弾だけをターゲットに絞ったアルゴリズムです。よって、自信値は自機
狙い弾の弾数全体に対する比率で決定します。

白い弾幕くんの、プロギア一面ボス弾なんかは完璧に避けます。まあ、反射するひとの
弱いところを補うつもりで作ったので、明確に自機を狙う弾が無いと、ずっと黙ってい
ます。

切り返すひと (roundtrip)

弾も何も見ず、狂ったように切り返しで左右を往復したがる人です。自機狙い気味ばら
まき弾が多い時に自信値が高くなります。また、高い時でも自信値は他に比べて低くな
っています。

今までの三人と違い、単体では弾幕回避能力は皆無です。なんせ弾を見てないので。が
、他の回避アルゴリズムと組み合わさるとかなり効果を発揮します。まあ、どっち行っ
ても大差ないならあっちに行ってくれ、というような意見を常に言っている感じで、結
果としては、弾をくぐりながら切り返しを行ってくれます。

場所取りのひと (position)

こいつも弾を気にせず、角・辺に追い詰められるのと、上の方に行くことだけを気にす
るひとです。切り返すひとと似たような効果が現れます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

操作

白い弾幕くんを起動して、セレクトモードで適当な弾幕を選び、自機の操作を cpu にす
れば OK です。

save/cpuconf にどのアルゴリズムを議員にするかが書いてあります。名前を削除すれば
そのひとは意見を言わなくなります。

cpuが操作するとロゴとか弾幕のスクリーンショットが出るところに、フレームごとのそ
れぞれの意見がグラフとして表示されます。

[cpu]

この場合次のフレームは右上の方に移動すると思います。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

TODO

本当にやるかは不明。

適当に人工無能っぽいものを作って、議員同士が会話する、とか。上行こ上、いや上は
あかん、下や、みたいな会話ができればかっこいいのだが。視覚化しないと地味ですし
。

大量の自機狙い弾に埋もれることがあるのでなんとかしたい。反射は優秀なアルゴリズ
ムなんで自信値を減らすのは慎重になってしまう。

広い視点で、弾の密度の低い方向を好むアルゴリズム。意味があるかは深く考えてませ
ん。

弾源を嫌うアルゴリズム。炸裂弾とかに弱いからなあ。敵本体に当り前のように近づく
し。

次のターンに逆方向に動くならその二ターンは静止させる。プルプル震えているのは非
人間的なので。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
g940455@mail.ecc.u-tokyo.ac.jp
                                                                   shinichiro.h
