コンテンツにスキップ

壁ごしに撃たない

敵との間に壁があるときは、撃たないようにします。弾の無駄が減ります。

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

かんたんブロックの並び:見えているときだけ撃つ

「👁 敵が見える」かつ「🎯 ねらいが合っている」のときだけ撃ちます。「かつ」は第 4 章で手に入ります。

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

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

見えているときだけ撃つ
def update(state):
me = state.me
en = state.enemy
want = angle_to(me.x, me.y, en.x, en.y)
合っている = abs(angle_diff(want, me.angle)) < 5
# 自分から敵まで、壁にさえぎられていないか
見える = line_of_sight(state.map.grid, me.x, me.y, en.x, en.y)
return {"drive": "forward", "steer": want, "fire": 見える and 合っている, "barrier": False}

line_of_sight は、2 点を結ぶ線が、壁(木箱・鉄)を通るかを調べます。 通らなければ True です。

  • 木箱と鉄は、視線をさえぎります
  • 水たまりは、さえぎりません(弾が上を通るからです)

計算は、線が通るマスを 1 つずつたどる方法(DDA)です → 視線判定と DDA

  • 見える and を消して、撃った弾の数がどれだけ変わるか、分析画面の「射撃距離 × 命中」で見てみましょう
  • 「見えないとき」は、何をしたらよいでしょうか → 見えない敵を探す
  • state.map.grid を、自分で読むとき。 grid[y][x] の順です(Y が先)。逆にすると、別のマスを見てしまいます
  • 見えているのに、撃たない。 向きが合っていないだけかもしれません。合っているprint で確かめましょう(組み込みの道具