コンテンツにスキップ

たまとバリア

エンジンの担当 この章は、弾とバリアの決まりです。当たる・はね返る・消えるは、エンジンが自動でやります。いつ撃つか・いつ張るかを決めるのは、あなたの担当です(4 つの入力)。

fireTrue にすると撃ちます。ただし、いつでも撃てるわけではありません

撃てないときどうなる
前に撃ってから 1.2 びょうたっていないなにきない(エラーにもならない)
バリアをっている何も起きない

いま撃てるかどうかは state.me.can_fireかります。 あと何秒なんびょうで撃てるかは state.me.reload_left です。

def update(state):
# 撃てるときだけ撃つ
return {
"drive": "forward",
"steer": angle_to(state.me.x, state.me.y, state.enemy.x, state.enemy.y),
"fire": state.me.can_fire,
"barrier": False,
}
項目こうもく
速さ8.0 マス/秒(タンクの 2.7 ばい
大きさ半径はんけい 0.08 マス(とてもちいさい)
てくる場所ばしょタンクの中心からまえへ 0.45 マス
えるまで3.0 秒
はねかえ回数かいすう1 はつにつき 1 回だけ
ダメージ1(HP は 3 なので 3 はつけ)

3.0 秒で消えるので、たまがとどくのは 24 マスまでです。 フィールドのななめのながさは 25 マスくらいあるので、はしから端は届きません。

たまどうしがぶつかると、両方消える

Section titled “たまどうしがぶつかると、両方消える”

正面しょうめんから撃ちあうと、たまが空中くうちゅうでぶつかって2 発とも消えます。 0.20 マスまで近づいたら消える、というルールです。

だから「まっすぐかいあって撃ちあう」だけでは、いつまでも決着けっちゃくがつきません。 すこしよこにずれるのが大事だいじです。

自分じぶんかってくるたまは state.incoming_missiles に入っています。

あぶないじゅんにならんでいます。 いちばんさきたるたまが incoming_missiles[0] です。 この順番じゅんばんまりごとなので、安心あんしんしてたよっていいです。

def update(state):
# 0.4 秒以内に当たるたまがあるか
danger = False
if len(state.incoming_missiles) > 0:
if state.incoming_missiles[0].eta < 0.4:
danger = True
if danger:
return {"drive": "forward", "steer": state.me.angle, "fire": False, "barrier": True}
return {"drive": "forward", "steer": state.me.angle, "fire": True, "barrier": False}

eta は「あと何秒なんびょうでいちばん近づくか」です。 とおりすぎてとおざかっていくたまは、はじめからこの一覧いちらんに入りません。 「もうあぶなくないたま」におどろかなくてむようになっています。

barrierTrue にすると、正面しょうめんにバリアがます。

項目こうもく
使つかえる回数1 試合に 3 回(サプライで 4 回まで)
つづく時間2.0 秒
次に使えるまで終わってから 5.0 秒
まも範囲はんい正面から左右さゆう 45 度だけ
そのあいだ移動いどう半分はんぶんの速さ・撃てない

バリアが守るのは正面から左右45度の扇形だけで、後ろと横は守らないことを示す図

「まわり全部ぜんぶを守るバリア」にすると、答えが 1 つにまってしまいます。 「たまが近かったら張る」だけで最強さいきょうになり、かんがえることがくなります。

正面だけにすると「どっちから飛んできているか」を計算けいさんしないといけません。 これは偏差射撃へんさしゃげきとまったく同じ算数さんすうです。 1 おぼえたことを、めにもまもりにも使えるように、わざとこうしてあります。

def update(state):
if len(state.incoming_missiles) == 0:
return {"drive": "forward", "fire": True, "barrier": False}
m = state.incoming_missiles[0]
# たまが「いま居るほう」を向く
toward = angle_to(state.me.x, state.me.y, m.x, m.y)
ready = state.me.barrier_count > 0 and state.me.barrier_cooldown == 0.0
if m.eta < 0.5 and ready:
return {"drive": "stop", "steer": toward, "fire": False, "barrier": True}
return {"drive": "forward", "steer": toward, "fire": True, "barrier": False}

試合しあい60 秒です。うえからじゅんくらべて、さきがついたほうが勝ちです。

順番じゅんばんくらべるもの
1相手あいての HP を 0 にした(KO ち)
2のこっている HP がおお
3あたえたダメージが多い
4たった回数がすくない
5うごいた距離きょりが多い
6ぜんぶ同じなら

5 番目ばんめに「動いた距離」があるのは、じっとかくれているだけの bot が勝たないようにするためです。