コンテンツにスキップ

タンクのうごかしかた

エンジンの担当 この章は、タンクの動きの決まりです。速さや回る速さは、あなたには変えられません。どう動かすかを決めるのは、あなたの担当です(4 つの入力)。

タンクにできることは、たった 4 つです。

したいこと命令
進む・下がる・止まるdrive
向きを変えるsteer
撃つfire
バリアをはるbarrier

この 4 つを、1 秒(びょう)に 10 回(かい)、タンクに伝(つた)えます。

あなたが書くのは update という名前の関数(かんすう)ひとつです。 その中で 4 つを決めて、まとめて返します。

def update(state):
return {
"drive": "forward", # 前に進む
"steer": 0.0, # 右を向く
"fire": True, # 撃つ
"barrier": False, # バリアははらない
}

これで「右を向いて、前に進みながら、撃ちつづける」タンクになります。 たった 1 つの return で、もうタンクは動きます。

drive に入れられるのは、次の 3 つの言葉(ことば)だけです。

書くことどうなる速さ
"forward"前に進む3.0 マス/秒
"backward"後ろに下がる1.5 マス/秒
"stop"その場で止まる0

後ろに下がるのは、前に進むより遅(おそ)い(ちょうど半分)ことをおぼえておいてください。 にげるときに「後ろに下がる」を選(えら)ぶと、思ったより追(お)いつかれます。 くるっと向(む)きを変えて前に進むほうが速いことが多いです。

steer には 向(む)きたい角度(かくど)そのもの を入れます。 「右に 30 度まわる」ではなく「30 度の方を向く」です。ここをまちがえる人がとても多いところです。

角度は0度が右、90度が下、180度が左、270度が上。算数のグラフと違い下に行くほど角度が大きい図

算数(さんすう)のグラフと違(ちが)って、下に行くほど Y が大きいので、90 度が「下」になります。 画面の左上が (0, 0) です。

def update(state):
# 敵のいる方を向く
want = angle_to(state.me.x, state.me.y, state.enemy.x, state.enemy.y)
return {"drive": "forward", "steer": want, "fire": True, "barrier": False}

angle_to は「ここから、あそこ」を向く角度を出してくれる道具(どうぐ)です。 自分で計算しなくて大丈夫(だいじょうぶ)です。

すぐにその向きになるわけではありません。 タンクは 1 秒でおよそ 180 度 までしかまわれません。半回転に 1 秒かかります。

つまり「まうしろを向く」には 1 秒かかります。 その 1 秒のあいだに、相手(あいて)は 3 マス動けます。 向きを変えるのは、思っているよりずっと高(たか)くつくのです。

戦車(せんしゃ)のおもちゃだと、砲塔(ほうとう)だけくるくるまわりますが、このゲームは**違(ちが)います**。

体と砲身(ほうしん)はくっついていて、いっしょにまわります。 だから「進む向き」と「撃つ向き」は、いつも同(おな)じです。

これはこのゲームのいちばん大事なルールのひとつです。

  • 敵を狙(ねら)うと、敵のほうへ進(すす)むことになる
  • にげながら撃(う)つことは、基本的(きほんてき)にできない
  • 「狙う」と「にげる」は、いつもどちらかを選(えら)ぶことになる

作戦を考えるとき、いちばん悩(なや)むのがここです。

項目(こうもく)数
HP(体力(たいりょく))3。3 回当たると負(ま)け
大きさ半径(はんけい) 0.40 マス(さしわたし 0.8 マス)
前に進む速さ3.0 マス/秒
後ろに下がる速さ1.5 マス/秒
まわる速さ1 秒でおよそ 180 度
つぎに撃てるまで1.2 秒

加速(かそく)はありません。"forward" と書いたそのしゅんかんから、いきなり 3.0 マス/秒です。 止まるときも、するするとは止まりません。すぐ止まります。