動く敵に当てる
やりたいこと
Section titled “やりたいこと”動いている敵に、弾を当てます。
なぜ、まっすぐ撃つと当たらないのか
Section titled “なぜ、まっすぐ撃つと当たらないのか”弾は 8 マス/秒で飛びます。届くまでに、敵は動いています。 撃った瞬間の位置を狙うと、弾が着いたときには、敵はもうそこにいません。
かんたんブロックで作る
Section titled “かんたんブロックで作る”第 4 章までに手に入る部品で作れます。
「🧭 🔮 敵の動く先 の方を向く」が、先読み射撃です。弾が着くころに敵がいそうな場所を、ゲームが計算して向いてくれます。
ブロックは、上から順に、0.1 秒ごとに読まれます(まちがえやすい 4 つのルール)。
Python だとこう書く
Section titled “Python だとこう書く”同じ作戦を、Python で書くとこうなります。ブロックになれたら、文字でも書いてみましょう。
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}predict_leadに、敵・弾の速さ(8.0)・自分の位置を渡します- 弾が届くころの敵の位置
(tx, ty)が返ります - 敵ではなく、その点のほうを向いて撃ちます
predict_lead の中では、敵の速度 vx vy を使った方程式を解いています。
まず自分で書いてみると、よく分かります → 偏差射撃
障害物のない広場で、13 マス離れた的がまっすぐ横切るところを撃たせて、当たった数を数えました(3 通りの位置)。
| 撃った弾 | 当たった弾 | |
|---|---|---|
| 敵をそのまま狙う(敵のほうを向く) | 15 発 | 0 発 |
predict_lead で先まわりする(この bot) | 12 発 | 5 発 |
試してみよう
Section titled “試してみよう”predict_leadを使わない版(want = angle_to(me.x, me.y, en.x, en.y))と、同じ相手に 20 回ずつ戦わせて、分析画面の命中率を比べましょう- 相手を、動かない「アイドル」から、追いかけてくる「チェイサー」に変えてみましょう(CPU 8 体のくせ)
うまくいかないとき
Section titled “うまくいかないとき”- 止まっている敵にも、当たらなくなった。 当てられないときは、敵のいまの位置が返ります。ふつうは、まっすぐ狙うのと同じ結果になるはずです
- 向きが合う前に撃ってしまう。 「向きが合っているか」の条件(
< 3)を確かめましょう