robocode・Melee&チーム戦
Melee戦
基本的には1vs1と変わらないが中央は明らかに不利なのでフィールド中心に大きな反重力点を置と効果的。
勝ち残って1vs1になったら解除すればよい。
また処理量の問題で1vs1よりパターン解析の量を減らす。
チーム戦
チーム内の機体間では自由に通信が行える。これを駆使してチーム連携を取る。
- 編成
- 間違いなくHPが多い方が有利だろう。迷わずドロイド機を組み込む
レーダーの数は実機にしてから決定する。
(リーダー + ドロイド x 2 or リーダー+ドロイド+通常)
- 敵スキャン情報
- レーダ機は敵をスキャンした際全員に報告する。
- 味方情報
- 毎tick自分の情報を味方に報告する。
- 味方弾回避
- 避けられる同士討ちは避ける。射撃時は味方に座標+角度+速度を報告。この情報を元に各自味方弾の到達座標を割り出し回避可能。
- 弾情報を共有
- 味方弾や敵弾との相殺や被弾が起きた場合、弾の情報を消す為に味方全員に通知する。
敵弾の場合は正確な情報が解らないのだが予想発射時刻と発射地点の情報を元に特定する。
- 敵移動タイプ・射撃タイプを共有
- 敵の移動情報や被弾時には敵の射撃タイプが解るので味方に通知。
- 飽和攻撃
- 優れた回避能力を持つ機体に15%もの弾を当てるのは困難。
しかし味方全員で敵1機を面攻撃する事で物理的に回避不能な状況を作り出す。
これもリーダ機の命令に従う。
- ドロイド機
- 最後にドロイド機が残ると何も出来なくなる。
価値のある危険地域には積極的に突っ込ませる。
- お遊び
- 整列したり。ドロイド機を特攻させたり。発砲禁止させてみたり。。
注意点
- 通信遅延
- 味方間のメッセージ通信には1tickかかる。敵情報や弾情報は1tick分補正して使わないと誤差が出てしまう。
- 弾相殺
- 味方弾や自分の弾同士でも相殺が起きる。避ける為にも弾の軌道計算が必要。
public Pair<Double,Double> calcCollisionDistance(MovingPoint p1 , MovingPoint p2) { double s1 =Math.sin(p1.headingRadians); double c1 =Math.cos(p1.headingRadians); double s2 =Math.sin(p2.headingRadians); double c2 =Math.cos(p2.headingRadians); double d2 = (p2.y * s1 - p1.y * s1 + p1.x * c1 - p2.x * c1) / (s2 * c1 - c2 * s1) ; :
中学生レベルの数学の話になるが、とある連立方程式を解くとp1,p2の交点までのp2からの距離d2が得られる。
するとp1 , p2が衝突するか否かを判定できる訳だが・・・
なぜか20程度の距離があっても衝突する場合がある。
どうやらrobocodeでは毎ターン
- 弾を一つ動かす
- 他の弾に衝突するか否か?
- 別の弾を一つ動かす
:
といった具合に衝突判定してるっぽい。
という訳で完全な衝突判定は無理そう。。
それでも少しでも相殺が減れば儲けモノなので組み込む。
- 味方機は各々敵の射撃タイプや移動の分析を行っているがリーダ機が統合すべきか否か
- 現在はパターンマッチは常にノイズの危険がある。今の所リスク分散している。