CHaser解説(Python編)

第2部 Python編

1章 移動と繰り返し

1章 移動と繰り返し

入門編の第2部1・2章(ステージ1・2)に対応します。

CHaserのしくみの要点

  • 動けるのは上下左右の4方向に1マスずつです。斜めには進めません。
  • ブロックのマスや、フィールドの外に進むと、その場で負けになります(第1部5章)。移動する前に、進む先が安全か確かめるのが基本です。
  • 1回の命令で動けるのは1マスだけです。5マス進みたいなら、5回の命令が必要です。

移動:walk

walk(Right)
walk(Right)
walk(Right)
walk(Up)
walk(Up)
walk(Right)

walk(方向)は、「プレイヤーを方向に1マス移動させる」命令です。かっこの中に、Up・Down・Left・Rightのどれかを指定します。この6行は、「右に3マス、上に2マス、右に1マス」という経路です。コードは上から順に、1行ずつ実行されます。

繰り返し:for

同じ命令を何度も書く代わりに、for文で繰り返しにします。

for count in range(3):
    walk(Right)
for count in range(2):
    walk(Up)
walk(Right)

for count in range(3):の下の、インデントされた行が、繰り返される中身です。上のコードは、前の6行と同じ動きになります。回数を変えたいときも、range()の数字を書き換えるだけで済みます。

繰り返しの繰り返し(ネスト)

forの中に、別のforを入れることもできます。

for count3 in range(2):
    for count in range(2):
        walk(Right)
    for count2 in range(2):
        walk(Up)

いちばん外側のforが2回繰り返し、その中で「右に2回」「上に2回」が、この順に実行されます。インデントの深さが、入れ子の深さです。

for count3 in range(2):        ← 1段目(外側の繰り返し)
    for count in range(2):     ← 2段目(外側の中の繰り返し)
        walk(Right)     ← 3段目(さらにその中の命令)
    for count2 in range(2):    ← 2段目に戻る(1つ目の繰り返しと同じ深さ)
        walk(Up)        ← 3段目

この例では、外側と内側でcount・count2・count3のように、違う変数名を使っています。同じ名前を使うと、どちらの繰り返しの変数か分からなくなるからです。

繰り返しの「中」と「外」

入門編の2-3・2-4で練習した「繰り返しの中に入れるものと、外に置くもの」は、インデントで決まります。

walk(Down)            # 外:1回だけ
for count in range(3):
    walk(Right)       # 中:3回
walk(Down)            # 外:3回のあと、1回だけ

ずっと繰り返す:while True

回数を決めずにずっと繰り返すときは、while True:を使います。CHaserの対戦は何ターン続くか分からないので、プログラム全体は、ほとんどの場合while True:の中に入ります(0章の骨組み)。

while True:
    map_info = get_ready()
    walk(Right)

注意したいこと

  • 方向名のスペルを間違える:Up・Down・Left・Rightは、大文字・小文字も含めて決まった綴りです。upと書くと、エラーになります。
  • range()の数を、回数と混同する:range(4)は「0, 1, 2, 3」の4個の数字を作ります。「4個ある=4回繰り返す」と読みます。
  • インデントの深さを間違える:本来は繰り返しの中に入れたい行がインデントされていないと、繰り返しの外に出てしまいます。forの下に何もインデントされた行がないと、エラーになります。

演習問題

  1. 「左×2 → 下×1 → 左×2」という経路を、walkだけで書いてみましょう。
  2. 「右×3 → 下×1」というセットを3回繰り返すコードを、forの入れ子で書いてみましょう。
  3. 上のネストの例で、外側のrange(2)をrange(3)に変えると、全体で右に何回、上に何回進みますか。

YouTubeチャンネル

U-15プロコン舞鶴のYouTubeチャンネルを開設しました。大会の情報などを発信しています。 チャンネルを見る