コンテンツにスキップ

たまとバリア

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

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

撃てないときどうなる
前に撃ってから 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 は「あと何秒(なんびょう)でいちばん近づくか」です。 通(とお)りすぎて遠(とお)ざかっていくたまは、はじめからこの一覧(いちらん)に入りません。 「もう危(あぶ)なくないたま」に驚(おどろ)かなくて済(す)むようになっています。

barrier を True にすると、正面(しょうめん)にバリアが出(で)ます。

項目(こうもく)数
使(つか)える回数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 が勝たないようにするためです。