4 つの入力
あなたの担当 update が返す 4 つの入力です。速さや回る速さの数字は、エンジンが決めた変えられない決まりです。
update は、4 つの入力を辞書にして返します。
def update(state): return { "drive": "forward", # 進む・下がる・止まる "steer": 90.0, # 向きたい角度 "fire": True, # 撃つか "barrier": False, # バリアを張るか }| 入力 | 入れるもの | 意味 | 書かなかったとき |
|---|---|---|---|
drive | "forward" "backward" "stop" | 前に進む・後ろに下がる・止まる | 前回のまま |
steer | 数(度) | 向きたい角度そのもの(0 = 右、90 = 下、180 = 左、270 = 上) | 前回のまま |
fire | True / False | 撃つ | しない |
barrier | True / False | バリアを張る | しない |
エンジンの側の決まり(あなたには変えられない)は、次のページにあります。
| 入力 | 決まり | くわしく |
|---|---|---|
drive | 前進 3.0 マス/秒、後退 1.5 マス/秒。加速はなく、すぐ動いてすぐ止まる | タンクのうごかしかた |
steer | 1 秒でおよそ 180 度までしか回れない。体と砲身はいっしょに回る | タンクのうごかしかた |
fire | 1.2 秒に 1 発。撃てないときは無視される(エラーにならない) | たまとバリア |
barrier | 1 試合に 3 回・2 秒間。正面 ±45 度だけを守る。張っている間は撃てず、動きは半分 | たまとバリア |
steer は「向きたい角度」
Section titled “steer は「向きたい角度」”steer には、向きたい角度そのものを入れます。「右に 30 度まわる」ではなく、「30 度の方を向く」です。
自分の向きから何度ずらすか、ではありません。目指す向きです。
def update(state): # 敵のいる方を向く want = angle_to(state.me.x, state.me.y, state.enemy.x, state.enemy.y) return {"drive": "forward", "steer": want, "fire": False, "barrier": False}角度を出す道具は angle_to です。自分で三角関数を使わなくて済みます。
fire はずっと True でいい
Section titled “fire はずっと True でいい”撃てないときの True は、ただ無視されます。
だから fire: True のままにしておけば、撃てるようになった瞬間に撃ちます。
ただし向きが合っていないのに撃つと、弾の無駄になります。
def update(state): me = state.me en = state.enemy want = angle_to(me.x, me.y, en.x, en.y) # 向きが 5 度以内に合ったときだけ撃つ 合っている = abs(angle_diff(want, me.angle)) < 5 return {"drive": "stop", "steer": want, "fire": 合っている, "barrier": False}入力を変数に入れて、最後にまとめて返す
Section titled “入力を変数に入れて、最後にまとめて返す”作戦が複雑になったら、4 つを変数に入れて、最後にまとめて返す形が読みやすくなります。 かんたんブロックが作る Python も、この形です。
def update(state): me = state.me en = state.enemy
# さいしょの値 drive = "stop" steer = me.angle fire = False barrier = False
# 作戦:条件によって、上書きしていく steer = angle_to(me.x, me.y, en.x, en.y) if distance(me.x, me.y, en.x, en.y) > 5: drive = "forward" if me.can_fire: fire = True
return {"drive": drive, "steer": steer, "fire": fire, "barrier": barrier}入力のまちがい
Section titled “入力のまちがい”| まちがい | どうなる |
|---|---|
drive に、決まった 3 つ以外の言葉を入れた | "stop" として扱われる |
fire や barrier に None を入れた | False として扱われる |
steer に数以外を入れた | その回は前回と同じ動き(エラーが記録される) |
- 受け取る
state→ state リファレンス - 角度・距離の道具 → 組み込みの道具
- これを使ったレシピ → 敵のほうを向く