覚え書きブログ

ピラミッドの作成(マインクラフトの覚え書き)

Pythonを使って3階層のピラミッドを作るコードを、子供(中1)に書かせてみたら、次のようなコードができた。

from mcpi.minecraft import Minecraft
from mcpi.block import *
mc = Minecraft.create()
pos = mc.player.getTilePos()

for i in range(3):
	for j in range(3):
		for a in range(2):
			for b in range(2):
				for c in range(1):
					mc.setBlock(pos.x+i,pos.y,pos.z+j,STONE)
					mc.setBlock(pos.x-i,pos.y,pos.z-j,STONE)
					mc.setBlock(pos.x+i,pos.y,pos.z-j,STONE)
					mc.setBlock(pos.x-i,pos.y,pos.z+j,STONE)
					mc.setBlock(pos.x+a,pos.y+1,pos.z+b,STONE)
					mc.setBlock(pos.x-a,pos.y+1,pos.z-b,STONE)
					mc.setBlock(pos.x+a,pos.y+1,pos.z-b,STONE)
					mc.setBlock(pos.x-a,pos.y+1,pos.z+b,STONE)
					mc.setBlock(pos.x,pos.y+2,pos.z,STONE)

難解である。。。力作だが、随分と長いコードである。しかも3階層にしか対応できない。。。
f:id:hirotaka_hachiya:20181222183330p:plain

解答例として、任意の階層のピラミッド作れるコードを短く書いてみた。以下は20階層のピラミッドの例である。

from mcpi.minecraft import Minecraft
from mcpi.block import *
mc = Minecraft.create()
pos = mc.player.getTilePos()

nLayer = 20
for l in range(1,nLayer+1):
	for i in range(l*2-1):
		for j in range(l*2-1):
			mc.setBlock(pos.x+i-l+1,pos.y+nLayer-l,pos.z+j-l+1,STONE)

f:id:hirotaka_hachiya:20181222185751p:plain

しかし、これだと、見た目には必要のない、ピラミッドの中のブロックを置くことになり、処理に時間がかかる。ちなみに、100階層で試したところ、GTX980では途中で処理が止まってしまった。
必要のないブロックを削減した(つまり、空洞の)ピラミッドの作成は、明日の宿題とする。