議会制弾幕回避機関

since: 2002-08-11 update: 2003-03-24 count:

説明

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


更新情報


ダウンロード

白い弾幕くん に組みこんだのでそちらでダウンロードして下さい。

セレクトモードで適当な弾幕を選んで、自機の操作を cpu にすれば OK です。


詳細説明

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

目標

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

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

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

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

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

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

実現方法

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

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

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

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

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

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

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

各アルゴリズム(議員)

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

議長のひと

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

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

拒否するひと (veto)

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

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

反射のひと (reflection)

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

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

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

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

忘れるひと (oblivion)

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

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

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

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

切り返すひと (roundtrip)

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

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

場所取りのひと (position)

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

ひと (human)

一つ目のボタンを押しながら十字キーを押すと意見を言えます。 白い弾幕くんのコンフィグでその影響力を調整できます。 発言権を大にするとほとんど自分で操作してるけど、 なんか絶対死なないな、ってモードといったところです。 発言権中はなんか微妙にままならんぞ、って感じです。 発言権小だと大まかな方向性しか指示できません。

査察するひと (inspection)

弾幕の評価を下します。全く操作には関与しません。


操作

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

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

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

CPU の動いているさま

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


TODO

本当にやるかは不明。

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

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

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

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

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


home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h