MinecraftをPythonで制御できるようになった。
ブロックを置きまくって遊んだ後は、マイクラの世界をスキャンしてみよう。そしてその情報を描画してみたい。
まずはブロックデータの取得。
posPlayer = mc.player.getPos()
for iGetX in range(int(posPlayer.x-iWidth), int(posPlayer.x+iWidth+1)):
for iGetY in range(int(posPlayer.y-iWidth), int(posPlayer.y+iWidth+1)):
for iGetZ in range(int(posPlayer.z-iWidth), int(posPlayer.z+iWidth+1)):
print(“Scan : %d, %d, %d = %d” % (iGetX, iGetY, iGetZ, mc.getBlock(iGetX,iGetY,iGetZ)))
とりあえず、こんな感じで自分の周りのブロックの情報を取得してみた。Python初心者なので、おもいっきり冗長なコードだが、気にしない。
出力は以下のようになった。
Scan : -7, -5, -22 = 12
Scan : -7, -5, -21 = 12
Scan : -7, -5, -20 = 12
:
Scan : 2, 5, -14 = 0
Scan : 2, 5, -13 = 0
Scan : 2, 5, -12 = 0
では、0でない座標に球を置いて描画してみたい。
まずは、Python3.6で描画機能を使いたいので、VPythonなるものをインストール。
> pip install vpython
初回実行時、次のようなエラーが表示されたが、再度事項してみると、エラーなく終了した。
NameError: free variable ‘install_kernel_spec’ referenced before assignment in enclosing scope
原因不明。そのうち解析したい。したいがするかどうかは別の話。
では、描画するコードを追加してみる。
import mcpi.minecraft as minecraft
import mcpi.block as block
from vpython import *
mc = minecraft.Minecraft()
iWidth = 200
posPlayer = mc.player.getPos()
arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(iWidth,0,0), color=vector(1,0,0), shaftwidth=5)
arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(0,iWidth,0), color=vector(0,1,0), shaftwidth=5)
arrow(pos=vector(posPlayer.x,posPlayer.y,posPlayer.z), axis=vector(0,0,iWidth), color=vector(0,0,1), shaftwidth=5)
for iGetX in range(int(posPlayer.x-iWidth), int(posPlayer.x+iWidth+1), 5):
for iGetY in range(int(posPlayer.y-10), int(posPlayer.y+iWidth+10), 5):
for iGetZ in range(int(posPlayer.z-iWidth), int(posPlayer.z+iWidth+1), 5):
idBlock = mc.getBlock(iGetX,iGetY,iGetZ)
if idBlock != 0:
print(“Scan : %d, %d, %d = %d” % (iGetX, iGetY, iGetZ, idBlock))
colBlock = minecraft.Block(idBlock).getRGBA()
vpython.sphere(pos=vector(iGetX, iGetY, iGetZ), radius=2, color=vector(colBlock[0]/255,colBlock[1]/255,colBlock[2]/255), opacity=colBlock[3]/255)
で、細かい説明が面倒になったので、描画された結果がこちら↓
OSError: [WinError 10055] システムのバッファー領域が不足しているか、またはキューがいっぱいなため、ソケット操作を実行できませんでした。
。。。
えぇ、もうパソコンが追いつかない。
でも、なんとか描画できた結果がこちら↓
綺麗だな。でも遅いな。実用的な物になるのかな?
ソースコードも置いておこうか。BLOGに載せるとインデントがなくなってるみたいだし。