[小中学生向け] ラズパイの Minecraft でプログラミングしてみよう

(更新

Minecraft programming on Raspberry Pi for kids.

おうちで遊ぼう、勉強しよう!

前回、Arduino を使ったお子様向けの工作記事を書いてみましたが、学校のお休みがいつまで続くか分からず、不安を感じるお子さん、そして御両親が増えているのではないかと思います。そこで、せっかくのまとまった時間ですし、家の中でも楽しめるプログラミングの勉強などいかがでしょうか。

ただプログラミングと言っても、退屈な内容ではすぐに飽きてしまうと思いますので、世界中の子供たち、そして子供の心を持った大ぜいの皆さん(これは往年の北杜夫氏の言葉ですが)に大人気のゲーム Minecraft(通称マイクラ)を通じて、Python 言語のプログラミングに挑戦してみましょう。また、お子さんに専用のパソコンを購入するのも大変でしょうから、これまた世界中で人気の小型コンピュータ Raspberry Pi(通称ラズパイ)を使い、安価に挑戦できるようにしてみましょう。

どんなことができるの?

簡単なプログラミングで、マイクラの画面上にブロックを置いたり、ブロックを積み上げて虹を作ったりできるのです!!  じゃん!

ちなみに必要な御予算ですが、基本的には Raspberry Pi(以下、ラズパイ)購入だけで済むようにしたいと思います。将来は、ラズパイ上で本物の Minecraft(Java Edition)も動かしてみたいのですが、その場合は商品版の Minecraft のライセンスが必要なので 3000円程度が追加で必要になると思います。(パソコン版のライセンスをお持ちの方は、それを流用できると思います。)

後記(2020/4/11)

Java Edition も試してみました

Raspberry Pi の用意

私が今回使用したのは、Raspberry Pi 3 Model B です。

初めて購入される方には、こんなキットがお勧めです。

子供のオモチャにはちょっと高いなあ、という方は、以下でも良いかと思います。ただし、この場合、本物の Minecraft は動かない、、、かも知れません。(ネットで調べてみたのですが、情報が見つからず…)

なお、Pi 3 A+ の場合、(上記のサイトにも説明がありますが)USB ポートが一つしかないので、キーボードとマウスを USB 接続する場合、USB ハブが必要になってきます。

また、上記のスターターキットに付属していないものとして、以下があります。手持ちがない場合、わざわざ購入しなくても、知人友人でパソコンに詳しい人に相談すれば、使っていないものを貸して頂けるのではないかと思います。できるだけお金をかけず、手元にあるものを活用してお楽しみください。

  • USB キーボード(Bluetooth キーボードも接続できるが、最初の設定に USB キーボードが必要になるかも)
  • USB マウス(同上)
  • HDMI 端子の付いたテレビ、あるいはモニタディスプレイ
  • ワイヤレス LAN(Model B や Pi 4 であれば、有線 LAN でも使えます。ワイヤレス LAN としてはスマホのテザリングでも行けると思いますが、通信料金(最近の言葉でいうと「ギガ」)に注意してください)

他にあると便利なものとしては、予備の SD メモリカードが 1〜2枚あると良いでしょう。一時的に使えるパソコン(Windows, Mac あるいは Linux)があれば、スターターキットに付属の SD カードは大切に保管しておき、新しい SD メモリカードに Raspberry Pi の OS を書き込むことができます。

Raspberry Pi の基本設定

Raspberry Pi の設定方法は、ネットにいろいろ情報がありますので、そちらを参考にすることができます。「それはちょっとハードルが高いな」という方には、書店で入門書が手に入るようですので、御参考になるかと思います。私自身は購入したことがないのですが、例えば Amazon で「raspberry pi 入門」と検索すれば、入門書が見つかることでしょう。

ちなみに今回、私は Raspberry Pi の OS としては Raspbian Buster with desktop をこちらからダウンロードして、Mac OS で SD カード(microSD カード 16GB)に書き込みました。早速、インターネット(私は有線 LAN を使用)とディスプレイを繋いで起動してみましょう。(モアレがたくさん出てしまいました。見づらくてゴメンなさい。)

設定画面は英語ですが、設定後は日本語で利用できるようになります。

Minecraft Pi Edition のインストール

Minecraft で簡単に(かつ無料で)利用できるのは、Pi Edition という専用バージョンです。購入したキットによっては初めから Minecraft Pi Edition がインストールされているかも知れませんが、私の場合は自分でインストールする必要がありました。

インストール方法はこちらに説明がありますが、英語ですので、私の手順を簡単に示しておきます。まず、画面左上のメニューからアクセサリ → LXTerminal を選択します。すると、次のようなウィンドウが表示されます。(写真は、コマンド ls をタイプして、リターンキーを押したところです。)

続いて、Minecraft Pi Edition のインストールです。LXTerminal 上でコマンド sudo apt install minecraft-pi をタイプしてリターンキーを押します。

pi@raspberrypi:~ $ sudo apt install minecraft-pi
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libpng12-0 python3-minecraftpi
提案パッケージ:
  minetest-mod-pycraft
以下のパッケージが新たにインストールされます:
  libpng12-0 minecraft-pi python3-minecraftpi
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
1,464 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,460 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

ここで y を押してリターンキーを押すと、インストールが完了します。

Minecraft の起動

インストールが完了すると、画面左上に次のようなメニューが増えています。

早速、起動してみましょう。

Minecraft の遊び方は、お子さんのほうがよく御存知かも知れません。ただし、この Pi Edition は本物の Minecraft(Java Edition)のような最新の機能(?)を持っていないので、ゲームとしてはすぐに飽きてしまうかも知れませんが、プログラミングの勉強には十分でしょう!

ちなみに、Minecraft を起動するとマウスカーソルがゲームに取られてしまいます。マウスカーソルをゲームの外に出すには、Tab キーを押すか、あるいは Alt + Tab と操作します。

余談ですが、自宅の LAN 内で 2台の Minecraft Pi Edition が動いていると、マルチプレイヤーで遊ぶこともできます。

Python で Minecraft を操作する

ようやく本題に入ります。

Python というのはプログラミング言語の一つで、近年非常に広く利用されているものです。Python に関する入門書もたくさんありますので、探してみてください。ちなみに私は以前、以下のような記事を書いてみましたので、よろしければ御参考ください。(ただし、これを読んだだけでは Python の理解は難しいと思いますので、入門書はぜひ探してみてください。)

記事を読むと、(もう自分でも忘れていたのですが)当時は IDLE というソフトを使って Python を動かしていました。今回新たに Raspbian Buster をインストールしてみたところ、標準ツールが IDLE に代えて Thonny Python IDE というものになっていました。それでは、さっそく Thonny を起動してみましょう。

すると次のような画面が開きます。

大きな白い枠が 2つ表示されていますが、上側はプログラムを作成、編集するための画面で、下側は Python のコマンドを直接実行するためのものです。

早速 Python で Minecraft を操作してみたいのですが、非常に参考になるサイトに下記があります。

今回は、このサイトにある例題を参考にさせて頂きました。

まずは、上の枠に次のようなプログラムをタイプしてみましょう。(最初からタイプミスして動かないとつまらないので、コピペしても良いでしょう。Raspberry Pi のウェブブラウザ Chromium を使って、私のこのサイトにアクセスすれば、コピペできますよね。)

from mcpi import minecraft

mc = minecraft.Minecraft.create()
mc.postToChat("Hello world")

入力が終わったら、Save ボタンを押して hello.py という名前で保存しておきます。

次に Minecraft Pi Edition を起動し、キー操作で動き回れる状態のゲーム画面にしておきます。そうしたら、上記プログラムを実行してみましょう。緑丸の中に白三角のある Run ボタンをクリックします。Minecraft のゲーム画面に Hello world というメッセージが表示されれば成功です!

その他の例については、ぜひ先ほどのサイトのこのページを御覧ください。英語が読めなくても、プログラムコードをコピーして実行するだけで、やり方は自然と分かってくると思います。一つだけ例を示しましょう。

ページの中で Find your location というタイトルの、次のようなコード例があると思います。これは、Minecraft のプレイヤーのいる座標を調べるためのコードです。

pos = mc.player.getPos()

これを実行するには、先ほど Run ボタンを押して mc.postToChat(“Hello world”) まで完了した状態で、下の枠の中に入力して、リターンキーを押します。こんな感じです。

私の画面では、pos = mc.player.getPos() に続けて、次のコマンドを入力し、ゲームのプレイヤーの座標を表示させたところです。

print(pos)

まとめますと、Thonny IDE の上の枠はまとまったプログラムを作成するところで、下の枠は一回一回、個別のコマンドを Python に入力するためのところという訳です。あまり深刻に「失敗したらどうしよう」と考えなくても良いでしょう。Raspberry Pi を壊してしまうことはまずありませんし、SD カードの中身が壊れてしまっても、SD カードを作り直せば元に戻せますので、いろいろやってみることをお勧めします。おそらく、お子さんのほうがすぐにいろいろなことを覚えてしまうと思います!

虹を描いてみよう!

それでは最後に、冒頭に示した「虹」を作ってみたいと思います。こちらは、以下の別サイトを参考にさせて頂きました。

プログラムを引用させて頂きます。

import mcpi.minecraft as minecraft
import mcpi.block as block

import time, math

mc = minecraft.Minecraft.create()

mc.postToChat("Rainbow World")

pos = mc.player.getTilePos()

# red, orange, yellow, green, blue, indigo, violet
rainbow = [14, 1, 4, 13, 11, 10, 2]
radius = 30

# for i in range(16):
#     mc.setBlock(pos.x, pos.y + 2, pos.z + i, block.WOOL.id, i)

for angle in range(360):
    for i in range(len(rainbow)):
        x = pos.x + (radius - i) * math.cos(angle * math.pi / 180)
        y = 0 + (radius - i) * math.sin(angle * math.pi / 180)
        mc.setBlock(x, y, pos.z, block.WOOL.id, rainbow[i])
        time.sleep(0.2)

加筆(2022年10月23日)

ブログを御覧頂いた方から、御質問を頂きました。上の方の説明では pos = mc.player.getPos() とあるのに、こちらのプログラムでは pos = mc.player.getTilePos() となっています、という御指摘です。

スミマセン。私は単純にサンプルコードをコピペしてしまったので、この 2つの違いについては十分に理解していませんでした。補足します。

詳細は、こちらのサイトで説明されていますが、

  • .getPos(): プレイヤーの座標を、小数点の伴う正確な座標で返します
  • .getTilePos(): プレイヤーの座標を、整数の block position で返します

上のプログラムではどちらを使ってもほとんど違いはないと思います。

プログラムは sin() や cos() という三角関数を使っていて、小中学生では難しいと思いますので、御両親の助けが必要になると思いますが、これもまた、お子さんが適当にコードをいじって動かしてみるのも、大いに勉強になると思います。プログラムの最後に time.sleep(0.2) とありますが、これは待ち時間を入れて、虹を描くスピードをわざと遅くしています。0.2 という値をいろいろ変えてみるのも面白いでしょう。また、rainbow = [ … ] という行に数字がいろいろ並んでいますが、これが虹の色に対応しています。探してみたら、以下のようなサイトに説明がありました。

色のリストを引用しておきます。

Data Values of blocks:
WOOL:
0: White
1: Orange
2: Magenta
3: Light Blue
4: Yellow
5: Lime
6: Pink
7: Grey
8: Light grey
9: Cyan
10: Purple
11: Blue
12: Brown
13: Green
14: Red
15:Black

他の参考書

最後に、面白そうな参考書を挙げておきます。

残念ながら(?)英語で書かれた本なのですが、高校生くらいになれば頑張って読めるかも知れません。(この手の技術書は、大抵の場合、英文法などにそれほど詳しくなくても内容はなんとなく理解できるものです。)サンプルページを PDF でダウンロードできるようになっているので、ぜひ御参考ください。

それでは、今回はここまでにしておきましょう。

お問い合わせはお気軽に

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。