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の下に何もインデントされた行がないと、エラーになります。
演習問題
- 「左×2 → 下×1 → 左×2」という経路を、
walkだけで書いてみましょう。 - 「右×3 → 下×1」というセットを3回繰り返すコードを、
forの入れ子で書いてみましょう。 - 上のネストの例で、外側の
range(2)をrange(3)に変えると、全体で右に何回、上に何回進みますか。