以前にこちらで、ラズパイ(Raspberry Pi)の Minecraft で Python プログラミングしてみよう、という記事を書かせて頂きました。今でも十分に役に立つ内容だと思うのですが、一番の問題は「ラズパイがお店で手に入らないよ!」というところではないでしょうか。半導体製品の流通混乱の影響ということで、ラズパイの入手が難しくなっているようです。(2022年10月現在)
「ラズパイ、Amazon を覗くとちゃんと売っているよ」とおっしゃる方もあるかも知れません。しかし、販売価格が 2〜3万円と異常な高値になっています。流通の混乱を利用して、まとめ買いをした業者が高額に転売している例もあると聞きます。本来、ラズパイは 5000円程度から購入できる、つまり、お子さんのお小遣いでも手に入る安価なマイコンボードだったのです。
個人的には、特別な事情のない限り、今はラズパイを購入する時期ではないと思います。流通の混乱が収まれば、いずれ以前と同様の価格で入手できるようになるでしょう。どうしてもラズパイを触ってみたいという方は、そのような電子キットに御興味のある御友人に相談してみてはいかがでしょうか。押し入れに眠っているラズパイがあるかも知れませんヨ!
閑話休題。
さて、お子さん向けの素晴らしいプログラミング体験があるのに、流通の混乱でラズパイが手に入らないというのは悲しいことですが、逆に、リモートワーク環境の定着により、一般向けのパソコン(PC)が入手しやすくなっていると聞きます。せっかくですので、お子さん向けにパソコンを購入する、というのも一案かも知れません。
また余談ですが、もしお子さん向けにパソコンを購入する場合は、私はラップトップ(ノートパソコン)ではなく、デスクトップをお勧めします。成長まっさかりのお子さんには、目に優しいディスプレイ、手や指の負担にならない、しっかりした造りのキーボードを容易に繋ぐことのできることが重要だと思います。また、一般にラップトップよりもデスクトップのほうが、安価に高性能な製品を入手できますし、カスタマイズ(メモリやディスクの増設)がしやすく、長期間にわたって安心して利用できます。
そこで今回は、パソコン上で動作する Minecraft(マイクラ)、つまり Java Edition(ジャバ・エディション)で Python プログラミングをする方法を紹介しましょう。なんと、最新の Minecraft 1.19.2 版でも動きますよ!
ちなみに、最近は学習塾などで Minecraft のプログラミングを取り上げているところが増えているようです。それはそれで重要な取り組みだと思うのですが、その多くがマイクロソフト社の MakeCode(メイクコード)と Minecraft Education Edition(教育版)という教育製品を使ったもののようです。
しかし、この Education Edition は利用料を毎年支払わなくてはならない「教育製品」であり、一般の利用者(つまり、ご家庭のお父さんお母さん)にとっては取り付きづらいものではないかと思います。また私見ですが、Education Edition は結局のところマイクロソフト社の教育ビジネスだ、というのが私の理解です。つまり、私が子供だった頃からそうですが、市販の通信教材(「科学と学習」や「赤ペン先生」など)を親が子供に買い与えて、それで満足してしまう、というのと同工異曲だと思うのです。
それに対して、今回御紹介するやり方は、Minecraft の Java Edition を購入するので一回だけの費用はかかりますが、基本的には、御家族の手作業だけで進められる、草の根的(?)な家庭内教育となり、教育ビジネスを利用するよりもずっと効果が高い学習法だと信じています。お父さんやお母さんも実際に手を動かすことができ、それをそばで見ているお子さんの御興味も、より高まるのではないでしょうか。
それでは実際にやってみよう!
今回は、こちらのプロジェクトで紹介されている RaspberryJuice を利用します。これは、前回に紹介した Minecraft Pi Edition(MCPE と略すそうです)の Python プログラミングと互換性があるものです。(一方で、これは上述の Minecraft Education Edition の Pythonプログラミングとは互換性がありません。)
ただし一つの難関は、これは一般の Minecraft Java Edition だけでは動作せず、「Minecraft サーバー」というものを動かさないといけない、ということです。しかし、Minecraft サーバーを動かすということには、次のような面白い点もあります。
- Minecraft サーバーの動かし方を勉強できます。
- Minecraft Realms のような有料サービスを使わずに、Minecraft のマルチプレイができます。
- 独自の Minecraft サーバーなので、利用者(お子さんのお友達など)が変なことをしても(しでかしても!?)、サーバー管理者から ban(利用停止)処分になったりしません。ただし、お友達とケンカしたりしないように…
欠点としては、
- Minecraft サーバーを動かす PC が必要です。常時動かしておく、となるとちょっと負担かも知れません。
- パソコン技術や Java の動かし方など、少し技術的な知識と操作が必要です。
- おうちの外からも参加できるようにしたい場合、インターネットやルーター、ファイアーウォールの知識や設定が必要です
というところでしょうか。
それでもやってみる!
という方は、次に進みましょう。今回必要になるのは、以下のソフトウェアです。
- Minecraft Java Edition: これは、今回これをお読みになっている方は既にお持ちかと思います。サーバーへの参加者ひとりに付き、一つのアカウントが必要です。
- Minecraft サーバー Spigot: 無料のソフトウェアです。Windows や Linux、macOS 上の Java というプログラミング環境で動作します。今回私は、1.19.2 版という最新のものを利用しました。
- Python プログラミング環境: Python のプログラミングに御興味のある方は、既にインストールなさっているかも知れません。私は今回、macOS 上の 3.9.11 版を使いました。もちろん Windows 上でも大丈夫なはずです。
- そして RaspberryJuice: 今回の重要なソフトウェアです。もちろん無料です。私は 1.12.1版を使用しました。
上の説明でお気づきかも知れませんが、この RaspberryJuice は Minecraft の 1.19.2 で動作するのです。つまり、カエルやおたまじゃくしも登場します。やっぱり、最新の Minecraft で遊びたいですよね!?
ちなみに、今回の作業にあたって、こちらの方の説明(下記リンク)を参考にさせて頂きました。ありがとうございました。Thanks for the helpful tutorial!
Spigot のインストール
私は Minecraft サーバーの実情には詳しくないのですが、最近はこの Spigot というのが広く利用されているようです。また、RaspberryJuice では Bukkit という拡張環境を使って実装していますが、Spigot も、この Bukkit の技術を採用した Minecraft サーバーのようです。
この Spigot は、上述の通り Windows や Linux、macOS 上で Java 技術を使って動作します。インストール方法はこちら(1.19.2 版の説明)にあります。Java がインストールされている必要がありますが、既に Minecraft Java Edition 1.19.2 が PC インストールにインストールされているのであれば、その中にある Java を使って Spigot をインストールすることも可能のようです。(私はそうしました。)
今回はこちらの情報を参考として、Java の version 17 を使います。macOS であれば、以下に新しい Java がありますので、バージョンを確認します。
~/Library/Application\ Support/minecraft/runtime/java-runtime-gamma/mac-os/java-runtime-gamma/jre.bundle/Contents/Home/bin/java
以下を実行します。(macOS での例を示しますが、Windows や Linux の場合は、こちらのサイトを参考にしてくだださい。)
bash$ ~/Library/Application\ Support/minecraft/runtime/java-runtime-gamma/mac-os/java-runtime-gamma/jre.bundle/Contents/Home/bin/java -version
openjdk version "17.0.3" 2022-04-19 LTS
OpenJDK Runtime Environment Microsoft-33154 (build 17.0.3+7-LTS)
OpenJDK 64-Bit Server VM Microsoft-33154 (build 17.0.3+7-LTS, mixed mode)
バージョン 17 のようですので、これを使います。
Spigot をインストールするには、まず BuildTools というのをここからダウンロードします。ダウンロードしたら、Java で実行します。
bash$ mkdir -p ~/tmp/spigot
bash$ cd ~/tmp/spigot
bash$ ~/Library/Application\ Support/minecraft/runtime/java-runtime-gamma/mac-os/java-runtime-gamma/jre.bundle/Contents/Home/bin/java -jar ~/Downloads/BuildTools.jar --rev 1.19.2
このビルドは、名前の通り実際のビルド作業を伴うようで、かなり時間がかかります。30分程度はかかると覚悟(?)しておいたほうが良さそうです。
ビルドが完了すると spigot-1.19.2.jar というファイルが作られますので、これを適切なディレクトリにコピー(あるいは移動)します。例えば、
bash$ mkdir ~/spigot
bash$ cp spigot-1.19.2.jar ~/spigot
続いて、RaspberryJuice のインストール作業をします。
RaspberryJuice のインストール
以下のように、spigot のディレクトリに移動し作業をします。
bash$ cd ~/spigot
bash$ echo eula=true > eula.txt # これをすることで、<span style="color: #ff0000;" data-darkreader-inline-color="">エンドユーザーライセンスに同意</span>することになります!
ここで RaspberryJuice を GitHub からダウンロードします。.jar ファイルのダウンロードだけなら簡単なのですが、後で Python ライブラリをディレクトリごとインストールすることになるので、Git に詳しくない方は、以下の手順に従ってください。
まず、GitHub から RaspberryJuice のリポジトリを zip ファイルとしてダウンロードします。ここの URL を開いたら、Code という緑色のボタンをクリックし、Download ZIP という部分をさらにクリックしてダウンロードします。
まず、展開先のディレクトリを作りましょう。
bash$ mkdir plugins; cd plugins
ダウンロードした zip ファイルを展開し、次のファイルを上の pluglins の下にコピーします。
bash$ cp (展開したzipの中の)RaspberryJuice-master/jars/raspberryjuice-1.12.1.jar .
次に、実際に Python のプログラミングをするディレクトリを用意しましょう。そして、その中に RaspberryJuice の Python ライブラリをコピーします。
bash$ mkdir ~/rj # ディレクトリ名はおまかせします
bash$ cd ~/rj
bash$ cp -R (展開したzipの中の) RaspberryJuice-master/src/main/resources/mcpi .
これで準備完了です。
実際に動かしてみよう!
それでは、実際に動かしてみましょう。まずは Minecraft サーバー Spigot を起動します。
Spigot の起動
先ほどの spigot ディレクトリに移動し、java を使って Spigot を起動します。(上と同じく、私は Minecraft Java Edition に含まれる Java を利用しています。)
bash$ ~/Library/Application\ Support/minecraft/runtime/java-runtime-gamma/mac-os/java-runtime-gamma/jre.bundle/Contents/Home/bin/java -jar spigot-1.19.2.jar
最初は、ワールドを作成したりするので時間がかかりますが、2回目からはもう少し早くなるはずです。Minecraft Server というウィンドウが表示され、最後に
Done (なんとかs)! For help, type "help" >
のような表示が出るはずです。このプロンプト「>」以下には、各種の Minecraft サーバーコマンドを入力できるのですが、それについては Spigot や Minecraft ウィキの説明を御参考ください。以下で必要なコマンドが出てきたら、逐一紹介したいと思います。
Minecraft アプリ(Java Edition)の起動
続いて、Minecraft アプリ(ゲーム)を起動しましょう。これは皆様御存知ですね。起動したら、1.19.2 版を選択し立ち上げます。そうしたら、「マルチプレイ」のボタンをクリックします。(シングルプレイではないですよ!)
マルチプレイの注意点が表示されますので、確認して「続ける」をクリックします。次に、先ほど起動した Minecraft サーバーを登録します。(ネットワークに詳しい皆さんは既に御想像の通り、Minecraft サーバーは Minecraft アプリとは異なる PC 上で実行することができます。家にサーバーがある方はその上で、あるいはクラウド上で Minecraft サーバーを動かすことができる訳ですね。)
「サーバーを追加」ボタンをクリックし、サーバー名を入力します。「my spigot 1.19.2」などを入力しましょう。サーバーアドレスには、「localhost」(綴りを間違えないように)と入力します。最後に「完了」ボタンをクリックします。
すると、画面上の「マルチプレイで遊ぶ」の下に my spigot 1.19.2 が表示されるはずです。サーバーがちゃんと動作していれば、0/20 という表示と共に、緑色のバーグラフ(?)が「バリ 5」(古い?)を表示するはずです。これで準備完了です。この my spigot 1.19.2 をクリックし、「サーバーに接続」ボタンを押すと、ゲームがスタートします。
ここからは、Minecraft の普通のマルチプレイと同様です。シングルプレイしかしたことがない皆様には新鮮かも知れません。もし、複数の Minecraft アカウント(有料の登録ユーザー)をお持ちの方は、別のパソコンからもマルチプレイで接続してみましょう。画面上に複数のプレイヤーが表示されますね!
最初の Python プログラミング
ここまでできたら、実際に Python で Minecraft を操作してみましょう。以下では、私は Python 標準のインタープリタを使いますが、皆様は、お好きな Python 環境を御利用頂いて結構です。前回の Raspbery Pi での紹介では Thonny を使いましたが、例えば Mu エディタでも良いでしょう。
先ほど作成した(ライブラリをコピーした)ディレクトリで Python を起動します。
bash$ python
Python 3.9.11 (main, Jul 22 2022, 13:00:15)
[Clang 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
続いて、RaspberryJuice の Python ライブラリを読み込みます。このライブラリは、前回紹介した Raspberry Pi での Python ライブラリと同様に使えます。(互換性があります。)
>>> import mcpi.minecraft as minecraft
>>> mc = minecraft.Minecraft.create()
>>> pos = mc.player.getPos()
>>> print(pos)
Vec3(10.727764366293115,0.0,-3.9533508709664034)
プレイヤーの座標が表示されましたでしょうか?
ここまでできたら、前回と同様にプログラミングが楽しめます。こちらや、こちらの虹を描くプログラムを試してみると良いでしょう。
また、こちらにはさらに面白い例がたくさん紹介されています。
マルチプレイヤーでの注意点
さて、せっかく Minecraft サーバー上で Python プログラミングを楽しめるのですから、複数のユーザーが同時にプログラミングできると良いですよね。それは可能なのですが、元々の(ラズパイ用の) Minecraft Pi Edition にはマルチプレイヤーの考えがなかったので、Python プログラミングでは少しばかり注意が必要です。
サーバーのアドレス
最初の注意点は、あるパソコンから Minecraft サーバー(つまり RaspberryJuice のサーバー)にアクセスするには、サーバーが動いているパソコンの IP アドレスというものを指定しなくてはいけない、という点です。サーバーの IP アドレスを調べる方法はネットで探して頂くとして、ここでは、アドレスが 10.0.0.1 だったとしましょう。
ちなみに、おうちや職場の外からサーバーにアクセスするには、ルーターやファイアーウォールの設定が必要ですし、セキュリティ上の配慮も必要です。インターネットやネットワーク設定に詳しい方に相談してみてください。
あるパソコン(Minecraft サーバーが動作しているのとは別のパソコン)から Python でアクセスするには、次のようにします。上に書いたように、サーバーの IP アドレスが 10.0.0.1 だとしましょう。
mc = minecraft.Minecraft.create("10.0.0.1")
ここでエラーなく接続できたら、後の使い方は同じです。面白いことに、Minecraft サーバーには複数のパソコンから Python で接続でき、個別にプログラムを動かすことができます。
複数のプレイヤー
ここが、少し厄介な点です。RaspberryJuice では、pos = mc.player.getPos() などで player 変数(オブジェクト)を参照すると、常に「ホストプレイヤー」が参照されます。ホストプレイヤーというのは難しいのですが、Minecraft サーバーに最初に接続したプレイヤーが「ホストプレイヤー」になるようです。他に参加しているプレイヤーは、ホストプレイヤーではありません。
つまり、Minecraft サーバーに複数のプレイヤーが接続し、それぞれが Python プログラムを実行すると、それをどこで実行しているかに係わらず、mc.player がホストプレイヤーを指してしまうのです。これはちょっと困りましたね。(自分でないホストプレイヤーの位置を変えてしまうと、ホストプレイヤーがびっくりするかも知れません。)
解決方法としては、以下のようなやり方があります。いずれ、もっとうまい解決法を考案してくれる方があるかも知れませんし、私が考案しても良いのですが、まずはこれを試してください。
最初に、ホストプレイヤーでないプレイヤーを探す方法です。いま、そのプレイヤーの Minecraft 上での名前が「PlayerTaro」だとしましょう。
id = mc.getPlayerEntityId('PlayerTaro')
print(id)
すると、そのプレイヤーの(ゲーム上での)番号が表示されます。なお、この番号はサーバーに接続する度に変わってきます。また、もしそのプレイヤーがゲームに接続していない場合には、次のようにエラーになります。
>>> id=mc.getPlayerEntityId('PlayerJiro')
Traceback (most recent call last):
File "", line 1, in
File "/Users/yokoyama/tmp/mcpi/minecraft.py", line 336, in getPlayerEntityId
return int(self.conn.sendReceive(b"world.getPlayerId", name))
File "/Users/yokoyama/tmp/mcpi/connection.py", line 62, in sendReceive
return self.receive()
File "/Users/yokoyama/tmp/mcpi/connection.py", line 56, in receive
raise RequestError("%s failed"%self.lastSent.strip())
mcpi.connection.RequestError: b'world.getPlayerId(PlayerJiro)' failed
はい。ここで、正しくプレイヤーの番号が確認できたとしましょう。ここではその番号を 123 だとします。つまり、
>>> id=mc.getPlayerEntityId('PlayerTaro')
>>> print(id)
123
という訳ですね。
そうしたら、例えばホストプレイヤーで mc.player.getPos() の代わりに、このユーザー PlayerTaro の座標を調べるには、次のようにします。
>>> mc.<span style="color: #ff0000; --darkreader-inline-color: #ec2929;" data-darkreader-inline-color="">entity</span>.getPos(<span style="color: #ff0000;" data-darkreader-inline-color="">id</span>)
Vec3(10.727764366293115,0.0,-3.9533508709664034)
座標を変えるには、次のようにします。
>>> mc.<span style="color: #ff0000; --darkreader-inline-color: #ec2929;" data-darkreader-inline-color="">entity</span>.setPos(<span style="color: #ff0000;" data-darkreader-inline-color="">id</span>, 100, 0, 100)
うまく行きましたでしょうか。mc.entity の使い方は、こちらを参考にしてくださいね。
シングルプレイヤーとマルチプレイヤーで、書き方がちょっと違ってしまう点と、間違って他のプレイヤー(特にホストプレイヤー)の位置を勝手に動かしてしまったりと、トラブルがあるかも知れませんが、注意して遊んでみてください。くれぶれも、お友達とケンカしたりしないように!
またいずれ、Spigot や RaspberryJuice の使い方について紹介したいと思っています。今日はここまで。