コンテンツにスキップ

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 = 上)前回のまま
fireTrue / False撃つしない
barrierTrue / Falseバリアを張るしない

エンジンの側の決まり(あなたには変えられない)は、次のページにあります。

入力決まりくわしく
drive前進 3.0 マス/秒、後退 1.5 マス/秒。加速はなく、すぐ動いてすぐ止まるタンクのうごかしかた
steer1 秒でおよそ 180 度までしか回れない。体と砲身はいっしょに回るタンクのうごかしかた
fire1.2 秒に 1 発。撃てないときは無視される(エラーにならない)たまとバリア
barrier1 試合に 3 回・2 秒間。正面 ±45 度だけを守る。張っている間は撃てず、動きは半分たまとバリア

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 です。自分で三角関数を使わなくて済みます。

撃てないときの 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}
まちがいどうなる
drive に、決まった 3 つ以外の言葉を入れた"stop" として扱われる
firebarrierNone を入れたFalse として扱われる
steer に数以外を入れたその回は前回と同じ動き(エラーが記録される)