BeeX Technical BlogMinecraftとPythonでBeeX!!

大友(@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

以下のようにインポートしておきます。

from PIL import Image
import numpy as np
from mcpi import minecraft
import 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 = 1
color_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を宜しくお願いいたします。

 

カテゴリ

タグ

BeeX Technical Blogについてのお問い合わせ

BeeX Technical Blogのエントリにご質問が御座いましたらお気軽にお問合せください。

お電話でのお問い合わせ

☎ 03-6260-6240

受付時間 平日9:30〜18:00

フォームでのお問い合わせ

お問い合わせフォーム