# 同じ操作をくりかえそう

前の章(大きな建物をつくろう)


前回は、複数のブロックをまとめて設置するmc.setBlocks()メソッドを学びました。

今回は、「同じ操作をくりかえす」方法を学んで、また新しいものを作っていきましょう。

# 不死身のブロックを作る

mcpipyフォルダに、「immortal.py」というファイルを作りましょう。

英単語

「immortal」とは、英語で「不滅の、不死身の」という意味です。

ファイルの中身には、このようなプログラムを書いていきます。

import mcpi.minecraft as minecraft
import time

mc = minecraft.Minecraft.create()

x, y, z = mc.player.getPos()

for _ in range(100):
    time.sleep(2)
    mc.setBlocks(x + 3, y, z - 1, x + 5, y + 2, z + 1, 1)

注意

for ...よりも下の行は、最初に半角スペース4つ分空けて書かれていることに気をつけましょう。

上書き保存したら、実行してみましょう。プレイヤーの近くに、石のブロックでできた箱が作られると思います。

試しに、この箱をツルハシなどで削ってみましょう。

岩ブロックのかたまりをツルハシで削る

すると、削った部分が、少し時間が立つと元にもどるはずです。何度壊しても復活する、不死身のブロックの完成です。

削られた岩ブロックのかたまりが自動でもとに戻る

これは、本当にブロックが復活するようになったわけではありません。プログラムによって、同じ場所に、同じブロックを、2秒おきに設置しなおすことで、まるでブロックが復活しているように見せているのです。ちなみにこのプログラムは200秒ほどで終わるようになっているので、しばらくするとブロックは壊しても復活しなくなります。

このように、Pythonで何かを繰り返すときに使うのが、 for と呼ばれるものです。今回使い方を勉強していく文法になります。

# for文の使い方

まずは下の例で、使い方を勉強していきましょう。mcpipyフォルダに「repeat.py」というファイルを作り、下のとおりにプログラムを書いていきましょう。

英単語

「repeat(リピート)」は、英語で「繰り返す」という意味です。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

for _ in range(3):
    mc.postToChat('Hello!')

注意

ここでも、for ...より下の行は、半角スペース4つ分空けて書いています。

これを実行すると、下のようになります。

Hello!を繰り返し表示

チャットウィンドウにHello!の文字が3回出てきていますね。一つしか書かれていないはずのmc.postToChat()メソッドが、3回繰り返されたことがわかると思います。

これがfor文のはたらきです。1行ずつ、使い方を見ていきましょう。

for _ in range(3):

for文という名のとおり、文頭がfor で始まっています。

操作を繰り返す回数は、range()の中身に入れる数字と等しくなります。この場合だと、3を入れているので、「3回繰り返してね」とコンピュータにお願いしていることになります。

_ inについては、次回で詳しく説明します。for文では必ず書かなければいけない部分なので、ひとまず書いておいてください。

行の最後が、 :(コロン) で終わっていますが、これは、「この先に、繰り返したい操作を書いていくよ」という目印です。これがなければ、コンピュータ、何を繰り返して良いのかわからず、エラーを起こしてしまいます。

下が、繰り返したい操作です。

    mc.postToChat('Hello!')

中身は、これまでも使ったことのある、mc.postToChat()メソッドです。Hello!というメッセージを送っています。

繰り返すことのできる操作は、メッセージを送るだけではありません。先ほどのようにブロックを設置したり、なんらかの計算をくりかえしたり、といった、いろいろなことができます。

何度か触れていますが、for文で繰り返したい操作の行は、文頭を半角スペース4つ空けることに注意してください。

たとえば、下のようにコードを書き足してみましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

for _ in range(3):
    mc.postToChat('Hello!')
    mc.postToChat('Python!')
mc.postToChat('Minecraft!')

結果は下のようになります。

複雑な繰り返し表示

文頭を空けているHello!Python!は3回繰り返されていますが、そうではないMinecraft!は一度しか表示されていません。この文頭のスペースのことを インデント といいます。Pythonでは、このインデントが有るか無いかによって、for文で繰り返す操作かどうかを見分けています。

# ブロックを繰り返し設置する

ここで、最初に作った不死身ブロックのプログラムに使われているfor文を見てみましょう。

for _ in range(100):
    time.sleep(2)
    mc.setBlocks(x + 3, y, z - 1, x + 5, y + 2, z + 1, 1)

ここでのrange()の中身は100なので、インデントをつけている(文頭を空けている)行の操作を100回くりかえすことになっています。

くりかえす操作は、

  • time.sleep()メソッドで2秒間プログラムを止める
  • mc.setBlocks()メソッドでブロックを設置する

という2つです。すなわちこのfor文は、

  • 「2秒ごとに、同じ場所にブロックを置く」ことを100回くりかえす

ということになります。

同じ場所にブロックを置き続けることで、ブロックが何度も復活するように見せることができるわけです。

`time.sleep()` を使わないとき

プログラムは凄まじく速いスピードで実行されるため、time.sleep()で一回一回休ませてあげないと、100回のくりかえしを一瞬で終えてしまいます。

繰り返しを終えてしまっているので、ブロックは壊しても復活しません。

# おわりに

Prosenseではマインクラフトを使ったプログラミングの個別指導もおこなっております。

マンツーマンでレッスンを受けながらマインクラフトでプログラミングを学びたい方はいますぐProsenseのLINE公式アカウントに登録ください。

ProsenseのLINE公式アカウントと友達になる


練習問題