Scratch2MCPI プログラミング①ブロックを一個置く

ブロックを一個置く



Image


今回から本格的なプログラミングに入っていきます。最初の課題は「ブロックを一個置く」ということです。簡単すぎますか?

どんな巨大な建築も初めは一個のブロックを置くところから始まります。「ブロックを一個置く」という課題は、すべての建築につながる最初の一歩ということになります。たった一個ですが、 Scratch からの命令でブロックが設定できたら、うれしくなります。さあ一緒に始めましょう。


マインクラフトで新しい world を作成する


Scratch2MCPI でプログラミングを試すための world を作成します。

「メニューボタン」→「ゲーム」→「Minecraft Pi」を選ぶ。マインクラフトが起動します。「Start Game」をクリックします。


Image


新しい world を作るため、「Create new」をクリックします。


Image


新しい world が作成されました。左上の座標から、高さ18メートルの丘の上に立っていることが確認できます。


平地化は一瞬で終わる


平地化は面倒です。邪魔な土や石、木などを破壊して、穴は「土ブロック」で埋めていかなければなりません。その面倒な平地化が一瞬で終わる神業を紹介しましょう。


マインクラフトが起動している状態で、デスクトップのショートカット「Scratch2MCPI」をダブルクリックします。自動で、 Scratch とターミナルが起動します。


Image


Scratch データの名前を付け替えます。mcpi_template ファイルはテンプレートとして今後も使い続けるので、まず名前を付け替えて、別のファイルとして改造していきます。


Image


「ファイル」→「名前をつけて保存」を選びます。


Image



「プロジェクトを保存ダイアログ」で、新しい名前「mcpi_house」を入力し、「OK」ボタンを押します。(名前は何でもよいですが、最終目標は家作りなのでhouse(= 家)としました。)


Image


スクリプトエリアの[hello_minecraft v]を送るの「hello_minecraft ▼」をクリックして、選択肢の中から「reset」を選びます。


Image


スクリプトエリアのブロックをクリックして、スクリプトを実行してみます。数秒で、山や木などが消えて、平地が現れました。これが「一瞬で平地化する」神業です。


マインクラフトの座標を見ると、高さ0メートルの平地に立っていることがわかります。高さ18メートルの丘はどこに行ってしまったのか?

[reset v]を送るスクリプトが何をしているかというと、200メートル × 200メートル x 63メートルまでの空間にすべて「空気ブロック」を置く(つまり破壊する)という、気の遠くなるほどの作業です。約250万個の「空気ブロック」を設置するなんて、普通の人間ならできないでしょう。これが「一瞬で平地化する」スクリプトの中身です。


ブロックを一個置く


コンピューターに「ブロックを一個置け」と命令しても、コンピューターは正しく働いてくれません。コンピューターは正確に仕事をするはずなのに、なぜでしょうか?

それは、コンピューターにわかる形で「正確に命令」をしなければならないからです。「ブロックを一個置け」だけでは、正しい命令とは言えません。「どこに」ブロックを置くのか? 「どんな」ブロックを置くのか? わからないので、コンピューターは正しく働いてくれなかったのです。


Image


「ブロックを一個置く」スクリプトを作成するには、初めに「変数」を設定します。「変数」とは、変な数字という意味ではなく、「値(数字や文字)を代入できる箱」のようなものです。コンピューターに数値を教えてあげるときに使うと便利な仕組みです。どのように使うのでしょうか? やってみましょう。


Scratch のステージをよく見てください。5つの変数が表示されています。

「mcpiX」「mcpiY」「mcpiZ」の3つの変数が、Minecraft Pi における座標値です(mcpi とは、MineCraft PI の略)。ブロックを置く場所(どこに)を指定するには、この3つの変数に数字を代入すればよいのです。

「blockTypeId」「blockData」の2つの変数が、ブロックの属性を表す値です。ブロックの種類(どんな)を指定するには、この2つの変数に値を代入します。


変数の設定


  [blockData v]を[0]にする
  [blockData v]を[0]にする
  [blockData v]を[0]にする
  [blockData v]を[0]にする
  [blockData v]を[0]にする

Scratch のカテゴリ「変数」を選びます。

[blockData v]を[0]にするを5つ、スクリプトエリアに移動します。


  [mcpiX v]を[0]にする
  [mcpiY v]を[0]にする
  [mcpiZ v]を[10]にする
  [blockTypeId v]を[1]にする
  [blockData v]を[0]にする

ブロックを置く場所をマインクラフトの世界の座標

(mcpiX, mcpiY ,mcpiZ) = (0, 0, 10) に設定します。この座標は、座標 (0, 0, 0) から観察しやすく、また計算しやすい位置として決定しました。

ブロックの種類を「石(blockTypeId = 1, blockData = 0)」 に設定します。


「ブロックを一個置く」プログラミングの完成


  [mcpiX v]を[0]にする
  [mcpiY v]を[0]にする
  [mcpiZ v]を[10]にする
  [blockTypeId v]を[1]にする
  [blockData v]を[0]にする
  [getBlock v]を送る

Scratch のカテゴリ「制御」を選びます。

[getBlock v]を送るをスクリプトエリアに移動し、合体させます。


  [mcpiX v]を[0]にする
  [mcpiY v]を[0]にする
  [mcpiZ v]を[10]にする
  [blockTypeId v]を[1]にする
  [blockData v]を[0]にする
  [setBlock v]を送る

[getBlock v]を送るの「getBlock▼」をクリックして、現れた選択肢の中から「setBlock」を選びます。[setBlock v]を送るに設定し直すことで「ブロックを一個置く」スクリプトが完成しました。


スクリプトの実行


Image


スクリプトエリアのブロックセットをクリックして、スクリプトを実行します。ターミナルに


Received:  (‘broadcast’, ‘setback’)
setBlock: 0, 0, 10, 1, 0

の表示が現れたら、正しくスクリプトが実行されました。


マインクラフトのウインドウをクリックすると、主人公(steave)を操作できるようになります。辺りを見回すと、「石ブロック」が一個設置されていることが確認できます。今回の課題は達成されました。


次回は、10メートル×10メートルの巨大な壁を作るプログラミングを学習します。「繰り返し」という仕組みを使って、短いスクリプトで巨大な壁を作ることができます。お楽しみに。


【宿題】初期値を変更してスクリプトを実行


今回作成したスクリプトを改造してみましょう。5つの初期値を変更してスクリプトを実行してみると、どんなブロックがどこに置かれるか試してみましょう。

(ヒント)いきなり「100」などの大きな数字を使うのではなく、30以下の数字を使うと結果がすぐに確認できます。