バリアで弾を防ぐ
やりたいこと
Section titled “やりたいこと”よけきれない弾を、バリアで防ぎます。
バリアの決まり
Section titled “バリアの決まり”| 項目 | 数 |
|---|---|
| 使える回数 | 1 試合に 3 回 |
| 続く時間 | 2.0 秒 |
| 守る範囲 | 正面から左右 45 度だけ |
| 張っているあいだ | 動きが半分・撃てない |
後ろと横は守りません。 だから、「危ないから、とりあえず張る」では防げません。 弾が飛んでくる方を向いてから張る必要があります(たまとバリア)。
かんたんブロックで作る
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] 弾の方向 = angle_to(me.x, me.y, m.x, m.y) 使える = me.barrier_count > 0 and me.barrier_cooldown == 0
# 弾がすぐ届くなら、弾のほうを向いてバリアを張る if m.eta < 0.5 and 使える: return {"drive": "stop", "steer": 弾の方向, "fire": False, "barrier": True}
# まだ遠いなら、弾のほうを向いて待つ if m.eta < 1.2: return {"drive": "stop", "steer": 弾の方向, "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}me.barrier_count:残りの回数。me.barrier_cooldown:次に使えるまでの秒数です。どちらも満たすときだけ張れますsteerに弾の方向を入れて、正面を弾に向けます- 向きを変えるのには時間がかかります(1 秒で 180 度まで)。弾が来る前から、向きを直しはじめます
障害物のない広場で、13 マス離れた砲台(こちらを狙って撃ちつづける役)と、20 秒間向かい合わせました。
| 当たった弾 | 結果 | |
|---|---|---|
| 立ったまま(撃たない) | 3 発(相手が 4 発撃ったうち) | HP 0 で負け |
| この bot(弾のほうを向いてバリア) | 0 発 | HP 3 のまま |
「弾のほうを向いてから張る」が、うまく働いています。
0.5を1.0に変えると、バリアの時間(2.0 秒)を早く使いすぎます。回数は 3 回だけなので、むだづかいに注意しましょう- 弾を正面で受けるか、直角によけるか。よける版と、同じ相手で比べてみましょう
うまくいかないとき
Section titled “うまくいかないとき”- バリアを張ったのに、当たった。 そのときの弾の向きを、試合画面を 1 コマずつ見て確かめましょう。正面 45 度からはずれていませんか
- 張れない。
barrier_countが 0、またはbarrier_cooldownが 0 ではありません