コンテンツにスキップ

縮小エリアで生き残る

残り 20 秒からせまくなるフィールドで、壁につぶされないようにします。

  • 残り 20 秒(40 秒経過)から、2.5 秒ごとに 6 回、まわりが鉄の壁に変わっていきます
  • 最後に残るのは、まん中の 8 × 3 マスだけです
  • 壁に変わるマスにいると、その場で HP が 0 になります(即死)

くわしくはフィールドと地形にあります。

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

かんたんブロックの並び:縮小エリアでは、まん中へ向かう

「⬛ エリアがせまくなっている」かつ「🧱 かべぎわ」なら、「⊙ まん中」を向いて進みます。そうでなければ、いつもの作戦です。

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

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

安全な範囲の中にいつづける
def update(state):
me = state.me
en = state.enemy
s = state.shrink
# 安全な範囲の、ふちから 1 マス以内にいるか
ふち = (
me.grid_x < s.min_x + 1 or me.grid_x > s.max_x - 1
or me.grid_y < s.min_y + 1 or me.grid_y > s.max_y - 1
)
# 縮小がはじまったら、ふちを離れて、安全な範囲の中心へ
if s.active and ふち:
cx = (s.min_x + s.max_x + 1) / 2.0
cy = (s.min_y + s.max_y + 1) / 2.0
go = angle_to(me.x, me.y, cx, cy)
return {"drive": "forward", "steer": go, "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.shrink.active:縮小がはじまったか
  • min_x max_x min_y max_y:いまの安全な範囲(マスの番号)
  • next_in:次にせまくなるまでの秒数

ふちから 1 マス以内にいるときは、次の縮小でつぶされるおそれがあります。 その前に、中心へ向かいます

範囲の中心は (min_x + max_x + 1) / 2 です。max_xマスの番号(そのマスの左端が max_x)なので、マスの右端まで数えるために + 1 します。

動かない CPU「アイドル」と、撃ち合いをせずに 1 試合(60 秒)戦わせました。左右を入れかえて、いつものマップ 60 試合です。

60 秒のあいだに、縮小で HP 0 になった試合
立ったまま(撃たない)60 / 60(相手も HP 0 になり、引き分け)
この bot0 / 60(相手だけが縮小で倒れた)
  • + 1 の余裕を + 2 にすると、早めに中心へ向かいます。早く動きすぎると、その間は撃てません
  • サプライ(state.supply)は、まん中に出ます。縮小と、サプライを取りに行く動きは、同じ向きです
  • 隅にいて、そのまま負けた。 s.active は、縮小がはじまるまで False です。それまでにいた場所が、縮小で壁になるかもしれません
  • 中心へ向かう途中で、敵の弾に当たる。 中心へ向かうあいだも、弾のよけかたが必要です