# 大きな建物を作ろう

前の章(ブロックを設置してみよう)


前章では、ブロックを設置していく方法を学びました。

座標を使ってブロック好きな所に置けるようになりましたが、一つ一つ置いていていては、たくさんのコードを書かないといけなくなります。

今回は、たくさんのブロックを、まとめて設置する方法を勉強します。

これにより、大きな建物も、プログラムで簡単に建てることができるようになります。

# ブロックをまとめて設置する

mcpipyフォルダの中に、「blocks.py」というファイルを作りましょう。「blocks」は「block」の複数形です。複数ブロックを設置するプログラムなので、複数形の「s」をつけています。

これからこのファイルに、大きな立方体の建物をババっとたてるコードを書いていきます。

まずはいつものとおり、下の2行を書いてマインクラフトと接続しましょう。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

次に、プレイヤーの座標を調べておきます。今回も、プレイヤーの座標を使って、色々なものを作っていきます。

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

複数のブロックをまとめて設置するには、mc.setBlock()メソッドではなく、mc.setBlocks()メソッドを使います。最後のsに注意してください。

試しに、プレイヤーのそばに、高い石の柱を建ててみましょう。

mc.setBlocks(x + 1, y, z, x + 1, y + 20, z, 1)

実行すると、下のような高い柱ができると思います。

高い石の柱

今度は、下のコードを書いてみましょう。数字や+-の記号が多いので注意してください。

mc.setBlocks(x - 3, y, z + 3, x - 2, y + 3, z - 3, 24)
mc.setBlocks(x + 2, y, z + 3, x + 3, y + 3, z - 3, 24)
mc.setBlocks(x - 3, y + 4, z + 3, x + 3, y + 5, z - 3, 24)

結果は下のように、砂岩でできたトンネルができあがります。

砂岩のトンネル

mc.setBlock()メソッドを使えば、このような建物が一瞬で作れることが、わかったのではないでしょうか。

それでは、使い方を詳しく見ていきましょう。

# mc.setBlocks()メソッドの使い方

前回勉強したmc.setBlock()メソッドは、「どこにブロックを置くか」を考えていました。

三次元座標中の1点

これに対して、このmc.setBlocks()メソッドは、「どこからどこまでブロックを置くか」という考え方をするのがポイントです。

  • x方向にどこからどこまでか
  • y方向にどこからどこまでか
  • z方向にどこからどこまでか

この3つの方向の、「スタート」と「ゴール」を決めることで、その範囲(はんい)いっぱいにブロックを置いてくれます。

範囲を指定する

それでは、mc.setBlocks()メソッドの詳しい使い方を、下のコードを例に説明します。

mc.setBlocks(x, y, z + 3, x + 2, y + 1, z + 4, 24)

mc.setBlocks()メソッドには、7つの引数があります。

# 1つ目と4つ目: xx + 2

1つ目の引数は、「x方向のスタート」を決め、4つ目の引数は、「x方向のゴール」を決めます。

つまりこの例では、「x方向は、x から x + 2 の間、すなわち、xx + 1x + 2 のマスにブロックを置く」ということを表しています。

# 2つ目と5つ目: yy + 1

2つ目の引数は、「y方向のスタート」を決め、5つ目の引数は、「y方向のゴール」を決めます。

この例では、「y方向は、y から y + 1 の間、すなわち、yy + 1 のマスにブロックを置く」ということを表しています。

# 3つ目と6つ目: z + 3z + 4

3つ目の引数は、「z方向のスタート」を決め、6つ目の引数は、「z方向のゴール」を決めます。

この例では、「z方向は、z + 3 から z + 4 の間、すなわち、z + 3z + 4 のマスにブロックを置く」ということになります。

# 7つ目:ブロックの種類

7つ目の引数は、設置するブロックの種類を表しています。

今回は、「24番目」のブロックで、これは砂岩(SAND STONE)の番号です。

砂岩ブロック

これで、複数のブロックをまとめて設置するメソッドの完成です。

実行すると、x方向、y方向、z方向にそれぞれ 3×2×2=12 個の砂岩ブロックのかたまりができ上がります。

砂岩ブロックの直方体

# timeモジュールとsleepメソッド

今までのプログラムは、実行したら全ての命令を一気に実行していました。ここでは、一つ一つの命令を、時間を空けながら続けて実行する方法を勉強しておきましょう。

先ほどの、トンネルを作ったコードに戻りたいと思います。

import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

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

mc.setBlocks(x - 3, y, z + 3, x - 2, y + 3, z - 3, 24)
mc.setBlocks(x + 2, y, z + 3, x + 3, y + 3, z - 3, 24)
mc.setBlocks(x - 3, y + 4, z + 3, x + 3, y + 5, z - 3, 24)

これに、いくつかのコードを書き足します。

import mcpi.minecraft as minecraft
# 下の行を追加
import time

mc = minecraft.Minecraft.create()

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

# 追加
time.sleep(2)
mc.setBlocks(x - 3, y, z + 3, x - 2, y + 3, z - 3, 24)
# 追加
time.sleep(2)
mc.setBlocks(x + 2, y, z + 3, x + 3, y + 3, z - 3, 24)
# 追加
time.sleep(2)
mc.setBlocks(x - 3, y + 4, z + 3, x + 3, y + 5, z - 3, 24)

#(シャープ) は、コメントアウトと言われるもので、# より先のテキストを、プログラムに含めないようにすることができます。ソースコードに説明を書いたりする場合に使います。みなさんは、# でコメントアウトされている行については、書く必要はありません。

まずはこれを実行してみましょう。

すると、すぐには何も起こりませんが、少しずつ、トンネルができていくのがわかるのではないでしょうか。

それでは、追加したコードについて、説明していきます。

import time

ここで、pythonで時間を扱うための timeモジュール というものを使うように、コンピュータに教えています。

モジュールとは、Pythonに新しい機能を追加するための、道具箱のようなものです。

いつもプログラムを書くときに、

import mcpi.minecraft as minecraft

と入力していますが、これは、Pythonでマインクラフトを扱うための、 mcpiモジュール というものを使うよう、コンピュータに教えているわけです。

timeモジュールは、時間に関係する色んな道具が詰まった道具箱ということになります。

モジュールを使うようにすることを、import(インポート)するといいます。

続いて、下のコードを追加しました。

time.sleep(2)

先ほど使えるようにしたtimeモジュールから、time.sleep()メソッドを使っています。

time.sleep()メソッドは、引数に入力した秒数だけ、プログラムの動きを止めてくれるメソッドです。今回は、全て2を入力しているので、一つ一つの作業を2秒ごとにやってくれるプログラムになりました。

# おわりに

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

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

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


練習問題