 
              
目次
大友(@yomon8)です。
久しぶりにBeeXブログ書くので、柔らかめのネタでいかせていただきます。
Minecraft、存在自体は知っていたのですが、今まで触ったことはありませんでした。
しかし、息子のプログラム教育を調べていると何度も出てくるMinecraftというゲーム。どうも、Pythonでもプログラムできるらしいとは前から聞いたことがありました。
少し触ってみたいな、気になるなと思っていたのですが、ついに一昨日、思い立ってMinecraftを購入して触り始めました。
WEBを検索しPythonでブロック置けるところまでの環境構築はできたのですが、その先、何から始めようかと思い悩んでいました。プログラムらしく「最初はHello Worldかな。。。」と漠然と思っていたのですが、せっかくならBeeXのロゴを使ってHello Worldをしてみるかと、そうしたら、このブログにも書ける!ということで進めていきます。
描く素材
ということで、Hello Worldの変わりに、BeeXのロゴをPython使って、Minecraft上で表現しようと思います。
BeeXのロゴは以下のPNGをそのまま利用します。

必要なPythonモジュール
今回は以下の3つのモジュールを利用します。
画像処理で必要な Pillow(PIL)
行列処理で必要な numpy
Minecraftへの命令を出す mcpi
以下のようにインポートしておきます。
 fromPIL importImageimport numpy as npfrom mcpi import minecraftimport mcpi.block as block画像の加工
まずは、画像の解像度が高すぎるので、適度に縮小します。
 img =Image.open('./png/beex.png')resized = img.resize([x // 16 for x in img.size])↓小さくなりました

加工しやすいように白黒画像(グレースケール)に変更します。
 # グレースケールに変換gray_img = resized.convert('L')↓白黒になりました

画像の配列化
2次元配列に変換してみると高さとは幅も取ってみると、高さ43、幅124とMinecraftのブロックで表せそうな粒度です。
色の一覧も出します、これを便宜上これを色番号とします。
 gray_dot_array = np.array(gray_img)mc_image = np.flipud(gray_dot_array) # 上下反転  mc_image.shape# (43, 124)# ⇒ 高さ43、幅124でブロックを積み上げる np.unique(mc_image)# array([ 0, 76, 85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 113, 114, 117, 119, 121, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 143, 151, 226], dtype=uint8)# ⇒ 2色に分けるMinecraft上の表現
Minecraft上の表現方法ですが、ブロックを積み上げてロゴの文字を描こうと思います。
色が多彩なWoolから選んでみようと思います。
BeeXのロゴは大きく分けると(本当は細かい配色ありますが)、オレンジとグレーの2色なので、1番のオレンジと8番の灰色で作れそうです。

ということでNumpyの配列の色番号をWoolの番号にマッピングします。
色番号0は何も置かない
色番号110から151は1番のオレンジのWool
色番号76から109は8番の灰色のWool
MinecraftでBeeX!
ここまで準備できれば、配列をX軸、Y軸にマッピングしながらWoolを配置していくだけです。
以下のように実行してみます。
 mc=minecraft.Minecraft.create() mc.player.setTilePos(0,0,0) # Playerを初期ポジションに移動 z_axis = -50 # Z軸 振り返った辺りに文字を置きたい # Wool番号color_orange = 1color_lite_gray = 8 # 描画(ブロック配置)for y in range(0, mc_image.shape[0]):    for x in range(0, mc_image.shape[1]):        c = mc_image[y, x]        if 76 <= c and c <= 109:            mc.setBlock(x, y, z_axis, block.WOOL.withData(color_lite_gray))        if 110 <= c and c <= 151:            mc.setBlock(x, y, z_axis, block.WOOL.withData(color_orange))実行後、Minecraftで振り返ってみると、BeeXのロゴが!!

まとめ
Minecraft初めて触ってみましたが、ゲームの操作は億劫なのですが、Pythonで動かせるだけで結構面白いなというのが、今感じていることです。
ということで、今後ともBeeXを宜しくお願いいたします。

- カテゴリー
 
                           
                           
                           
                           
                           
                           
                           
                           
                           
                           
                           
                           
                       
                           
                     
                     
                     
                     
                   
                   
                   
             
                