コンテンツにスキップ

飛んでくる弾をよける

自分に飛んでくる弾を見つけて、当たる前に横へよけます

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

かんたんブロックの並び:弾が来たら横へよけ、来なければ敵をねらう

「💨 弾がとんでくる(もうすぐ)」なら、「↪ 弾をよける向き」を向いて進みます。そうでなければ、敵をねらいます。

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

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

いちばん危ない弾から、直角によける
def update(state):
me = state.me
en = state.enemy
# 飛んでくる弾があるとき
if len(state.incoming_missiles) > 0:
m = state.incoming_missiles[0] # いちばん先に当たる弾
if m.eta < 1.2: # あと 1.2 秒以内に届く
弾の方向 = angle_to(me.x, me.y, m.x, m.y)
# 弾に対して直角に、進んでにげる
return {"drive": "forward", "steer": 弾の方向 + 90, "fire": False, "barrier": False}
# 弾がなければ、敵をねらう
want = angle_to(me.x, me.y, en.x, en.y)
合っている = abs(angle_diff(want, me.angle)) < 5
return {"drive": "stop", "steer": want, "fire": 合っている, "barrier": False}
  • state.incoming_missiles は、自分に飛んでくる弾のリストです
  • eta の小さい順(危ない順)に並んでいます。incoming_missiles[0] が、いちばん先に当たる弾です。この順番は仕様なので、頼ってかまいません
  • eta は、その弾が自分にいちばん近づくまでの秒数です
  • 弾に直角+ 90)に進むと、弾の通り道から外れます

はね返ったあとの弾も、ここに入ります。壁の向こうから、はね返って飛んでくる弾も見つけられます(跳弾のしくみ)。

障害物のない広場で、13 マス離れた砲台(こちらを狙って撃ちつづける役)と、20 秒間向かい合わせました。

当たった弾結果
立ったまま(撃たない)3 発(相手が 4 発撃ったうち)HP 0 で負け
この bot(よける)0 発HP 3 のまま

「弾が来たら横へ」だけで、1 発も当たらずにすみました。

  • 1.20.6 に変えると、どうなるでしょうか。よけるのが遅すぎると、当たります
  • + 90- 90 にすると、反対側へよけます。どちらが有利かは、壁の位置しだいです
  • 壁にぶつかって、よけきれない。 壁ぎわでは、ほかの向きへ逃げる工夫が要ります
  • 弾を正面から受けそう。 よけきれないときは、バリアを使います