中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

robocode・砲塔&射撃

砲塔&射撃の基礎

砲塔回転と自機予測

案外軽視されがちな重要な要素がある。

『狙いをつけて撃つ』は『砲塔を回して撃つ』という事
砲塔を回すには最低1 tick必要。
1 tick で自機も敵機も最大8dot移動する。
その時には既に狙うべき角度は違う。
微修正しようにもまた1 tickかかる・・・
だから砲塔は少なくとも1tick後に最適な角度になるよう見越して回転させなけれは正確な射撃が出来ない。

正確な射撃
敵を予測するのは勿論だが、まず自機の次のターンの位置・向きを正確に予測する必要がある!!
これを怠ると静止した敵すら外す事もあるので注意。


RobocodeではHit率15%前後で戦う事になる。滅多に当たらない弾をこんな取り零しは痛すぎる。




小さい白点が自機の予測軌道。単純な等加速度運動予測ではなく思考ルーチンを仮想未来戦況で実際に走らせているのでかなりランダム要素以外は正確に予測できる。
処理量的には無理をしているのだがそれだけの価値があると見た

細かく見ると、緑太丸の先で白点の間隔が詰まっており15〜20tick程度未来に減速する事が解る。
おそらくコレはその先の敵射線上の敵弾がその時間帯に通過する為、回避ロジックが作動した結果を示している。
これで20tick後を見越した戦略が立てられるようになる訳だ。

射撃と索敵の基本動作

射撃時には弾パワーに応じた砲塔熱量を受ける。次弾は熱量が無くなるまで撃てない。
この時間を利用して前述の広域索敵を行う。
1セット広域索敵を終える頃には次弾の撃ち時になっている筈だ。

ロックオン(2〜3tick)=>射撃=>索敵(12tick)=>ロックオン=>射撃=>索敵・・・

当てる戦略

射撃モード

基本モード3種を用意し、着弾時にターゲットの軌道を再評価し用意した射撃モードをスコアリングする。

ピンポイント射撃
原始的に今敵のいる場所を狙う。
細かく震えて高度な射撃を惑わすタイプやこちらの射撃に反応し折り返すタイプに有効。


当然動いている目標には効果無し
低性能な敵やこちらの射撃に反応してくるタイプの敵には有効な場合がある。

ピンポイント機(jar)

慣性偏差射撃
敵が等速直線運動しているものとして偏差射撃。
加減速を繰り返しながら大きく移動するタイプに有効


SpinBotの様な加速度運動を狙うとこの様に明後日の方向に撃ってしまう。
一見全く使え無そうだがレーダ1回で良いのとジグザグ軌道や単純な反重力移動には効果があったりする。(加速度に惑わされない)

慣性偏差撃ち機(jar)

加速度偏差射撃
敵が等加速度運動しているものとして偏差射撃。
基本射撃。大部分はコレで撃つ。SpinBotなど円運動するタイプには必須。


SpinBotにも普通に当たる。
パターンが集まるまでの主力。

加速度偏差撃ち機(jar)

スコアリング
普通は機械学習を用いたい所だが処理時間に制限があるので簡易な方法を考案した。
(現スコア*9+今回スコア)/10
最新データは常に1/10の影響力も持つ。
2番目に新しいデータは9/100の影響力を持つ・・・
といった具合に過去データほど影響力が小さくなるが影響を残し続ける

※実際のスコアリングの基数は10ではなく最適化した。

より高度な射撃

より弾を当てる為にはパターン予測を行う。