金のなる木を植えるではプログラムでブロックの置き方を一個ずつ決めていましたが、もっと簡単に好きな形を作れるプログラミングをしてみます。簡単に言うと、配列と繰り返しを使います。
1,1,1,0,1,0,1
というような配列があったときに、1のところでブロックを置き、0のところでは置かない。次のようなプログラムになります。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print1D(start, data, blk): for x in range(0,len(data)): if data[x]: mc.setBlock(start.x + x, start.y, start.z, blk) dotline = [1,1,1,0,1,0,1] print1D(mc.player.getPos() + Vec3(1,0,0), dotline, block.WOOL_RED)
これは線(1次元)でしたが、次のプログラミングでは面(2次元)になります。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print2D(start, data, blk): for z in range(0,len(data)): for x in range(0,len(data[z])): if data[z][x]: mc.setBlock(start.x + x, start.y, start.z + z, blk) smile = [ [0,0,0,1,1,1,1,1,0,0,0], [0,0,1,0,0,0,0,0,1,0,0], [0,1,0,0,0,0,0,0,0,1,0], [1,0,0,1,0,0,0,1,0,0,1], [1,0,0,1,0,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,1], [1,0,0,1,0,0,0,1,0,0,1], [0,1,0,0,1,1,1,0,0,1,0], [0,0,1,0,0,0,0,0,1,0,0], [0,0,0,1,1,1,1,1,0,0,0] ] print2D(mc.player.getPos() + Vec3(1,0,10), smile, block.WOOL_YELLOW)
配列を遠目で見てもスマイルマークかな?って見えますね。プログラムは実はあまり変わっていないことがわかります。さて、では次に3D:立体(3次元)にチャレンジしてみます。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print3D(start, data, blk): for y in range(0,len(data)): for z in range(0,len(data[y])): for x in range(0,len(data[z])): if data[y][z][x]: mc.setBlock(start.x + x, start.y + y, start.z + z, blk) tent = [ [ [1,1,1,1,1], [1,0,0,0,1], [1,0,0,0,1], [1,0,0,0,1], [1,1,0,1,1], ],[ [1,1,1,1,1], [1,0,0,0,1], [1,0,0,0,1], [1,0,0,0,1], [1,1,0,1,1], ],[ [0,0,0,0,0], [0,1,1,1,0], [0,1,0,1,0], [0,1,1,1,0], [0,0,0,0,0], ],[ [0,0,0,0,0], [0,0,0,0,0], [0,0,1,0,0], [0,0,0,0,0], [0,0,0,0,0], ] ] print3D(mc.player.getPos() + Vec3(1,0,20), tent, block.WOOL_WHITE)
もう配列を見ても何ができるのか想像がつきませんね。テントのような形になります。これで、たった6行のプログラムで、どんな形でもブロックを積み上げて作ることができます。
最後に、配列をプログラムではなくて、ファイルから読み込ませてみます。こんなファイルをmt_tsukuba.csvという名前で置いておけば、
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() import csv data = [] with open('mt_tsukuba.csv', 'r') as f: file = csv.reader(f) plane = [] for line in file: if len(line) == 0: data.append(plane) plane = [] else: plane.append(line) data.append(plane) data_conved = [[[int(elm) for elm in l] for l in p] for p in data] print3D(mc.player.getPos() + Vec3(1,0,1), data_conved, block.WOOL_GREEN)
茨城県のシンボル、つくば山です。小さいのであまりそれっぽく見えないですね。今度もっと大きく作ってみます。地形図を電子国土Web地理院地図から入手しました。それをExcelの背景画像に設定して、トレーシングペーパーのように高さを書いて作っています。
こんな感じの地道な作業。