目次
大友(@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を宜しくお願いいたします。
- カテゴリー