マインクラフトではじめるプログラミング入門

Raspberry Piの専用OS「Raspbean」にはMinecraft Pi Edition(マインクラフト)がインストールされている。マインクラフトはサンドボックス・タイプの大人気ゲームだ。Pi Editionでは通常のマインクラフトと異なりプログラミングを使ってブロックを組み立てることができる。当記事はRaspberry Pi公式サイトの学習リソース「GETTING STARTED WITH MINECRAFT PI」を意訳したものだ。

マインクラフトを起動する

マインクラフトをデスクトップからから開いてください。もしくはターミナルからminecraft-piと打ち込めば起動することができる。

image-16

マインクラフトをロードして、スタートゲーム(Start Game)をクリックしよう。続いて新しい世界(Create New)を選択しよう。外側のウインドウが少しはみ出ているのに気が付くでしょうか。 これはウインドウをドラッグして移動させるのには、マインクラフトウインドウの後ろの タイトルバーをつかまなければならないということです。

image-8

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

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

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

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

image-9

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

image-7

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

プログラミングでマインクラフトを動かす

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

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

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

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

from mcpi.minecraft import Minecraft

mc = Minecraft.create()

mc.postToChat("Hello world")

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

helloworld

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

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

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は石です。

他に使えるブロックは以下です。

Air:   0
Grass: 2
Dirt:  3

次に今見えているブロックを別のものに変えてみましょう。

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

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

image-11

ブロック定数

あなたはブロックを設置するときに固有のブロックの定数を使うことができるよ。ただし、一行目でimportを入れる必要がある。

from mcpi import block

そして、ブロックを設置するときに以下のようなことが可能になる。

mc.setBlock(x+3, y, z, block.STONE.id)

ブロックのIDを推測するのは簡単で、それに大文字が使われているけど、以下にいくつかの定数の例を載せておく。

WOOD_PLANKS

WATER_STATIONARY

GOLD_ORE

GOLD_BLOCK

DIAMOND_BLOCK

NETHER_REACTOR_CORE

変数としてのブロック

コードを読みやすくするために、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: Magenta
3: Light Blue
4: Yellow

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

他に追加のプロパティを持つブロックには木(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の硬い石が埋め尽くされます。

image-8

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)

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

image-6

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

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

image-5

プレイヤーが草の上を歩いているときだけ花を落とすようにしたい場合はどうでしょう。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)

blockbeneath

花を植えるかどうか選択するのに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)

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

image-4

TNTブロック

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

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

image-15

しかしながら、このままではまったく面白くありませんね。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)
image-13
巨大なTNT爆弾の塊

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

image-14
ドッカーーーンンンン!!!!

溶岩ブロックが流れるのを楽しもう!

溶岩が流れていくのを楽しむことができるlavaブロック(溶岩ブロック)がある。

from mcpi.minecraft import Minecraft

mc = Minecraft.create()

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

lava = 10

mc.setBlock(x+3, y+3, z, lava)

溶岩ブロックを設置すると、ブロックから溶岩が地面に流れる様子は見るべきだろう。

溶岩ブロックが石(rock)になったときが冷え切ったときだ。場所を少し変えて以下のことをしてみるといいだろう。

from mcpi.minecraft import Minecraft
from time import sleep

mc = Minecraft.create()

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

lava = 10
water = 8
air = 0

mc.setBlock(x+3, y+3, z, lava)
sleep(20)
mc.setBlock(x+3,y+5, z, water)
sleep(4)
mc.setBlock(x+3, y+5, z, air)

あなたはsleepパラメータを使うことで溶岩がたくさん流したり、少なく流したりすることが調整可能だ。

image-3

次にすることは?

Python Interfaceでマインクラフトを楽しむにはもう十分知っているよ。

ネットワーク・ゲーム

もし複数の人達とRaspberry Piのローカル・ネットワークを通じて、マインクラフトの世界を一緒に楽しむことができるよ。プレイヤーはマインクラフトの世界で友達を見つけることができるよ。

API リファレンス

関数(Function)やブロックID(block ID)のことをもっと知りたい場合はAPIリファレンスを読んでほしい。

ゲームを作ろう!

マインクラフトでブロック叩きゲーム(Whac-a-Block)を作ろう!

 

Raspberry Piを持っていない方はamazonから購入しよう!マインクラフトでプログラミング楽しいよ!

元記事:GETTING STARTED WITH MINECRAFT PI