ラズパイ用マインクラフトで子どもとプログラミング

プログラミングや電子工作の学習用にも人気の小型コンピュータ、ラズベリーパイ。

ラズベリーパイを使えば、マインクラフトPi Editionを無料で遊ぶことができます。

しかもPi Editionは、プログラミング開発環境と連携させることができるので、簡単にプログラミングを始めることができます。

我が家でもプログラミングを通してマイクラの世界を遊んでみたので、その内容をまとめました。

目次


ラズベリーパイとは

ラズベリーパイとは、手のひらサイズほどの小型コンピュータです。

もともとはコンピューターサイエンスの教育用教材としてイギリスで開発され、日本でもオンラインショップや電子部品屋さんで購入することができます。

ラズベリーパイという名前はフルーツのラズベリー、プログラミング言語のPython(パイソン)とお菓子のパイをかけていて、日本ではラズパイという愛称で親しまれています。

小さいものの、モニターやキーボードをつければネット検索やゲームをして楽しむこともできますし、ロボットの制御や、家庭内のIoT環境の構築などにも利用できます。

価格も定価が10,000円以下と、コンピュータとしては低予算で購入できるため、子供のプログラミング学習や電子工作用としても人気があります。(ただし現在は半導体不足の影響で、定価で入手しづらい状況が続いているようです。)


マインクラフトPi Editionとは

マインクラフトPi Editionは、ラズパイ上で動作する特別なバージョンのマインクラフトです。

公式サポートはすでに終了しているため、ブロックやMobなどの種類は少ないですが、通常のマイクラと同じように採掘や建築を楽しむことができます。

さらに、Pi Editionではプログラミング言語のPythonを使ってゲームの操作をすることができます。

このおかげで、子ども達に大人気のマイクラで、気軽にプログラミング学習を始められるのです。

なお、マインクラフトPi Editionはラズベリーパイを持っていれば無料でインストール可能です!


ラズベリーパイのプログラミング環境

もともと教材として開発されたラズパイには、プログラミングを手軽に始められるアプリが標準で搭載されています。

ラズパイを立ち上げて、モニターに画像を写し、メニューからプログラミングを開くと、そこにはずらっとプログラミング用のアプリが並びます。

中には子ども達に大人気のScrachもあります。

今回の記事では、この中からThonnyを使ってプログラミングしていきたいと思います。


マインクラフトの世界をプログラミングで遊ぶ

今回のプログラミングではラズパイに標準搭載されているThonnyを使っていきます。

Thonnyは初心者向けのPythonの開発環境で、ソースコードごとにファイルを作成・保存してくれるのが特徴です。

このため、別々のコードがつながって分かりづらくなることを防いでくれ、コード完成後も保存ファイルとして整理しやすくなります。


事前準備

1.マインクラフトPi Editionのインストール

マインクラフトPi Editionはインストールが必要です。

もしまだインストールしていない場合は、こちらのページをご覧ください。

Pi-Appsを使った簡単なインストール方法を紹介しています。


2.マイクラ用のPythonライブラリのインストール

マイクラをPythonから操作するため、マイクラ用のPythonライブラリであるmcpiをインストールしておく必要があります。

インストールするためには、ターミナルを開いて以下のコマンドを実行します。

この手順は初回一回のみで大丈夫です。

pip install mcpi


マイクラとThonnyを連携させる

マイクラとThonnyは、それぞれのアプリをマイクラのワールド -> Thonnyの順に立ち上げるだけで簡単に連携できます。

まず、マイクラのワールドを開きます。ワールドはクリエイティブモードを選んでください。

ワールドが開いたらキーボードでTabを押して、マウスをマイクラの画面内から出し、プログラミングメニューからThonny Python IDEを開きます。

これでマイクラとThonnyが連携しました。

※マイクラ側で別ワールドを立ち上げてしまうなど、何らかの操作の拍子にマイクラとThonnyの連携が切れてしまうことがあります。 その場合は一度マイクラのワールドを閉じ、再度マイクラのワールド->Thonnyの順に立ち上げると復活します。


マイクラの画面にHello World!を出してみる。

新しい言語を学ぶときの定番で、まずはチャット欄に “Hello World!”を出すプログラムを書いてみます。

Thonnyの画面を見ると、上下に二つのスペースがあります。

上のスペースはコードを書くスペース。下のスペースはコードを実行した時の結果やデバッグ情報が表示されます。

上側のスペースに以下のコードを入力またはコピペします。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 

mc.postToChat("Hello world!")

入力が完了したら、ファイルを保存します。

Thonnyの画面上にあるSaveをクリックして保存します。ファイル名は拡張子を入れず、名前だけを入力すればOKです。

保存できたらThonnyのSaveの隣りにあるRunをクリックします。

マイクラのチャットにHello World!の文字が出ました。


自分のいる位置の座標を取得してからテレポート

次に自分のいる位置の座標を取得し、取得した値をもとに離れた場所へテレポートするコードを書いてみます。

新しいコードを書くときはThonnyの画面上で、Newをクリックし、開いた新しいタブにコードを書いていきます。

自分のいる位置の座標は以下のコードで取得することができます。

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

それでは、これを使ってx方向に10歩進んだところまでテレポートしてみます。コードは以下のようになりました。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 

x, y, z = mc.player.getPos() #プレイヤーの現在位置を取得
mc.postToChat('x=' + str(x) + 'y=' + str(y) + 'z=' + str(z)) #座標をチャットに表示

mc.player.setPos(x+10, y, z) #プレイヤーの位置をx方向に10ブロック移動

x, y, z = mc.player.getPos() #プレイヤーの移動後の位置を取得
mc.postToChat('x=' + str(x) + 'y=' + str(y) + 'z=' + str(z)) #座標をチャットに表示

上記コードではチャットに現在地を表示するためにmc.postToChatを追加しました。入れなくても構いません。

行きたい場所の座標がすでに決まっている場合は、上記のコードのmc.player.setPos(x, y+10, z)の座標を行きたい座標に置き換えて実行すると、その場所へテレポートできます。


プログラミングでブロックを設置

今度はプログラミングでブロックを配置していきたいと思います。

ブロックの指定には、ブロックIDを使います。

ブロックIDは、こちらのサイトで確認しました。ブロックの画像と一緒にIDを一覧にしてくれているので便利です。

今回は金のブロックID、41を使ってコードを書いていきます。


1.まずは金のブロック一個置き

まずはブロックを一個だけ置いていきます。

以下のコードでブロックを設置できます。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 

x, y, z = mc.player.getPos() #プレイヤーの現在位置を取得
mc.setBlock(x+1, y, z, 41) #プレイヤーの位置の隣にブロックを設置

上記コードでは、自分の座標を取得後、mc.setBlockの座標指定を(x+1, y, z)とすることで、自分の立っている位置からx方向に一個動いた場所に金ブロックを置いています。


2.複数のブロックを一気に設置

次に複数のブロックを一度に置いてみます。

以下のコードで金のブロックを3x3x3のサイズで置きました。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 

x, y, z = mc.player.getPos() #プレイヤーの現在位置を取得
mc.setBlocks(x+1, y, z, x+3, y+2, z+2, 41) #プレイヤーの位置の隣に3x3x3のサイズでブロックを設置

一つ前で書いたコード内のmc.setBlockが、複数形のmc.setBlocksになっている点に注意です。

座標指定部分は、一番小さい座標 -> 一番大きい座標の順に並べて書きます。


3.中が空洞の直方体を設置

最後に中が空洞の直方体を作成してみます。

外枠用のブロックで直方体を作った後に、中心部を空気ブロックで置き換えることで中を空洞にします。

空気ブロックのブロックID、0を使って、以下のコードを書きました。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 
x, y, z = mc.player.getPos()

mc.setBlocks(x+1, y, z, x+5, y+3, z+6, 41) #金ブロックを5x7x4で設置
mc.setBlocks(x+2, y+1, z+1, x+4, y+3, z+5, 0) #金の直方体の内側を空気ブロックで上書き設置

これで中が空洞の直方体ができました。屋根をつけたり装飾をして家にすることができます。

プログラムは上から順に実行されていきますので、金ブロックの後に空気ブロックを設置することで、空気ブロックで内側を上書きできます。


歩いた場所にブロックを自動設置

1.歩いた場所にお花を植える

次に歩いた場所に自動でお花を植えていくコードを書いてみます。

while文を使うことで、コードが停止されるまでwhile内のプログラム(お花を植える)が実行されます。

コードは以下のようになります。

from mcpi.minecraft import Minecraft
from time import sleep
mc = Minecraft.create()

while True:
    x, y, z = mc.player.getPos() #現在位置を取得
    mc.setBlock(x, y, z, 38) #現在位置に花のブロックを設置
    sleep(0.1)  #0.1秒待機

while内で自分の位置を取得 -> お花を置く -> 待機という動作がずっと続くようになっています。

プログラムを止める際にはキーボードでCtrl + Cを押して停止します。


2.足元のブロックが草ブロックの時だけお花を植える

先ほどのコードに、足元のブロックの種類をチェックするコードを加え、足元が草ブロックの時だけお花を植えるようにしてみます。

if文を使うことで、条件に合致した時のみ、その後ろにある命令が実行されるようになります。

コードは以下のようになりました。

from mcpi.minecraft import Minecraft
from time import sleep
mc = Minecraft.create()

while True:
    x, y, z = mc.player.getPos() #現在位置を取得
    block_beneath = mc.getBlock(x, y-1, z) #足下のブロックの種類を取得してblock_beneathに代入
    if block_beneath == 2: #もし下にあるブロックが草であれば
        mc.setBlock(x, y, z, 38) #現在位置に花のブロックを設置
    sleep(0.1) #0.1秒待機

石レンガブロックを並べた上で、上記を実行して歩き回り、花壇を作りました。


TNTを爆発!

Pi EditionのクリエイティブモードではTNTの爆発ができません。

しかしコード内でデータ値を指定して設置すると、着火して爆発するTNTを置くことができます。

以下のコードのように、TNTのブロックID46の後ろにデータ値1を追加しました。

from mcpi.minecraft import Minecraft 
mc = Minecraft.create() 

x, y, z = mc.player.getPos()
mc.setBlocks(x+1, y, z, x+3 y+2, z+2, 46,1) #TNTのブロックID46の後ろにデータ値1を追加

TNTブロックが置けたら、あとは叩くだけでTNTが爆発します!


叩いたブロックがダイヤモンドに変わる!?

最後に、叩いたブロックがダイヤモンドに変わるプログラムを試してみます。

コードはこちらのブログを参考にしました。

ちょっと長いですが、コードは以下のようになります。

from mcpi.minecraft import Minecraft
from time import sleep
mc = Minecraft.create()

try:
    while True:
        blockEvents = mc.events.pollBlockHits() #ブロックのヒットイベントを取得
        if blockEvents: #もしヒットイベントがあれば
            for blockEvent in blockEvents: #各ヒットイベントに対して処理を実行
                mc.postToChat('Hit detected') #チャットにヒットが検出されたことを表示
                x,y,z = blockEvent.pos #ヒットしたブロックの位置を取得
                mc.setBlock(x,y,z,56) #ヒットしたブロックの位置にブロックID56ダイヤモンドブロックを設置
        sleep(1) #1秒待機
except KeyboardInterrupt:
    print('Stopped') #Ctrl+C時にThonny画面上でStoppedのメッセージを表示

叩くときは、ブロックを持っていない状態にするか、剣などに持ち替えて右クリックで叩きます。

チャット欄に”Hit detected”の表示がされると共に叩いたブロックが変わります。

ダイヤモンドを指定しているIDを変えればTNTなど別のブロックにもできますよ。


まとめ

ラズパイで遊べるマイクラを使い、子どもとプログラミングをしてみました。

まだ一人で書くことは難しいですが、ブロックIDを変えて好きなブロックを置いたり、大きな建築物を作るときにはプログラミングで置こうと提案してきたり、プログラミングを介した遊び方を子どもなりに楽しんでいました。

爆発するTNTやブロックの自動設置、ヒットでのブロックの置き換えなどはプログラミングならではの遊びなので、うまく動くと面白いと思います。

特段難しい手順もなく簡単に始められるので、子どもと試しにやってみるには良いチャレンジでした。


参考サイト