Scratch2MCPIでMinecraft Piを焼き上げよう
最終回の今回は、調理の仕上げとしてScratch2MCPIでMinecraft Piを焼き上げて料理を完成します。具体的には、Minecraft Piの世界に一瞬で塔や壁を創造するプログラミング方法を解説します。通常のScratchとScratch2MCPIの違いは、Minecraft Piの世界を操作できる命令が追加される点です。通常のScratchではMinecraft Piの世界は操作できません!
Scratch2MCPIに追加された命令の一部
はじめに、Minecraft Piを起動してワールドを作成し、その後Scratch2MCPIを起動して両アプリの連携が取れた状態にしてください。前回の「アプリの起動順に注意しよう」の項でも説明したように、起動するには順番があります。順番を間違えるとうまく接続できないので注意してください。
さて、うまくMinecraft Piと接続できれば、Scratch2MCPIの「制御」分類に図1の命令が、また「変数」分類には図2の命令が追加されます。これ以外にも命令を実行すると追加される命令がありますが、こちらは後ほど解説します。
これらの命令はドロップダウンリストになっており「▼」をクリックするとほかの命令も表示されます。
塔を作ってみよう
準備ができたら、手はじめに10段の塔を作ってみましょう。Scratch2MCPIで図3のようなプログラムを組み立てます。
順番に説明しましょう。まず「制御」分類にある「スペースキーが押されたとき」をスクリプトエリア内にドラッグ&ドロップします。次に同じ「制御」分類から「getHeightを送る」を「スペースキーが押されたとき」と結合し、「getHeight」の「▼」アイコンをクリックして「reset」を選択します。これで、スペースキーを押すとMinecraft Piの世界がリセットされて大草原だけが広がる景色になります(図4)。通常Minecraft Piの世界には木々や海、岩などが存在していますが、その状態で「塔」を創造しても場所がわかりにくいので、一度Minecraft Piの世界をリセットしておくのです。
続けて「制御」分類から「緑色の旗がクリックされたとき」をドラッグ&ドロップし、その下に「変数」分類から「blockDataを0にする」を4個組み合わせます。「blockData」の「▼」アイコンをクリックして、上から「mcpiX」、「mcpiY」、「mcpiZ」を「0にする」と指定します。これは「Minecraft PiのX、Y、Z軸を0で初期化する」という意味です。最後の「bloackData」には「blockTypeId」を選択しましょう。これは、積み上げるブロックの種類を数値で指定するものです。blockTypeIdに指定する値とその種類は表1のようになります。ここでは「1」を指定したので「石の塔」が積み上げられます。
bkockTypeId | ブロックの種類 |
---|---|
0 | 空気 |
1 | 石 |
2 | 草 |
3 | 土 |
4 | 丸石 |
5 | 木材 |
6 | 苗木 |
7 | 岩盤 |
8 | 水 |
9 | 静止した水 |
10 | 溶岩 |
11 | 静止した溶岩 |
12 | 砂 |
13 | 砂利 |
14 | 金鉱石 |
15 | 鉄鉱石 |
16 | 石炭鉱石 |
17 | 原木 |
18 | 葉 |
20 | ガラス |
21 | ラピスラズリ鉱石 |
22 | ラピスラズリブロック |
24 | 砂岩 |
26 | ベッド |
30 | 蜘蛛の巣 |
31 | 草 |
35 | 羊毛 |
37 | 黄色の花 |
38 | バラ |
39 | キノコ(茶) |
40 | キノコ(赤) |
41 | 金ブロック |
42 | 鉄ブロック |
43 | 重ねたストーンスラブ |
44 | ストーンスラブ |
45 | レンガブロック |
46 | TNT |
47 | 本棚 |
48 | 苔石 |
49 | 黒曜石 |
50 | 松明 |
51 | 炎 |
53 | 樫の木の階段 |
54 | チェスト |
56 | ダイヤモンド鉱石 |
57 | ダイヤモンドブロック |
58 | 作業台 |
60 | 耕地 |
61 | かまど |
62 | 燃えているかまど |
64 | 木のドア |
65 | 梯子 |
67 | 丸石の階段 |
71 | 鉄のドア |
73 | レッドストーン鉱石 |
78 | 雪 |
79 | 氷 |
80 | 雪のブロック |
81 | サボテン |
82 | 粘土ブロック |
83 | サトウキビ |
85 | フェンス |
89 | グローストーンブロック |
95 | 鍵のかかったチェスト |
98 | 石レンガ |
102 | 板ガラス |
103 | メロン |
107 | フェンスゲート |
246 | 輝く黒曜石 |
247 | ネザーリアクターコア |
これで石の塔を積み上げる準備ができたので、今度は石を10段積み上げる命令を追加していきます。「制御」分類から「10回繰り返す」をドラッグ&ドロップして「緑色の旗がクリックされたとき」に結合し、さらに「10回繰り返す」命令に「制御」分類から「getHeightを送る」をドラッグ&ドロップして結合します。「getHeight」の「▼」をクリックして「setBlock」を選択しましょう。これで「10個のブロックをセットする」という意味になります。
次に、10個のブロックを積み上げる時間を指定します。「制御」分類から「1秒待つ」をドラッグ&ドロップして「setBlockを送る」に結合し、「1」を「0.1」に書き換えます。これでブロックを積み上げる時間が「0.1秒」になります。
さらにブロックを10段積み上げるわけですから、Minecraft PiのY軸の値を増やしていく必要があります。そこで、最後に「変数」分類から「blockDataを1ずつ変える」をドラッグ&ドロップして「0.1秒待つ」に結合し、「blockData」を「mcpiY」にします。これで、Y座標の値が1ずつ変化していくことになります。これで、石の10個のブロックが上方向に積み上げられて塔が作成されます(図5)。
実行すると、Minecraft Piの画面が真っ暗になりますが、これは作成された塔が目の前にあるため暗く表示されているだけです。マウスカーソルのフォーカスをMinecraft Piに移して(Minecraft Piの画面上でマウスを右クリック)、キーボードの[S]キーで後ろに下がれば、塔を見ることができます。
10段の塔を順番に消してみよう
今度は塔を消してみましょう。やり方は非常に簡単です。図3のblockTypeIdを「0」にするだけで下から順番に消えていきます。blockTypeIdを「0」にするのは表1で見ると空気を指定したことになるため、ブロックは無色透明になります。それで塔が消えていくのです(図6)。
壁を作ってみよう
次に壁を作ってみましょう。縦10個×横10個の計100個のブロックを使って壁を創造します。この壁は、言い方を変えれば「10段の塔が横(X軸)に10列並んだもの」と考えることができます。この考え方でプログラムを組み立てると図7のようになります。
ほとんど図3の「10段の塔を作る」プログラムと同じですが、今回は壁の種類を指定するblockTypeIdに「14」(金鉱石)を指定しています。2つあるうちの内側の「10回繰り返す」は図3の「10段の塔を作る」と同じで、Y軸(上方向)に10段の塔を作ります。この10段の塔をX軸(横方向)に並べれば壁ができるわけですから、外側にも「10回繰り返す」を持ってきて、内側の「10回繰り返す」を囲みます。そして横方向に塔を作るため「blockDataの値を1ずつ変える」のblockDataを「mcpiX」にします。これで、横方向にも塔が作られて壁が完成!……といきたいところですが、これではまだ完成しません。外側の「10回繰り返す」の下に「変数」分類から「blockDataを0にする」をドラッグ&ドロップし、blockDataを「mcpiY」に変えます。これでやっと10×10の壁が作成されます(図8)。
なぜ、「mcpiYの値を0にする」を持ってくる必要があるのでしょうか? 上方向に10段の塔が作られるときmcpiYの値は1ずつ変化し、10段の塔が作成されるとX軸方向へ1ずれて、ずれた位置からまた10段の塔が作成されます。このままでは10段積み上げてX軸方向に1ずれて、また10段積み上げて……という処理が10回繰り返されるため壁にならないのです(図9)。したがって、上方向に10段ブロックが積み上げられた後はmcpiYの値を0にして、上方向に積み上げられないようにする必要があるのです。
壁を叩いた位置のブロックを消す
先ほどはプログラム的に壁を消していきましたが、今度は物理的に壁を叩いてブロックを消す方法を試してみましょう。まず「どのブロックが叩かれたのか」という情報として、叩かれたブロックのX、Y、Z座標を取得する必要があります。そのためには、「調べる」分類の「スライダーセンサーの値」を使用して新しく命令するのですが、「スライダー」の横にある「▼」をクリックしても使用できそうなイベントを取得する命令は出てきません(図10)。
スライダーにイベントの命令を追加するには、事前にやっておくことがあります。「制御」分類にある「setBlockを送る」をドラッグ&ドロップして「緑色の旗がクリックされたとき」に結合し、setBlockの「▼」をクリックして「pollBlockHits」を選択します(図11)。pollBlockHitsは「ブロックがヒットされたとき」の情報を返す命令です。図11のスクリプトを1回実行すると、スライダーに命令が追加されます(図12)。
では、このイベントを使って叩いた壁のブロックを消してみましょう。スクリプトは図13のようになります。
なお、図13のスクリプトを実行する前には、すでに図7のスクリプトで10×10の壁が創造されているものとします。「制御」分類から「ずっと」をドラッグ&ドロップし、その中に「制御」分類の「getHeightを送る」と「pollBlockHitsを送る」をドラッグ&ドロップして結合します。これで、ブロックが叩かれたときの情報を常時監視できるようになります。
次に「変数」ブロックから「blockDataを0にする」を4個配置します。最初の3個のblockDataは「▼」をクリックしてmcpiX、mcpiY、mcpiZを選択します。「0」の位置には「調べる」分類から「スライダーセンサーの値」を入れ込みます。「スライダー」の「▼」をクリックして、上からblockEventX、blockEventY、blockEventZを指定しましょう。これで、ヒットされたブロックのX、Y、Z座標が取得できます。
4個目の「blockDataを0にする」には、ブロックの種類をblockTypeIdから選択して「0」にしておきます。「0」は空気なので「叩かれたブロックが消える」ことになります。最後に「制御」分類から「1秒待つ」を結合しましょう。今回は「ずっと」処理が行われるため「0.1秒」にすると負荷がかかります。
実行すると、剣で叩いたブロックが1秒後に消えます(図14)。ブロックを叩く場合は必ずマウスを右クリックします。左クリックで叩くと破壊されるので注意してください。また、キーボードでブロックの前まで進んでから叩いてください。
今回で最終回です。本連載では、下ごしらえの環境構築からScratchによるさまざまな味付けプログラミング、メインディッシュのScratch2MCPIでMinecraft Piを操作する連携プログラミングを解説しました。高価なPCを用意しなくても、たった5ドルのRaspberry Pi Zero上でプログラミングが経験できるのはすごいことです。安い素材でも工夫を凝らせばおいしい料理が作れるのと同じですね。
本連載をきっかけに、皆さんもRaspberry Pi Zeroにおけるプログラミングに挑戦してみてはいかがでしょうか。ぜひ、皆さんなりのさまざま味付けに挑戦してみてください。5週間の駆け足連載でしたが、最後までお付き合いいただき、ありがとうございました!