壁ごしに撃たない
やりたいこと
Section titled “やりたいこと”敵との間に壁があるときは、撃たないようにします。弾の無駄が減ります。
かんたんブロックで作る
Section titled “かんたんブロックで作る”第 4 章までに手に入る部品で作れます。
「👁 敵が見える」かつ「🎯 ねらいが合っている」のときだけ撃ちます。「かつ」は第 4 章で手に入ります。
ブロックは、上から順に、0.1 秒ごとに読まれます(まちがえやすい 4 つのルール)。
Python だとこう書く
Section titled “Python だとこう書く”同じ作戦を、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
試してみよう
Section titled “試してみよう”うまくいかないとき
Section titled “うまくいかないとき”state.map.gridを、自分で読むとき。grid[y][x]の順です(Y が先)。逆にすると、別のマスを見てしまいます- 見えているのに、撃たない。 向きが合っていないだけかもしれません。
合っているをprintで確かめましょう(組み込みの道具)