

Grow a Garden をScratchで作る全5回シリーズです。この記事は第2回です。
第1回 3つの画面を切り替える
https://kidsprogram.co.jp/scratch30/growagarden1
第2回 持ち物・売るメニューの表示 ← いまこのページ
第3回 タネを選ぶ + 買う(準備中)
第4回 植える + 育つ(準備中)
第5回 収穫 + 売る(準備中)
前回の記事
第1回では、変数「現在の画面」をひとつ作り、それぞれのスプライトが自分で「今は自分の番か?」を見張って、表示・非表示を決めるしくみ(ポーリング)を作りました。
Buttonスプライトはクローンで3つのボタンを並べ、押されると自分のコスチューム名を「現在の画面」に入れます。Garden・Seeds・Sell・Slot は、その値をずっと見張って自分で出たり隠れたりします。
このしくみが、第2回以降のすべての土台になります。まだの方は先に第1回をご覧ください。
【Scratch上級 2/5】Grow a Garden:持ち物・売るメニューの表示【授業まるごと公開】
KIDSPROのオンライン授業を、そのまま公開!実際にスクール生と一緒に作った1時間の授業を、ほぼ編集なしでお届けします。
【オンライン授業後に動画アップします】
━━━━━━━━━━━━━━━━━━
▼ 目次
━━━━━━━━━━━━━━━━━━
【上級編2/5】Grow a Garden:持ち物・売るメニューの表示
https://scratch.mit.edu/projects/1386489987/
・持っているタネや作物の数が 0 のときはスロットが消え、1以上になると出てくる
・タネのスロットを押すと、どちらのタネを選んでいるかが決まる
・売り場の「E」ボタンを押すと、メニューが開いて「売る」「やめる」に切り替わる
・ゲーム全体で使う15個の変数を、ステージで初期化する
この回では、まだタネを買うことはできません。
動きを確かめるときは、ステージに表示されている変数の数字を、自分で書きかえてみてください。
買えるようになるのは第3回です。そのとき、この回で作った画面が一気に動き出します。
▼ この回で使うテンプレート
https://scratch.mit.edu/projects/1386493532/
▼ 第2回の完成版
https://scratch.mit.edu/projects/1386489987/
★全5回を作りきった「フル機能版」はこちら↓
https://scratch.mit.edu/projects/1310372588/
ステージ

ステージのスクリプト

- 旗をクリックしたら、変数「現在の画面」の値を「Title」にします。ゲームはタイトル画面から始まります。
- 「初期所持金」を10にし、「¢」に「初期所持金」を入れます。¢ が、プレイ中に増えたり減ったりする実際の所持金です。
- 「選択中の種」を「none」にします。まだどのタネも選んでいない、という意味の値です。
- 「メニュー開いてる」を0にします。売り場のメニューは閉じた状態から始まります。
- 持ち物の4つ(キャロットの種・イチゴの種・キャロット・イチゴ)を、すべて0にします。何も持っていない状態からのスタートです。
- 最後にねだんを決めます。キャロットの種の買値=10、キャロットのロット数=10、キャロットの売値=5、イチゴの種の買値=50、イチゴのロット数=5、イチゴの売値=20。
- これで、ゲーム全体で使う15個の変数がすべて決まった状態でスタートします。変数の初期化がひとつでも抜けていると、「前に遊んだときの数字」が残ったままゲームが始まってしまい、原因の分かりにくいバグになります。

数が多いように見えますが、役割ごとに分けるとすっきりします。
- もちもの キャロットの種/イチゴの種/キャロット/イチゴ … 持っている数。ゲーム中に増えたり減ったりする
- ねだん キャロットの種の買値/イチゴの種の買値/キャロットの売値/イチゴの売値/キャロットのロット数/イチゴのロット数 … 最初に決めたら変わらない
- 今のようす 現在の画面/選択中の種/メニュー開いてる … 「今どうなっているか」を覚えておく
- おかね 初期所持金/¢ … 旗を押したときに、初期所持金を ¢ にコピーする
「買値」だけ「〜の種の買値」という名前になっているのは、買うのは「タネ」、売るのは「収穫した作物」だからです。キャロットの種の買値は10、キャロットの売値は5。同じ「キャロット」でも、買うものと売るものが違うので、名前で見分けられるようにしてあります。
Slot(スロット)

Slot(スロット)のコスチューム
コスチューム名:CarrotSeed
コスチューム名:StrawberrySeed
コスチューム名:Carrot
コスチューム名:Strawberry
コスチューム名:Highlight
表示判定のブロック定義

- 「表示判定」は、「個数」という引数(ひきすう)をひとつ受け取るブロック定義です。
- 受け取った「個数」が0より大きければ、ステージに表示します。
- 0以下(つまり0個)ならば、ステージから姿を消します。
- これにより「持っていないものは、スロットに出さない」というルールが1か所にまとまります。
同じ形の処理を4回書くかわりに、変わるところだけを外から渡せるようにしたのが「引数付きのブロック定義」です。
ここで渡しているのは変数そのものではなく、変数の中身(数)です。「表示判定(キャロットの種)」と書いたとき、ブロックの中に届いているのは「キャロットの種」という名前ではなく、その変数に入っている「3」などの数字です。
PythonやJavaScriptの関数の引数と、まったく同じ考え方です。
Slot(スロット)のスクリプト

- 旗をクリックしたら、スプライト本体はステージから姿を消します。
- 続いて「スロット作成」を実行します。これは「ブロック定義」で自分で作ったブロックです。
- 「スロット作成」が実行されると、Slot(スロット)のスプライトはX座標=-75、Y座標=-155に瞬間移動し、コスチュームを「CarrotSeed」にします。次に自分自身のクローンを生成し、次のコスチュームに変更してからX座標を50ずつ変える処理を5回繰り返します。
- これにより、「CarrotSeed」「StrawberrySeed」「Carrot」「Strawberry」の4つのスロットと1つの「Highlight」がステージ下部にX座標−75から右へ50ピクセル間隔で生成されます。しかし、本体が隠れている状態でクローンを作ったので、クローン自体もステージから隠れた状態で生まれます。

- Slotがクローンされたとき、次の処理をずっと繰り返します。
- もしも変数「現在の画面」の値が「Title」ならば、ステージから姿を消します。タイトル画面では持ち物を出しません。
- 「Title」以外ならば、いったんステージに表示してから、自分のコスチューム名を見てそれぞれの持ち物の数を調べます。
- コスチューム名が「CarrotSeed」なら「表示判定(キャロットの種)」、「StrawberrySeed」なら「表示判定(イチゴの種)」、「Carrot」なら「表示判定(キャロット)」、「Strawberry」なら「表示判定(イチゴ)」を実行します。
- コスチューム名が「Highlight」のクローンは、ここではまだ「隠す」だけにしておきます。この中身は第3回で差し替えます。
- これにより、ステージの変数「キャロットの種」を0にするとキャロットのスロットが消え、3にすると出てくるようになります。5つのクローンはまったく同じスクリプトを持っているのに、自分のコスチューム名を見ているので、それぞれ違う変数を担当できます。

- コスチューム名が「CarrotSeed」のスロットを押すと、変数「選択中の種」に「キャロットの種」を入れ、「Correct音」のメッセージを送ります。
- コスチューム名が「StrawberrySeed」なら、「選択中の種」に「イチゴの種」を入れます。
- コスチューム名が「Carrot」「Strawberry」のスロット(収穫した作物)を押すと、持っている数を2秒間しゃべります。
- 変数「選択中の種」は、第4回で「どちらのタネを畑に植えるか」を決めるときに使います。第2回の時点では、ステージの変数表示が切り替わるのを見て確かめてください。
このスクリプトには「もし現在の画面が◯◯なら」というチェックが入っていません。ミスではなく、必要がないからです。
Scratchの「このスプライトが押されたとき」は、隠れているスプライトやクローンでは反応しません。第1回で作った「ずっと現在の画面を見張って表示・非表示を決める」というしくみが、そのままクリックの入り口のフィルターにもなっているのです。
表示のしくみをきちんと作っておくと、あとの処理が短く書ける。第1回の設計が効いている場面です。
SellOptionButton(売るメニュー)

SellOptionButton(売るメニュー)のコスチューム
コスチューム名:E
コスチューム名:Sell
コスチューム名:Keep
SellOptionButton(売るメニュー)のスクリプト

- 旗をクリックしたら、スプライト本体はステージから姿を消します。
- 続いて「Eを表示」を実行します。これは「ブロック定義」で自分で作ったブロックです。
- 最前面へ移動したあと、幽霊の効果を10にして、X座標=3、Y座標=-40 でコスチュームを「E」にし、クローンを作ります。「E」ボタンだけ少しだけ透けているのは、売り場の絵になじませるためです。
- 次に幽霊の効果を0に戻し、X座標=-110、Y座標=-58 でコスチュームを「Sell」にしてクローンを作ります。
- さらにY座標を-36ずつ変えてからコスチュームを「Keep」にして、もうひとつクローンを作ります。
- これにより「E」「Sell」「Keep」の3つのクローンができます。本体が隠れている状態でクローンを作ったので、クローンも隠れた状態で生まれます。このコードだけでは、まだボタンは見えません。

- クローンされたとき、次の処理をずっと繰り返します。
- もしも変数「現在の画面」の値が「Sell」ならば、さらに自分のコスチューム名を調べます。
- コスチューム名が「E」なら、変数「メニュー開いてる」が0のときだけ表示し、1のときは隠します。
- コスチューム名が「E」以外(「Sell」と「Keep」)なら、逆に「メニュー開いてる」が1のときだけ表示し、0のときは隠します。
- 変数「現在の画面」の値が「Sell」以外ならば、姿を消したうえで、変数「メニュー開いてる」を0に戻します。
表で見る:3つのボタンがいつ出て、いつ隠れるか

左の2列が「変数がこうなっているとき」、右の2列が「ボタンはこうなる」です。「E ボタンが出ている=メニューは閉じている」「E ボタンが隠れている=メニューが開いている」という関係になるよう、メニューの列を E ボタンの左に置いてあります。
売り場を出るときに閉じておく、という後片づけをここでやっています。
「画面から出るときに、その画面の中の状態をリセットする」という考え方は、どんなプログラムでもよく出てくる大事な作法です。

- クローンがクリックされたとき、もしコスチューム名が「E」ならば、「Correct音」のメッセージを送り、変数「メニュー開いてる」を1にします。
- 「メニュー開いてる」が1になると、上の表示ループが自動で気づいて、「E」ボタンが消え、「Sell」「Keep」の2つが現れます。
- 「Sell」「Keep」を押したときの中身は、まだ空にしてあります。売る計算は第5回、収穫した作物ができてから作ります。「あとで中身を入れる場所」を先に用意しておく、という進め方です。
「メニューが開いている状態」も画面の一種なので、変数「現在の画面」に「SellDetail」という値を足せばいいようにも思えます。でも、それではうまくいきません。
売り場の背景パネル(Sellスプライト)が消えてしまうからです。Sellスプライトは「現在の画面 = Sell」のときだけ表示するようになっているので、値を「SellDetail」に変えたとたん、メニューの下にあるはずの売り場そのものが消えてしまいます。
見分けの原則はこうです。
- 横に並んでいて、同時にはひとつしか選べないもの → 同じ変数(Seeds / Garden / Sell)
- 何かの「なか」に入っているもの → 別の変数(メニュー開いてる)
Seeds・Garden・Sell は横に並んでいるので「現在の画面」ひとつで足ります。メニューは Sell の中に入っているので、別の変数で持ちます。
動きを確かめてみよう
第2回では、まだタネを買うことができません。
ステージに表示されている変数の数字をダブルクリックして書きかえ、画面が思ったとおりに動くかを確かめてください。
- 「現在の画面」を Garden にする → 畑が出る
- 「現在の画面」を Seeds にする → タネ屋さんが出る
- 「キャロットの種」を 0 にする → キャロットのスロットが消える
- 「キャロットの種」を 3 にする → キャロットのスロットが出る
- 「現在の画面」を Sell にする → 売り場。E ボタンが出る
- 「メニュー開いてる」を 1 にする → E が消え、売る/やめる が出る
- 1 のまま「現在の画面」を Garden にする → 3つとも消える
- そこから「現在の画面」を Sell に戻す → E ボタンから始まる
- タネのスロットを押す → 音が鳴り、「選択中の種」の表示が変わる
7・8番が合格ラインです。ここが通れば、「画面のなかの状態」が正しく作れています。
次回予告
次回は、いよいよタネが買えるようになります。
・第2回で「隠す」だけにしておいた Highlight の中身を作り、選んでいるタネが光るようにする
・Seedsスプライトに購入の処理を書き、所持金を減らしてタネを増やす
第2回で作った画面が、そのまま動き出す回です。
MITメディアラボにより開発されたビジュアルプログラミング言語。子供たちが物語やゲーム、 アニメーションなどのインタラクティブな作品をプログラミングできる。また、自分の作った作品を世界中の人々と共有できるコミュニティーサイトでもある。世界中で1億人を超えるユーザがいる。
こちらのホームページにアクセスすれば無料で利用できる。
