縮小エリアで生き残る
やりたいこと
Section titled “やりたいこと”残り 20 秒からせまくなるフィールドで、壁につぶされないようにします。
- 残り 20 秒(40 秒経過)から、2.5 秒ごとに 6 回、まわりが鉄の壁に変わっていきます
- 最後に残るのは、まん中の 8 × 3 マスだけです
- 壁に変わるマスにいると、その場で HP が 0 になります(即死)
くわしくはフィールドと地形にあります。
かんたんブロックで作る
Section titled “かんたんブロックで作る”第 5 章までに手に入る部品で作れます。
「⬛ エリアがせまくなっている」かつ「🧱 かべぎわ」なら、「⊙ まん中」を向いて進みます。そうでなければ、いつもの作戦です。
ブロックは、上から順に、0.1 秒ごとに読まれます(まちがえやすい 4 つのルール)。
Python だとこう書く
Section titled “Python だとこう書く”同じ作戦を、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_xmax_xmin_ymax_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 になり、引き分け) |
| この bot | 0 / 60(相手だけが縮小で倒れた) |
試してみよう
Section titled “試してみよう”+ 1の余裕を+ 2にすると、早めに中心へ向かいます。早く動きすぎると、その間は撃てません- サプライ(
state.supply)は、まん中に出ます。縮小と、サプライを取りに行く動きは、同じ向きです
うまくいかないとき
Section titled “うまくいかないとき”- 隅にいて、そのまま負けた。
s.activeは、縮小がはじまるまでFalseです。それまでにいた場所が、縮小で壁になるかもしれません - 中心へ向かう途中で、敵の弾に当たる。 中心へ向かうあいだも、弾のよけかたが必要です
- 命令数を使いすぎない
- フィールドの決まり → フィールドと地形