お知らせ

『プログラミング能力検定(11月検定)』参加者募集中!

詳細はこちら

【09】同じ動作を繰り返す

「for」イメージ画像 マイクラ(Python)

この項では、同じ動作を繰り返す処理の構文を学習します。あわせて Python でのプログラミングにおいてとても重要な考え方である「インデント」についても学んでいきましょう。

「左を向く」を2回繰り返す

for i in range (2):
    agent.turn(LEFT)

これが「左を向く」を2回繰り返すコードです。forフォー という英単語にはいろいろな意味がありますが、英語の「I’ll turn left for 2 times.(2回左を向く=左を向くを2回繰り返す)」という用法と考えればよいでしょう。

for の次に書かれている「i」は変数の名前であり、「x」や「n」などほかの文字でもかまいません。「count」といった文字列でも大丈夫です。ただ、繰り返し文の変数には慣習的に「i」が多く使われています。

そのあとに in range( ): と続けて、( ) の中に繰り返したい数を記入します。in や range() の詳しい説明は省きますが、ここでは ( ) の中に書いた回数だけ動作が繰り返されると理解してください。( ) のあとの : を忘れないように注意してください。

字下げで繰り返す命令の範囲を決める

さらに半角の空白で行の頭を右にずらして(下げて)から繰り返したい動作の命令(ここでは agent.turn(LEFT) )を記入します。

この字下げを「インデント」といいますが、何文字分右に下げなければいけないという決まりはありません。ただ、MakeCode をはじめとした多くのエディターではキーボードの[Tabキー]を押すと4個分の空白が挿入されるので、[Tabキー]を使って4文字分字下げするのが一般的かと思います。

そして、Python では同じ字下げ位置にあるコードをひとつのかたまりと判断します。例として、下の画像のように四方に置かれたブロックを、向きを変えながら壊すプログラムを考えてみます。

繰り返し課題1

for i in range (4):
    agent.destroy(FORWARD)
    agent.turn(LEFT)

for で繰り返されるのは同じ字下げ位置で書かれた動作だけです。例えば上のコードでは、2行目と3行目が字下げされているので、for を使わずに書いた場合は次のようになります。

agent.destroy(FORWARD)
agent.turn(LEFT)

agent.destroy(FORWARD)
agent.turn(LEFT)

agent.destroy(FORWARD)
agent.turn(LEFT)

agent.destroy(FORWARD)
agent.turn(LEFT)

繰り返し課題2
「前方向のブロックを壊してから左を向く」という動作を4回繰り返します

では3行目を字下げしないで次のように書いたらどうでしょう。

for i in range (4):
    agent.destroy(FORWARD)
agent.turn(LEFT)

この場合は3行目の agent.turn(LEFT) は繰り返しの範囲には含まれません。これを for を使わずに書くと以下のようになります。

agent.destroy(FORWARD)

agent.destroy(FORWARD)

agent.destroy(FORWARD)

agent.destroy(FORWARD)

agent.turn(LEFT)

繰り返し課題3
「前方向のブロックを壊す」という動作を4回繰り返してから、1回だけ左に回転します

このように字下げされているかいないかによってプログラムの結果が変わってきますので、注意してください。

字下げした行の頭は必ずそろえる

for i in range (4):
    agent.destroy(FORWARD)
  agent.turn(LEFT)

字下げの文字数に決まりはないと書きましたが、同じ for文の中では必ず字下げした行の頭をそろえなければなりません。上のコードでは2行目と3行目の頭がそろっていないためエラーとなります。

ではそのあたりに気をつけて実際にプログラムを書いてみましょう。

繰り返し課題4

上の画像のように5つ並んだブロックを、横に移動しながら壊すプログラムを作ります。

まずは左へ1ブロック移動して正面のブロックを壊します。

agent.move(LEFT, 1)
agent.destroy(FORWARD)

そして、さらに左へ1ブロック移動してまた正面のブロックを壊します。これを繰り返して5つのブロックを壊すので、上のコードの先頭に 5回繰り返す for文 を付け足します。

for i in range(5):
agent.move(LEFT, 1)
agent.destroy(FORWARD)

さらに for で繰り返したい動作(2~3行目)のコードを字下げします。字下げするときは半角のスペースを4個入れて2つの行の頭をしっかりそろえます。

for i in range(5):
    agent.move(LEFT, 1)
    agent.destroy(FORWARD)

繰り返し課題4

これですべてのブロックを破壊することができました!