マインクラフト Pi

マインクラフトは人気のある、サンドボックス型のオープンワールドなものづくりゲームです。 ラズベリーパイでは無料版のマインクラフトが利用可能で、 プログラミングインターフェースも備えています。 これはPythonでコマンドやスクリプトを書くことで、 ゲーム内で自動的に何かを作ることができることを意味します。 Pythonを学ぶのにとても良い方法です。

インストール

マインクラフトは2014年の9月からRaspbianにデフォルトでインストールされています。

もし古いバージョンのRaspbianを使っている場合、 ターミナルを開き、次のコマンドを入力してください(オンラインである必要があります)。

sudo apt-get update
sudo apt-get install minecraft-pi

一度完了すれば、マインクラフト PiとPythonライブラリがインストールされます。

実行

マインクラフトをデスクトップかアプリケーションメニューから開いてください。

するとマインクラフトのスプラッシュスクリーンが現れます。

Start Gameをクリックし、続いてCreate newをクリックしてください。 外側のウインドウが少しはみ出ているのに気が付くでしょうか。 これはウインドウをドラッグして移動させるのには、マインクラフトウインドウの後ろの タイトルバーをつかまなければならないということです。

今、あなたはマインクラフトのゲームの中にいます。 歩き回り、何かを叩き切って、何かを作ってみましょう。

マウスを使って周囲を見渡し、以下のキーボードのキーを使いましょう。

キー アクション
W
A
S
D
E インベントリ
スペース ジャンプ
ダブルスペース 飛ぶ / 降りる
Esc ポーズ / ゲームメニュー
Tab マウスカーソルの解放

マウスのスクロールホイール(もしくはキーボードの数字を使用して) でクイックドローパネルからアイテムを選択することができます。 もしくは、Eを押して、インベントリから何かを選択することができます。

スペースバーをダブルタップすることで空中を飛ぶこともできます。 スペースバーを離すと飛ぶのが止まり、もう一度ダブルタップすると、地上に戻ります。

手に剣を持っているとき、目の前のブロックをクリックすると、それを消す(もしくは掘る)ことができます。 そしてブロックを手にもっているとき、右クリックで目の前にブロックを配置することができ、 左クリックでブロックを消すことができます。

プログラミングインターフェース

マインクラフトの起動中、ワールドが生成された後、Tabキーを 押すことでゲームからフォーカスをはずして、マウスを解放してください。 Pythonウインドウを開き、ウインドウが隣同士になるように移動させてください。 現在はPython3はサポートされていないため、Python2を使用してください。 デスクトップかアプリケーションメニューからPython2を開きます。

Pythonのウインドウに直接コマンドを入力することも、 後で再度実行するできるようにコードをファイルに保存しておくこともできます。

ファイルを作りたい場合は、File > New windowFile > Saveとしてください。 ホームフォルダか新しいプロジェクトフォルダに保存すると良いでしょう。

マインクラフトのライブラリをインポートして、ゲームとの接続を作り、 そして試しに「Hello world」というメッセージをスクリーンに貼ることから始めましょう。

from mcpi import minecraft

mc = minecraft.Minecraft.create()

mc.postToChat("Hello world")

Pythonウインドウに直接コマンドを入力する場合には、 単に、それぞれの行の後にEnterを押してください。 ファイルの場合はCtrl + Sで保存し、F5で実行してください。 コードが実行されると、ゲーム内のスクリーンにメッセージが表示されます。

自分がどこにいるか調べる

自分の位置を調べるには、次を入力してください。

pos = mc.player.getPos()

これでposはあなたの位置を持っています。 pos.xpos.ypos.zで 座標のそれぞれの成分を得ることができます。

他には、別々の変数に座標を得るための良い方法として、 Pythonのアンパッキングを使用することができます。

x, y, z = mc.player.getPos()

これで、xyzは、 あなたの位置座標のそれぞれの成分を持っています。 xzは歩く方向(前後左右)で、 yは上下です。

getPos()はその時点のプレイヤーの位置を返しますので、 位置が移動した場合には、この関数を再度コールするか、保存済みの位置を使用しなければなりません。

テレポート

現在の自分の位置を調べるのと同じように、特定の場所にテレポートすることができます。

x, y, z = mc.player.getPos()
mc.player.setPos(x, y+100, z)

これによりプレイヤーは100ブロック上の空中へテレポートします。 これは空中にテレポートして、いた場所に垂直落下することを意味します。

どこか別の場所へテレポートしてみましょう。

ブロックを置く

mc.setBlock()に座標の組み合わせを与えることでブロックを置くことができます。

x, y, z = mc.player.getPos()
mc.setBlock(x+1, y, z, 1)

これで、あなたが立っている場所の隣に石のブロックが現れます。 すぐに目の前に現れなければ、横か後ろかも知れません。 マインクラフトウインドウに戻って、グレーのブロックが目の前に見えるまで マウスを使い、周りを見回してください。

set blockに渡す引数は、xyzidです。 (x,y,z)はワールドの位置 (今回はx + 1でプレイヤーの立っている場所の1ブロック離れたところを指定しました)を示し、 idは配置したいブロックの種類を示します。1は石です。

他に使えるブロックは、

空気:   0
草: 2
土:  3

それでは、今見えているブロックを別のものに変えてみましょう。

mc.setBlock(x+1, y, z, 2)

グレーの石のブロックが目の前で変更するのが見えるはずです。

変数としてのブロック

コードを読みやすくするために、IDを変数に保持することができます。 IDはblockを通して取得します。

dirt = block.DIRT.id
mc.setBlock(x, y, z, dirt)

もしくは、IDを知っているのであれば、直接セットすることもできます。

dirt = 3
mc.setBlock(x, y, z, dirt)

特別なブロック

色を決めることができる追加の設定を持つウールのように、 追加のプロパティを持つブロックがあります。 これを設定するためには、setBlockに任意の4つ目のパラメータを使います。

wool = 35
mc.setBlock(x, y, z, wool, 1)

ここで、4つ目のパラメータ1はウールの色をオレンジに設定しています。 4つ目のパラメータを設定しない場合、デフォルト(0)の白が設定されます。 他の色は、

2: マゼンタ
3: ライトブルー
4: 黄色

いくつかの数字を試してブロックの変化を見てみましょう。

他に追加のプロパティを持つブロックには木(17)[オーク、トウヒ、カバノキなど]、 高い草(31)[低木、草、シダ]、松明(50)[東、西、北、南向き]などがあります。 詳細はAPIリファレンスを参照してください。

複数のブロックを置く

setBlockで1つのブロックを置くのと同じように、 setBlocksで空間の領域をブロックで埋めることができます。

stone = 1
x, y, z = mc.player.getPos()
mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, stone)

これにより10 x 10 x 10の硬い石が埋め尽くされます。

setBlocks関数でより大きな領域を作ることができますが、 生成するのにより長い時間がかかります。

自分が歩いたところにブロックを落としていく

次のコードはあなたが歩いたところに花を落としていきます。

from mcpi import minecraft
from time import sleep

mc = minecraft.Minecraft.create()

flower = 38

while True:
    x, y, z = mc.player.getPos()
    mc.setBlock(x, y, z, flower)
    sleep(0.1)

それでは、しばらく前に歩いて、振り返って後ろにある花を見てみましょう。

while Trueループを使用したので、これは永遠に続きます。 止めるためにはCtrl + cをPythonウインドウ内で押してください。

空を飛んでみて、空に残る花を見てみましょう。

プレイヤーが草の上を歩いているときだけ花を落とすようにしたい場合はどうでしょう。 getBlockを使うとブロックの種類を調べることができます。

x, y, z = mc.player.getPos()  # プレイヤーの位置 (x, y, z)
this_block = mc.getBlock(x, y, z)  # ブロックのID
print(this_block)

これはプレイヤーが立っているブロックのIDを教えてくれます。

あなたが立っているブロックのIDをループで表示することで、これをテストしてみましょう。

while True:
    x, y, z = mc.player.getPos()
    block_beneath = mc.getBlock(x, y-1, z)
    print(block_beneath)

花を植えるかどうか選択するのにif文が使えます。

grass = 2
flower = 38

while True:
    x, y, z = mc.player.getPos()  # プレイヤーの位置 (x, y, z)
    block_beneath = mc.getBlock(x, y-1, z)  # ブロックのID

    if block_beneath == grass:
        mc.setBlock(x, y, z, flower)
    sleep(0.1)

次は、自分の立っている場所がもし草でなければ、草に変えてみてはどうでしょうか。

if block_beneath == grass:
    mc.setBlock(x, y, z, flower)
else:
    mc.setBlock(x, y-1, z, grass)

これで、草の上を歩いているときには、後ろに花を残して、歩くことができます。 もし草でなければ、それを草に変えます。 それから振り返って歩いて戻れば、 今草になったところに花を残していきます。

TNTブロック

もう1つの面白いブロックはTNTです。普通のTNTブロックを置くには下記を使ってください。

tnt = 46
mc.setBlock(x, y, z, tnt)

しかしながら、このTNTブロックはまったく面白くありません。data1を適用してみましょう。

tnt = 46
mc.setBlock(x, y, z, tnt, 1)

それでは、剣を使ってTNTブロックを左クリックしてください。 TNTブロックが起動して、数秒後に爆発するでしょう。

それでは、大きな四角いTNTブロックを作ってみましょう。

tnt = 46
mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, tnt, 1)

これで、TNTブロックで埋め尽くされた大きな四角ができます。 近づいて、1つのブロックを起動してから、走って逃げてどうなるか見てみましょう。 一度にたくさんの変化があるため、グラフィックの描画がとても遅くなるでしょう。

ネットワークプレイ

複数人がラズベリーパイをローカルネットワークに接続すれば、 一緒に同じマインクラフトのワールドに参加することができます。 マインクラフトの中でプレイヤーはお互いに見えるようになります。

APIリファレンス

関数と全てのブロックのIDにいてのさらに幅広いドキュメントは、 stuffaboutcode.com のAPIリファレンスを参照してください。

このページについて

このページはラズベリーパイ財団が権利を保有するRaspberry Pi Documentation五十嵐システムズが日本語訳したものです。
Creative Commons Attribution 4.0 International Licenceのもとで公開されております。
原文はhttps://github.com/raspberrypi/documentationの成果によって作成されています。

なお、このページは2015年6月に翻訳しており、それ以後の更新内容は翻訳に反映していないため、内容が原文とは異なる場合があります。