PythonでMinecraft建築 ~村人の家~
Minecraftの村に自然生成される村人の家をPythonのプログラムで作成してみました。
今回はこの家を参考にして作成します。

実際にプログラミングで作成した家です。
苔むした丸石だけ設置していませんが、ほぼ同じ家が作成できました。

ブロックの設置方法
ブロックの設置はmcpiライブラリに用意されている「setBlocks」関数を使用します。
引数は下記になります。
 ・x0:xの開始座標
 ・y0:yの開始座標
 ・z0:zの開始座標
 ・x1:xの終了座標
 ・y1:yの終了座標
 ・z1:zの終了座標
 ・id:設置するブロックのid
 ・data:設置するブロックのデータ(省略可)
この関数で実行してくれる内容は(x0,y0,z0)の位置から(x1,y1,z1)の位置まで指定されたブロックで埋めるという処理になります。
下記のようにプログラムを記載すると(1,1,1)座標から(3,3,3)座標までをオークの板材で埋めることができます。
-     mc = minecraft.Minecraft()
-     block_id = block.WOOD_PLANKS.id
-     x = 1
-     y = 1
-     z = 1
-     mc.setBlocks(x, y, z, x+2, y+2, z+2, block_id)
下記が実際に設置された結果です。縦横高さ各3個のブロックが設置されました。

このブロックを設置する定義を使用して家の建築に必要なブロックを設置していきます。
家の建築
実際に家の建築をしていきます。
ここでは柱、床、壁、階段、梁、ドア、屋根、窓、松明に分けて記載していきます。
柱を設置します。柱はオークの原木を各角に4個の高さで設置します。
-     #柱を設置
-     block_id = block.WOOD.id
-     x = xPos
-     z = zPos
-     mc.setBlocks(x, y, z, x, y+3, z, block_id)
-     z = zPos-4
-     mc.setBlocks(x, y, z, x, y+3, z, block_id)
-     x = xPos+5
-     z = zPos
-     mc.setBlocks(x, y, z, x, y+3, z, block_id)
-     z = zPos-4
-     mc.setBlocks(x, y, z, x, y+3, z, block_id)

床を設置します。床はシラカバの板材を縦横3×4個設置します。
-     #床を設置
-     block_id = block.WOOD_PLANKS.id
-     x = xPos+1
-     z = zPos-3
-     mc.setBlocks(x, y, z, x+3, y, z+2, block_id)

壁を設置します。窓やドアの箇所は後ほど置き換えるので、ここでは4面全てを丸石で埋め尽くします。
柱の高さまで埋め尽くし、さらに前面と後面は二段追加で設置します。
-     #壁を設置
-     block_id = block.COBBLESTONE.id
-     x = xPos
-     z = zPos-3
-     mc.setBlocks(x, y, z, x, y+3, z+2, block_id)
-     x = xPos+5
-     z = zPos-3
-     mc.setBlocks(x, y, z, x, y+3, z+2, block_id)
-     x = xPos+1
-     z = zPos
-     mc.setBlocks(x, y, z, x+3, y+4, z, block_id)
-     z = zPos-4
-     mc.setBlocks(x, y, z, x+3, y+4, z, block_id)
-     x = xPos+2
-     y = 5
-     z = zPos
-     mc.setBlocks(x, y, z, x+1, y, z, block_id)
-     z = zPos-4
-     mc.setBlocks(x, y, z, x+1, y, z, block_id)

階段を設置します。丸石の階段ブロックを前面の壁より手前に設置します。
階段は設置する方角と上付きor下付きを指定することができます。setBlocksの最後に指定している数値が方角と上付きor下付きの情報になります。
方角は階段の背面が向いている方向になります。今回は「北向き かつ 下付き」のため、「3」を指定しています。
その他の場合の値はMinecraftのWikiを参照してください。
-     #階段を設置
-     block_id = block.STAIRS_COBBLESTONE.id
-     x = xPos+1
-     y = 0
-     z = zPos+1
-     mc.setBlocks(x, y, z, x+3, y, z, block_id, 3)

梁を設置します。梁は壁4面に横向きのオークの原木を設置します。
梁も階段と同様にsetBlocksの最後に指定している数値で原木の向きを指定します。
今回は前面と後面の壁は東西向きの「4」を左右の壁は南北向きの「8」を指定しています。
-     #梁を設置
-     block_id = block.WOOD.id
-     x = xPos
-     y = 2
-     z = zPos-3
-     mc.setBlocks(x, y, z, x, y, z+2, block_id, 8)
-     x = xPos+5
-     mc.setBlocks(x, y, z, x, y, z+2, block_id, 8)
-     x = xPos+1
-     z = zPos
-     mc.setBlocks(x+3, y, z, x, y, z, block_id, 4)
-     z = zPos-4
-     mc.setBlocks(x+3, y, z, x, y, z, block_id, 4)

ドアを設置します。ドアは2ブロックで1つのドアになるので、上下2つずつペアになるように設置します。
下側のドアを北向きに設置しているので「3」を、上側のドアは左側が「8」右側が「9」を指定しています。
-     #ドアを設置
-     block_id = block.DOOR_WOOD.id
-     x = xPos+2
-     y = 1
-     z = zPos
-     mc.setBlock(x, y, z, block_id, 3)
-     mc.setBlock(x, y+1, z, block_id, 8)
-     mc.setBlock(x+1, y, z, block_id, 3)
-     mc.setBlock(x+1, y+1, z, block_id, 9)

屋根を設置します。屋根はオークの階段を前後左右の壁より1つ外側から高さを1つずつずらしながら左右から設置します。
さらに前後の壁より外側に下付きの階段を設置しています。
-     #屋根を設置
-     block_id = block.STAIRS_WOOD.id
-     x = xPos-1
-     y = 3
-     z = zPos-5
-     for i in range(4):
-         mc.setBlocks(x, y, z, x, y, z+6, block_id, 0)
-         x = x+1
-         y = y+1
-     x = xPos+6
-     y = 3
-     z = zPos-5
-     for i in range(4):
-         mc.setBlocks(x, y, z, x, y, z+6, block_id, 1)
-         x = x-1
-         y = y+1
-     x = xPos
-     y = 3
-     z = zPos+1
-     for i in range(3):
-         mc.setBlocks(x, y, z, x, y, z, block_id, 5)
-         x = x+1
-         y = y+1
-     x = xPos
-     y = 3
-     z = zPos-5
-     for i in range(3):
-         mc.setBlocks(x, y, z, x, y, z, block_id, 5)
-         x = x+1
-         y = y+1
-     x = xPos+5
-     y = 3
-     z = zPos+1
-     for i in range(3):
-         mc.setBlocks(x, y, z, x, y, z, block_id, 4)
-         x = x-1
-         y = y+1
-     x = xPos+5
-     y = 3
-     z = zPos-5
-     for i in range(3):
-         mc.setBlocks(x, y, z, x, y, z, block_id, 4)
-         x = x-1
-         y = y+1

前後の壁より外側に下付きで設置している階段が見た目では分かりにくいので、トウヒの階段でも設置してみました。
この部分(下記画像の色が濃くなっている部分)の階段が下付きで設置している部分になります。

窓を設置します。正面からの画像では見えていませんが、左右と奥の壁にガラスを設置します。
-     #窓を設置
-     block_id = block.GLASS.id
-     x = xPos
-     y = 2
-     z = zPos-2
-     mc.setBlocks(x, y, z, x, y, z, block_id)
-     x = xPos+5
-     mc.setBlocks(x, y, z, x, y, z, block_id)
-     x = xPos+2
-     z = zPos-4
-     mc.setBlocks(x+1, y, z, x, y, z, block_id)

完成後に裏から見るとこのように設置されています。

松明を設置します。松明はドアの左右に1つずつ設置します。
今回は南向きに設置するので「3」を指定しています。
-     #松明を設置
-     block_id = block.TORCH.id
-     x = xPos+1
-     y = 2
-     z = zPos+1
-     mc.setBlocks(x, y, z, x, y, z, block_id, 3)
-     x = xPos+4
-     mc.setBlocks(x, y, z, x, y, z, block_id, 3)

以上で村人の家が作成できました。
場所を移動してプログラムを複数回実行すると、様々な位置に同じ家を簡単に建築することができるようになります。

| 
   | 
   | 



