コンテンツにスキップ

バリアで弾を防ぐ

よけきれない弾を、バリアで防ぎます。

項目
使える回数1 試合に 3 回
続く時間2.0 秒
守る範囲正面から左右 45 度だけ
張っているあいだ動きが半分・撃てない

後ろと横は守りません。 だから、「危ないから、とりあえず張る」では防げません。 弾が飛んでくる方を向いてから張る必要があります(たまとバリア)。

第 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]
弾の方向 = 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.51.0 に変えると、バリアの時間(2.0 秒)を早く使いすぎます。回数は 3 回だけなので、むだづかいに注意しましょう
  • 弾を正面で受けるか、直角によけるか。よける版と、同じ相手で比べてみましょう
  • バリアを張ったのに、当たった。 そのときの弾の向きを、試合画面を 1 コマずつ見て確かめましょう。正面 45 度からはずれていませんか
  • 張れない。 barrier_count が 0、または barrier_cooldown が 0 ではありません