コンテンツにスキップ

bot のかたち

あなたの担当 この章は、bot が決めることの話です。エンジンが自動でやることはルールの章にあります。

bot は、関数を 1 つ書くだけです。名前は update

def update(state):
return {"drive": "forward", "steer": 0.0, "fire": True, "barrier": False}

これだけで、「右を向いて、前に進みながら、撃ちつづける」タンクの完成です。

1 秒間に 10 回くりかえす流れの図。エンジンが、いまの様子を state にまとめて bot に渡す。bot が、drive・steer・fire・barrier の 4 つを返す。エンジンが、その 4 つを使って 6 フレームぶん世界を進める。

  1. エンジンが、いまの様子を state にまとめて、update に渡します(受け取る
  2. あなたの update が、state を見て、どう動くかを決めます(決める
  3. 4 つの入力を返します。エンジンは、それを使って世界を 6 フレームぶん進めます(返す

あなたが書くのは、2 の部分だけです。1 と 3 は、エンジンが自動でやります。

受け取る決める返す
何をstate自分の作戦drive steer fire barrier
詳しくstate リファレンスレシピ4 つの入力

試合のはじめに 1 回だけ呼ばれる関数もあります。重い準備は、ここでやります。

def setup():
"""試合の最初に 1 回だけ呼ばれる。省略できる。"""
pass
def update(state):
"""6 フレームに 1 回(1 秒に 10 回)呼ばれる。"""
return {"drive": "forward", "steer": 45.0, "fire": True, "barrier": False}
呼ばれるとき使える計算量
setup試合のはじめに 1 回1,000,000 命令
update6 フレームに 1 回(1 秒に 10 回)150,000 命令

呼ばれるのは、1 秒に 10 回だけ

Section titled “呼ばれるのは、1 秒に 10 回だけ”

update が呼ばれるのは 6 フレームに 1 回、つまり 1 秒に 10 回です。 (画面は 1 秒に 60 回描かれますが、考えるのはその 6 分の 1です)

考えていないあいだ、タンクは、さっき言われたことをやりつづけます。 「止まれ」と言うまで、進みつづけます。

update の外で作った変数(グローバル変数)は、試合のあいだずっと残ります。 前の update で覚えたことを、次の update で使えます。

回数 = 0
def update(state):
global 回数
回数 = 回数 + 1
# 20 回に 1 回だけ撃つ
return {"drive": "forward", "fire": 回数 % 20 == 0}

global 回数 は、「この変数は、関数の外のものを使う」という宣言です。 これを書かないと、回数 は毎回まっさらになります。 (変数名に日本語が使えます)

  • 4 つのうち、書かなかったものdrivesteer前回のままfirebarrierしない
  • 戻り値が辞書ではないとき:前回と同じ動きになる
  • update の中でエラーが起きたとき:その回は前回と同じ動き。試合は止まらない赤いメッセージが出たとき

state は書き換えても意味がない

Section titled “state は書き換えても意味がない”

state は、毎回新しく作り直されます。書き換えても、ゲームには何も起きません。 「読むだけ」と覚えておいてください。