その他

MinecraftとPythonでBeeX!!

Minecraftと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
以下のようにインポートしておきます。

 fromPIL importImage
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 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,
 101102103104105106107108109113114117119,
 121125126127129130131132133134135136137,
 138143151226], 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 in range(0, mc_image.shape[0]):
    for 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を宜しくお願いいたします。



カテゴリー

この記事を書いたメンバー

Yusuke Otomo
テクノロジープリンシパル
Yusuke Otomo

【LinkedIn】 https://www.linkedin.com/in/yusukeotomo/ 【個人ブログ】 https://yomon.hatenablog.com/

このメンバーの記事一覧

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)