⑥屋根付きの家を完成させる
この講義の最初に「同じ家を100件作るとしたら?」という話をしました。一つずつブロックを置いて建築することもできるが、時間がかかり過ぎてしまいます。できれば誰かに手伝ってもらいたい。それなら「プログラミングにやらせてみよう」という目標を立てました。
いよいよその目標の達成が近づいてきました。今までの講義で作ったスクリプトを組み合わせるだけで、1軒の家が完成します。
あとは、建築する場所を動かしながら100軒の家を作れば、この目標は達成できます。
追加要素として、家のサイズ(横縦高さ)、壁と屋根の色をランダムに変更させる機能を追加しましょう。そうすれば、より自然の街に近づいていきます。あなたのだけの街がもうすぐ出来上がります。
さあ始めましょう!
白壁、赤い屋根の「1軒の家」を完成させる
今までの講義で作成したスクリプト「窓付きの壁」と「45度の屋根」を合体させて、家を建築してみます。1クリックするだけで家が猛スピードで作られていく様子を見ると、「プログラミングは役に立つ」と感動します。
特に難しいところはありませんから、手順通り、慎重に作業を進めてください。
「④窓付きの壁を作る」「⑤いろいろな種類の屋根を作る」で作ったスクリプトを一部変更するだけで、そのまま使えます。上のスクリーンショットを参照して、スクリプトを完成させてください。スクリプトの処理の流れを矢印で示してあります。メインルーチンからサブルーチンが参照されて家が作られていく流れが理解しやすくなります。
[yz_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (0) にする (10) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = (4)> または <(j) = (5)>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiZ v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える end
[xy_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (0) にする (10) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = (4)> または <(j) = (5)>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiX v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える [x v] を (1) ずつ変える end
[roof v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (14) にする (14) 回繰り返す [roof_height v] を送って待つ [mcpiY v] を (y) にする (10) 回繰り返す [setBlock v] を送る (0.1) 秒待つ [mcpiZ v] を (1) ずつ変える end [mcpiZ v] を (-10) ずつ変える [mcpiX v] を (1) ずつ変える [x v] を (1) ずつ変える end
壁を作るサブルーチン「yz_wall(Y-Zの壁)」「xy_wall(X-Yの壁)」にていては、屋根の高さに合わせて、Y方向(高さ方向)の繰り返し回数を決めなくてはなりません。[roof_height v]を送って待つ
を挿入して、x の値に対する y の値を計算します。(((y)-(0.5))を四捨五入)回繰り返す
で、Y方向のブロックを積み上げる回数を決定します。ブロックを積み上げた後に、[mcpiY v]を((-1)*(((y)-(0.5))を四捨五入))ずつ変える
で、Y方向のリセットするのを忘れないようにしましょう。
(y)を四捨五入
は四捨五入するブロックです。((y)-(0.5))を四捨五入
にすると、切り捨てとなります。( Scratch のバージョンアップにより、「を丸める」の表記が「を四捨五入」に変更されていますが、同じものと考えてください。)
屋根の色を決めるため、サブルーチン「roof」の上に[blockTypeId v]を[35]にする
と[blockData v]を[14]にする
を挿入しておきます(赤い屋根)。
壁の色を決めるため、サブルーチン「yz_wall」「xy_wall」の上に[blockTypeId v]を[35]にする
と[blockData v]を[0]にする
を挿入しておきます(白い壁)。
[mcpiX v] を (2) にする [mcpiY v] を (0) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [yz_wall v] を送って待つ [mcpiX v] を (11) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を (11) にする [yz_wall v] を送って待つ [mcpiX v] を (2) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を (2) にする [mcpiZ v] を (19) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を (0) にする [mcpiY v] を (0) にする [mcpiZ v] を (10) にする [x v] を [0] にする [roof v] を送って待つ
これがメインルーチンで、変数の初期値を決定してから各サブルーチンを呼び出します。
メインルーチンの「変数の初期値」については、上の設計図を参照してください。正しい値を設定しないと、家がうまく作られませんので、間違えないようにしましょう。
設計図でうす紫の四角が屋根(サイズ 14 x 10)であり、出発点は (0, 0, 10) となります。うすオレンジが壁(サイズ 10 x 10)を表し、出発点は 1枚目と3枚目が(2, 0, 10)、2枚目が (11, 0, 10)、4枚目 (2, 0, 19) となります。
[roof_height v] を受け取ったとき もし <(x) < (7)> なら [y v] を ((x) + (3)) にする でなければ [y v] を (((-1) * (x)) + (16)) にする end
屋根の形は一般的な45度の屋根にしました。参照するグラフは「y = x + 3 (x < 7)」「y = – x + 16 (7 ≦ x)」となります。
スクリプトを実行して、家が完成することを確認してください。もしうまくいかないときは、スクリプトを停止して、バグ(プログラム上の誤り)がないか、よく見直してみましょう。必ず原因が見つかるはずです。
次に、家のサイズ(縦横高さ)を自由に建築できるようにスクリプトを改造します。
サイズ(縦横高さ)を自由に建築する
(1)から(10)までの乱数
を利用して、ランダムなサイズの家を建築します。
家のサイズを変更するための準備
[width v] を (14) にする [depth v] を (10) にする [height v] を (10) にする [house v] を送って待つ
家作りスクリプトの上に、[getBlock v]を受け取ったとき
を重ねます。「getBlock▼」→「新規・編集」から、サブルーチン名を「house」と名付けます。
「変数」→「新しい変数を作る」から、「width( = 横)」「depth(= 縦)」「height(= 高さ)」の3つの変数を追加します。赤枠の通りに、初期値を「width = 14」「depth = 10」「height = 10」にします。その下に[house v]を送って待つ
を合体させて、サブルーチン「house」を呼び出すようにします。
上のスクリーンショットを参考に、変数の値を変更していきます。width は屋根の横幅で、width – 4 が家の横幅になることに注意してください。
[mcpiX v] を (2) にする [mcpiY v] を (0) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [yz_wall v] を送って待つ [mcpiX v] を ((width)-(3)) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を ((width)-(3)) にする [yz_wall v] を送って待つ [mcpiX v] を (2) にする [mcpiZ v] を (10) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を (2) にする [mcpiZ v] を ((depth)+(9)) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を (0) にする [mcpiY v] を (0) にする [mcpiZ v] を (10) にする [x v] を [0] にする [roof v] を送って待つ
サブスクリプト「house(= 家)」の変数の値については、上の設計図が参考になります。正しい値を設定しないと、壁がつながらなかったり、すきまができたりして家がうまく作られませんので、間違えないようにしましょう。
設計図でうす紫の四角が屋根「サイズ (width) x (depth)」であり、出発点は (0, 0, 10) となります。うすオレンジが壁「サイズ (width – 4) x (depth)」を表し、出発点は1枚目と3枚目が (2, 0, 10)、2枚目が ((width – 3), 0, 10)、4枚目が (2, 0, (depth + 9)) となります。
[roof v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (14) にする (width) 回繰り返す [roof_height v] を送って待つ [mcpiY v] を (y) にする (depth) 回繰り返す [setBlock v] を送る (0.1) 秒待つ [mcpiZ v] を (1) ずつ変える end [mcpiZ v] を ((-1) * (depth)) ずつ変える [mcpiX v] を (1) ずつ変える [x v] を (1) ずつ変える end
サブルーチン「roof(= 屋根)」については、屋根の大きさが「width x depth」になることから、設定値を3カ所変更します。
[roof_height v] を受け取ったとき もし <(x) < ((width) / (2))> なら [y v] を ((x) + ((height) - ((width) / (2)))) にする でなければ [y v] を (((-1) * (x)) + (((height) - (1)) + ((width) / (2)))) にする end
サブルーチン「roof_height(屋根の高さ)」については、設定値を3カ所変更します。
上り坂のグラフ y = x + a を求めましょう。条件は「x= width/2 – 1 のとき、y = height – 1」になることから a の値を求めます(ブロックは高さが1のため、y = height – 1 になることに注意)。よって上り坂のグラフは y = x + height – (width/2) となります。
同じように、下り坂のグラフ y = – x + b (x= width/2 のとき、y = height – 1)から b の値を求めます。よって、下り坂のグラフは y = – x + height – 1 + (width/2) が求められます。
ここでスクリプトを実行して、屋根の高さが目標通りに「10」になることを確認してください。
[yz_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (0) にする (depth) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = (((depth) / (2)) - (1))> または <(j) = ((depth) / (2))>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiZ v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える end
[xy_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (0) にする ((width) - (4)) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = ((((width) - (4)) / (2)) - (1))> または <(j) = (((width) - (4)) / (2))>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiX v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える [x v] を (1) ずつ変える end
サブルーチン「yz_wall」「xy_wall」ともに、設定値を3カ所ずつ変更してください。width(depth)に対して、真ん中に窓ができるように値を設定します。
以上の変更が済んだら、スクリプトを実行して正しく建築できることを確認してから次に進んでください。
乱数ブロックで、ランダムなサイズの家を作る
家のサイズ(縦横高さ)を乱数ブロックで決定します。
[width v] を ((2) * ((6) から (10) までの乱数)) にする [depth v] を ((2) * ((4) から (8) までの乱数)) にする [height v] を ((8) から (15) までの乱数) にする [house v] を送って待つ
「width」「depth」は偶数になるようにランダム値を2倍にしてあります。これは奇数の場合は処理が複雑になるためです。今回は横と縦のサイズは偶数になるように制限しました。
コラム 適切な制限で単純なプログラムにする
プログラミングであらゆる場合を想定することは大変な手間とスキルが必要になります。
例えば今回の場合、屋根のサイズ(width, depth)が偶数か奇数か、正の数か0か負の数か、整数か小数点以下を含むか。すべて場合分けをすると、プログラムが煩雑になり、間違いも多くなりがちです。また高さ(height)の値が横(width)の値に対して低すぎると壁が地面に埋もれてしまい正しく建築できません。
適切な制限(width と depth は正の偶数であること、height は「8」以上であること)をつけて、プログラムが単純になるようにすることは大切なことです。
スクリプトを何度も実行して、いろいろなサイズの家が正しく作られていくことを確認してください。倉庫みたいな低層の家や塔のように細長い家など、いろいろな家が作られます。ステージの 変数「width」「depth」「height」の値を見れば、家のサイズが確認できます。
屋根と壁の色を変更する
屋根と壁の色もランダムに変更させると楽しそうです。早速やってみましょう。
自分の好みで屋根と壁に使える色を制限します。blockId リストから好きな色を選びます。今回は次の色をセレクトしてみました。(好きな色を自由に選んでください。「【付録】blockTypeId, blockData について」を参照)
【屋根に使える色】 オレンジ(35-1)、ライトブルー(35-3)、ライム(35-5)、グレイ(35-7)、青(35-11)、緑(35-13)、赤(35-14)の7種類
【壁に使える色】 白(35-0)、黄色(35-4)、ライム(35-5)、ピンク(35-6)、ライトグレイ(35-8)の5種類
リストを作る
カテゴリ「変数」より「リストを作る」をクリックします。リストの名前を「roof_color_list(= 屋根の色のリスト)」と名付けます。このリストに壁で使う色番号を入れていきます。
スクリプトエリアに[なにか]を[roof_color_list v]に追加する
を移動します。0 を入力して、ブロックを1度クリックしてください。ステージの「wall list」に「0」が追加されました。同様に、「3, 5, 7, 11, 13, 14」を追加してください。 (入力を間違ったときは、リストを削除して作り直した方が簡単です。)
屋根の色番号をまとめるために、リスト「wall_color_list(= 壁の色のリスト)」を作成します。リスト「wall_color_list」には、「0, 4, 5, 6, 8 」の5つの要素を追加します。上のスクリーンショットの通りになっているか確認してください。
使わなくなった[8]を[wall_color_list v]に追加する
は、ブロックパレットに移動して、消しておきましょう。
コラム 配列について
データ(数字や文字列など)のリストのことをプログラミングでは「配列」と言います。必要な数字や文字列を入れておいて、後で繰り返し使うときに利用する箱のようなものです。上の例では、ある会社の社員情報を配列「社員リスト」に代入し、まとめてあります。
箱から取り出すときは、データを入れた順番で振られる番号を使って、「社員リスト の1番」などと指定して取り出します。すると「100」が取り出されます。
今回のスクリプトでは、色番号を入れておいて、家を建築する際に取り出して使うことになります。こうすることで、屋根と壁を自分の好みの色で建築することができるのです。
リストから家の色を決める
屋根と壁の色を変えるスクリプトを追加します。
[yz_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (wall_color) にする (depth) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = (((depth) / (2)) - (1))> または <(j) = ((depth) / (2))>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiZ v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える end
[xy_wall v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (wall_color) にする ((width) - (4)) 回繰り返す [roof_height v] を送って待つ (((y) - (0.5)) を四捨五入) 回繰り返す もし <<<(i) = [2]> または <(i) = [3]>> かつ <<(j) = ((((width) - (4)) / (2)) - (1))> または <(j) = (((width) - (4)) / (2))>>> なら [blockTypeId v] を [20] にする でなければ [blockTypeId v] を [35] にする end [setBlock v] を送る (0.1) 秒待つ [mcpiY v] を (1) ずつ変える [i v] を (1) ずつ変える end [mcpiY v] を ((-1) * (((y) - (0.5)) を四捨五入)) ずつ変える [mcpiX v] を (1) ずつ変える [i v] を [0] にする [j v] を (1) ずつ変える [x v] を (1) ずつ変える end
[roof v] を受け取ったとき [blockTypeId v] を [35] にする [blockData v] を (roof_color) にする (width) 回繰り返す [roof_height v] を送って待つ [mcpiY v] を (y) にする (depth) 回繰り返す [setBlock v] を送る (0.1) 秒待つ [mcpiZ v] を (1) ずつ変える end [mcpiZ v] を ((-1) * (depth)) ずつ変える [mcpiX v] を (1) ずつ変える [x v] を (1) ずつ変える end
新しい変数「roof_color(= 屋根の色)」「wall_color(= 壁の色)」を作成します。サブスクリプト「roof」「yz_wall」「xy_wall」の青枠の部分を変更して、色番号が反映されるようにしておきます。「blockTypeId」は 35 で固定して、「blockData」を変化させることで、色を変えていきます。
[width v] を ((2) * ((6) から (10) までの乱数)) にする [depth v] を ((2) * ((4) から (8) までの乱数)) にする [height v] を ((8) から (15) までの乱数) にする [roof_color v] を (((1) から (7) までの乱数) 番目( [roof_color_list v] ) :: list) にする [wall_color v] を (((1) から (5) までの乱数) 番目( [wall_color_list v] ) :: list) にする [house v] を送って待つ
赤枠の部分が、屋根と壁の色をランダムに決定するスクリプトです。((((1)から(7)までの乱数)) 番目( [roof_color_list v] ) :: roof_color_list)
で、リスト「roof_color_list」に代入した色番号「1, 3, 5, 7, 11, 13, 14 」の7つの要素のうちの一つが、ランダムに取り出されます。その色番号を変数「roof_color」に代入します。
「wall_color」についても同様に、リスト「wall_color_list」に代入した色番号「 0, 4, 5, 6, 8」のどれかが、ランダムに取り出されます。その色番号を変数「wall_color」に代入します。( Scratch バージョンアップで、リストから [ ] 番目の要素を取り出すブロックのデザインが変わっています。)
スクリプトを何度も実行して様々な色の家が作られることを確認してください。何回目で好みの色の組み合わせが登場するでしょうか? やってみましょう。
複数の家を建築して、街を作る
準備ができましたので、いよいよ街つくりのスクリプトを完成させます。100軒の家を作りたいところですが、時間がかかりすぎるので、今回は9軒(3行 x 3列)の家を作ります。
これが今回のスクリプトの完成形です。一見複雑ですが、一つひとつ組み上げていくと、どの部分がどの働きをしているか理解できると思います。1軒の家を建築するスクリプトに少し手を加えるだけで、100件でも1000件でも家を建築できるようになるなんて、プログラムの力はすごいです。
[x0 v] を [0] にする [y0 v] を [0] にする [z0 v] を [10] にする (3) 回繰り返す (3) 回繰り返す [width v] を ((2) * ((6) から (10) までの乱数)) にする [depth v] を ((2) * ((4) から (8) までの乱数)) にする [height v] を ((8) から (15) までの乱数) にする [roof_color v] を (((1) から (7) までの乱数) 番目( [roof_color_list v] ) :: list) にする [wall_color v] を (((1) から (5) までの乱数) 番目( [wall_color_list v] ) :: list) にする [house v] を送って待つ [x0 v] を ((width) + (5)) ずつ変える end [x0 v] を [0] にする [z0 v] を (30) ずつ変える end
まず、新しい変数「x0」「y0」「z0」を作ります。これらの値が家を作り始める基準の値になります。マインクラフトの世界のどこから家を作り始めるかを示す変数です。ここが屋根の頂点となり、プラスX方向、プラスZ方向に家が作られていきます。
赤枠をみてください。初期値の設定で、マインクラフトの世界の (0, 0, 10) の地点から1件目の家を作り始めることを設定します。
その下が繰り返し処理で、9軒の家(3行 x 3列)を作るスクリプトです。X方向の移動量は width + 5 であり、家と家の隙間は 5 に設定しました。Z方向の移動量は、固定した値 30 です。繰り返し回数を変更すれば、家を100軒でも1000軒でも自動で建築することが可能です。(ただし、Minecraft Pi については、ワールドの広さが 256 x 256 に制限されており、無限に家を作ることはできません。また[reset v]を送る
で消せる範囲は 100 x 100 となっており、範囲外は完全消去できないので注意が必要です。)
[house v] を受け取ったとき [mcpiX v] を ((x0) + (2)) にする [mcpiY v] を (y0) にする [mcpiZ v] を (z0) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [yz_wall v] を送って待つ [mcpiX v] を ((x0) + ((width) - (3))) にする [mcpiZ v] を (z0) にする [i v] を [0] にする [j v] を [0] にする [x v] を ((width) - (3)) にする [yz_wall v] を送って待つ [mcpiX v] を ((x0) + (2)) にする [mcpiZ v] を (z0) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を ((x0) + (2)) にする [mcpiZ v] を ((z0) + ((depth) - (1))) にする [i v] を [0] にする [j v] を [0] にする [x v] を [2] にする [xy_wall v] を送って待つ [mcpiX v] を (x0) にする [mcpiY v] を (y0) にする [mcpiZ v] を (z0) にする [x v] を [0] にする [roof v] を送って待つ
サブルーチン「house」について、「mcpiX」「mcpiY」「mcpiZ」の値を全て変更します。青枠のように変更することで、繰り返し処理で、「x0」「z0」の値が変更しても正しく家を建築することができます。
青枠の値については、上の設計図を見て、どこから壁を作り始めるかを確認することができます。もし設定を間違うと、壁が重ならなかったり、隙間ができたりしてしまうので、バグを修正してください。計算式だけで初期値を求めるのは難しいので、フリーハンドでも構わないので、「図」を描くようにしてください。図に書いてイメージすることが大切です。
実際のプログラミングは「トライ & エラー」です。青枠の初期値の設定でも、何度も間違い、修正して、この形に決まったわけです。プログラミングが間違っていても、マインクラフトの世界は壊れません。「何度も間違い、修正して」を自分の手でやってもらえたらと思います。
さて、当初の目的であった「家を100軒作るプログラム」が実現できましたが、プログラミングの楽しさを感じていただけたでしょうか? スクリプトを組み上げていく中で、
☑ 変数
☑ 繰り返し処理
☑ 条件分岐
☑ サブルーチン
☑ 簡単な処理から複雑な処理へ、という考え方
☑ 集合(かつ、または)
☑ カウンター変数
☑ 余りによって処理を分けること
☑ 座標系
☑ グラフ
☑ 整数化(四捨五入、切り捨てなど)
☑ 乱数
☑ 配列
など、プログラミングで必ず必要な知識も自然に身についたことでしょう。
あとは、あなたの工夫次第です。今回作ったスクリプトを改造してもよいし、まったく新しいスクリプトを組み上げてもよいし、プログラミングを思う存分、楽しんでください。素晴らしいスクリプトができたら、ぜひ報告してください。皆さんの健闘に期待しています。
「ファイル」→「名前をつけて保存」から、名前「mcpi_village」をつけて保存しておきましょう。
このプロジェクト(mcpi_village.sb)はダウンロードして、自分で確かめることがきます。
(サンプルプログラムのページに移動します。ダウンロードしたいファイルのリンクをマウスで右クリックして、「対象をファイルに保存」などのメニューを実行してください。)
【宿題】道路を建築せよ
今まで習った知識を使って、道路建築を行ってください。道路のサイズ、色は自由ですが、真ん中に分離線を引いてください。今回は「9軒の家(3行 x 3列)」を作りましたが、すべての家の前に道路が通っているようにしてください。