bot のかたち
あなたの担当 この章は、bot が決めることの話です。エンジンが自動でやることはルールの章にあります。
bot は、関数を 1 つ書くだけです。名前は update。
def update(state): return {"drive": "forward", "steer": 0.0, "fire": True, "barrier": False}これだけで、「右を向いて、前に進みながら、撃ちつづける」タンクの完成です。
エンジンとの受けわたし
Section titled “エンジンとの受けわたし”- エンジンが、いまの様子を
stateにまとめて、updateに渡します(受け取る) - あなたの
updateが、stateを見て、どう動くかを決めます(決める) - 4 つの入力を返します。エンジンは、それを使って世界を 6 フレームぶん進めます(返す)
あなたが書くのは、2 の部分だけです。1 と 3 は、エンジンが自動でやります。
| 受け取る | 決める | 返す | |
|---|---|---|---|
| 何を | state | 自分の作戦 | drive steer fire barrier |
| 詳しく | state リファレンス | レシピ | 4 つの入力 |
setup は省略できる
Section titled “setup は省略できる”試合のはじめに 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 命令 |
update | 6 フレームに 1 回(1 秒に 10 回) | 150,000 命令 |
呼ばれるのは、1 秒に 10 回だけ
Section titled “呼ばれるのは、1 秒に 10 回だけ”update が呼ばれるのは 6 フレームに 1 回、つまり 1 秒に 10 回です。
(画面は 1 秒に 60 回描かれますが、考えるのはその 6 分の 1です)
考えていないあいだ、タンクは、さっき言われたことをやりつづけます。 「止まれ」と言うまで、進みつづけます。
変数は、試合のあいだ残る
Section titled “変数は、試合のあいだ残る”update の外で作った変数(グローバル変数)は、試合のあいだずっと残ります。
前の update で覚えたことを、次の update で使えます。
回数 = 0
def update(state): global 回数 回数 = 回数 + 1 # 20 回に 1 回だけ撃つ return {"drive": "forward", "fire": 回数 % 20 == 0}global 回数 は、「この変数は、関数の外のものを使う」という宣言です。
これを書かないと、回数 は毎回まっさらになります。
(変数名に日本語が使えます)
返しかたのきまり
Section titled “返しかたのきまり”- 4 つのうち、書かなかったもの:
driveとsteerは前回のまま、fireとbarrierはしない - 戻り値が辞書ではないとき:前回と同じ動きになる
updateの中でエラーが起きたとき:その回は前回と同じ動き。試合は止まらない(赤いメッセージが出たとき)
state は書き換えても意味がない
Section titled “state は書き換えても意味がない”state は、毎回新しく作り直されます。書き換えても、ゲームには何も起きません。
「読むだけ」と覚えておいてください。
- 返す 4 つの入力 → 4 つの入力
- 受け取る
state→ state リファレンス - 使える道具 → 組み込みの道具