コンテンツにスキップ

動く敵に当てる

動いている敵に、弾を当てます。

なぜ、まっすぐ撃つと当たらないのか

Section titled “なぜ、まっすぐ撃つと当たらないのか”

弾は 8 マス/秒で飛びます。届くまでに、敵は動いています。 撃った瞬間の位置を狙うと、弾が着いたときには、敵はもうそこにいません。

第 4 章までに手に入る部品で作れます。

かんたんブロックの並び:先読みして撃つ

「🧭 🔮 敵の動く先 の方を向く」が、先読み射撃です。弾が着くころに敵がいそうな場所を、ゲームが計算して向いてくれます。

ブロックは、上から順に、0.1 秒ごとに読まれます(まちがえやすい 4 つのルール)。

同じ作戦を、Python で書くとこうなります。ブロックになれたら、文字でも書いてみましょう。

predict_lead で、先まわりして撃つ
def update(state):
me = state.me
en = state.enemy
# 弾が届くころに、敵がいる場所
tx, ty = predict_lead(en, 8.0, me.x, me.y)
want = angle_to(me.x, me.y, tx, ty)
合っている = abs(angle_diff(want, me.angle)) < 3
return {"drive": "stop", "steer": want, "fire": 合っている, "barrier": False}
  1. predict_lead に、敵・弾の速さ(8.0)・自分の位置を渡します
  2. 弾が届くころの敵の位置 (tx, ty) が返ります
  3. 敵ではなく、その点のほうを向いて撃ちます

predict_lead の中では、敵の速度 vx vy を使った方程式を解いています。 まず自分で書いてみると、よく分かります → 偏差射撃

障害物のない広場で、13 マス離れた的がまっすぐ横切るところを撃たせて、当たった数を数えました(3 通りの位置)。

撃った弾当たった弾
敵をそのまま狙う(敵のほうを向く15 発0 発
predict_lead で先まわりする(この bot)12 発5 発
  • predict_lead を使わない版(want = angle_to(me.x, me.y, en.x, en.y))と、同じ相手に 20 回ずつ戦わせて、分析画面の命中率を比べましょう
  • 相手を、動かない「アイドル」から、追いかけてくる「チェイサー」に変えてみましょう(CPU 8 体のくせ
  • 止まっている敵にも、当たらなくなった。 当てられないときは、敵のいまの位置が返ります。ふつうは、まっすぐ狙うのと同じ結果になるはずです
  • 向きが合う前に撃ってしまう。 「向きが合っているか」の条件(< 3)を確かめましょう