飛んでくる弾をよける
やりたいこと
Section titled “やりたいこと”自分に飛んでくる弾を見つけて、当たる前に横へよけます。
かんたんブロックで作る
Section titled “かんたんブロックで作る”第 3 章までに手に入る部品で作れます。
「💨 弾がとんでくる(もうすぐ)」なら、「↪ 弾をよける向き」を向いて進みます。そうでなければ、敵をねらいます。
ブロックは、上から順に、0.1 秒ごとに読まれます(まちがえやすい 4 つのルール)。
Python だとこう書く
Section titled “Python だとこう書く”同じ作戦を、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.2を0.6に変えると、どうなるでしょうか。よけるのが遅すぎると、当たります+ 90を- 90にすると、反対側へよけます。どちらが有利かは、壁の位置しだいです
うまくいかないとき
Section titled “うまくいかないとき”- 壁にぶつかって、よけきれない。 壁ぎわでは、ほかの向きへ逃げる工夫が要ります
- 弾を正面から受けそう。 よけきれないときは、バリアを使います
- バリアで弾を防ぐ
- 全項目 → state リファレンス