Scratchで買い物のしくみを作る方法|条件分岐と「以下」が無い問題【Grow a Garden③】

Robloxで大人気の農園ゲーム「Grow a Garden」を、Scratchでゼロから作っていく全5回シリーズ。第3回は、いよいよタネが買えるようになります。
選んでいるタネを光らせるハイライトと、お金を見て「買えるかどうか」を判定するしくみを作ります。Scratchには「以下」のブロックが無いので、「足りない?」と聞いて「でなければ」で買う、という聞き方をひっくり返す考え方もここで覚えます。

このシリーズについて

Grow a Garden をScratchで作る全5回シリーズです。この記事は第3回です。

第1回 3つの画面を切り替える
https://kidsprogram.co.jp/scratch30/growagarden1

第2回 持ち物・売るメニューの表示
https://kidsprogram.co.jp/scratch30/growagarden2

第3回 タネを選ぶ + 買う ← いまこのページ

第4回 植える + 育つ(準備中)
第5回 収穫 + 売る(準備中)

前回の記事

Scratchで表示・非表示を変数で切り替える方法|持ち物の表示とメニュー開閉【Grow a Garden②】

第2回のおさらい

第2回では、持ち物の数で見た目が変わるしくみを作りました。

Slotスプライトは5つのクローンが1本のスクリプトを共有していて、自分のコスチューム名を見て、自分の担当の変数を調べます。個数が0なら隠れ、1以上なら出てくる。この判定は「表示判定(こすう)」という引数付きのブロック定義にまとめてあります。

そのとき「Highlight」のクローンだけは 隠す だけにしておきました。今回、この中身を差し替えます。

【Scratch上級 3/5】Grow a Garden:タネを選んで買う【授業まるごと公開】

KIDSPROのオンライン授業を、そのまま公開!実際にスクール生と一緒に作った1時間の授業を、ほぼ編集なしでお届けします。

━━━━━━━━━━━━━━━━━━
▼ 目次
━━━━━━━━━━━━━━━━━━
00:00 はじめに(今回作るプログラム紹介)
01:23 テンプレートの解説
02:07 Seeds(タネ屋さん):×ボタンのスクリプト
05:11 Seeds:Carrotボタンのスクリプト(もし〜でなければ/お金が足りるか判定)
11:27 Seeds:Strawberryボタンのスクリプト
15:23 Slot(スロット):ハイライトを光らせる
21:16 タネを買って植えてみる
22:55 おわりに

【上級編3/5・完成版】Grow a Gardenを作ろう!第3回 タネを選ぶ + 買う

https://scratch.mit.edu/projects/1389346788/

第3回で作るもの

・いま選んでいるタネのスロットが光る(ハイライト)
・タネ屋さんのタネを押すと、お金を払ってタネが手に入る
・お金が足りないときは買えず、「お金が足りません」と出る
・×ボタンで店を閉じて、畑にもどる

前回まではずっと「見た目」を作っていましたが、今回からゲームが動きはじめます。

なお、キャロットを植える・育つ・収穫するスクリプトは、あらかじめテンプレートに入れてあります。買ったタネをその場で畑に植えて、育って、収穫するところまで遊べます。このスクリプトの中身は第4回でくわしく解説します。

▼ この回で使うテンプレート
https://scratch.mit.edu/projects/1389357770/

▼ 第3回の完成版
https://scratch.mit.edu/projects/1389346788/

★全5回を作りきった「フル機能版」はこちら↓
https://scratch.mit.edu/projects/1310372588/

Slot(スロット) ハイライトを光らせる

第2回では「Highlight」のクローンを 隠す だけにしておきました。今回、この中身を書き換えます。分岐を新しく足すのではなく、中身を差し替えるだけなので、先週書いた4つの表示判定には一切さわりません。

Slot(スロット)のスクリプト

Slotスプライトのクローンされたときのスクリプト。Highlightの分岐の中身

選んでいるタネを光らせるコード
  1. コスチュームの名前が「Highlight」のクローンだけが、この処理をします。
  2. もしも、変数「選択中の種」が「キャロットの種」で、かつ「キャロットの種」を1個以上持っているなら、X座標=-75、Y座標=-155 に移動して表示します。キャロットのスロットの位置です。
  3. そうでなければ、変数「選択中の種」が「イチゴの種」で、かつ「イチゴの種」を1個以上持っているなら、X座標=-25、Y座標=-155 に移動して表示します。
  4. どちらにも当てはまらなければ、隠します。
  5. これにより、タネのスロットを押すと、押したほうのスロットに光るわくが移動します。持っていないタネを選んでいる状態では、わくは出ません。
「かつ」とは?

2つの条件が両方とも成り立っているときだけ、という意味です。片方だけではだめ。

ここでは「そのタネが選ばれている」と「そのタネを持っている」の2つを調べています。なぜ2つ必要なのでしょうか。

「選ばれている」だけで光らせてしまうと、持っていないタネを選んだままのとき、何も無いところに光るわくが出てしまいます。実際に試すと分かりますが、かなり気持ち悪い見た目になります。

「かつ」は、PythonやJavaScriptの and とまったく同じものです。

ここだけ「でなければ」でつなぐ理由

同じSlotスプライトの中で、形が2種類あることに気づいたでしょうか。

コスチューム名で分ける4つの判定は、もし を縦に並べる形。
Highlight の中は、でなければ でつなぐ入れ子の形。

違いは「どれにも当てはまらなかったとき、やることがあるかどうか」です。

4つの判定のほうは、どれにも当てはまらなければ何もしなくて構いません。だから並べて書けます。
ハイライトのほうは、どちらにも当てはまらなかったときに隠すという仕事があります。

これを並べる形にすると、わくが出っぱなしになります。スクリプトの上のほうを見てください。タイトル画面でなければ、まず全員が「表示する」されていますよね。そのあと各コスチュームが自分で隠れるかどうかを決める作りになっています。Highlightの「隠す」が無くなると、表示されたまま誰も隠してくれなくなるのです。

どれにも当てはまらなかったときにやることがあるなら、「でなければ」でつなぐ。この見分け方は、どのプログラミング言語でも同じです。

Seeds(タネ屋さん) タネを買う

第1回ではSeedsの「表示」だけを作りました。今回は押したときの処理を、まるごと新しく作ります。

Seeds(タネ屋さん)のコスチューム

コスチューム名:Carrot

コスチューム名:Strawberry

コスチューム名:Close

 

Seeds(タネ屋さん)のスクリプト

Seedsスプライトのこのスプライトが押されたときのスクリプト。タネの購入処理

タネを買うコード

このスクリプトは、ひとつの「このスプライトが押されたとき」の中に、押されたボタンごとの「もし」が3つ並んでいる形です。そしてキャロットとイチゴの中だけ、さらにもうひとつ「もし」が入っています。画像の段差(へこみ)が2段になっているところを、まず目で確かめてください。

  1. 【外側の もし】コスチュームの名前が「Carrot」なら、キャロットのタネが押された、ということです。クローンは見た目(コスチューム)だけが違うので、名前で見分けます。
  2. 【内側の もし】「¢ < キャロットの種の買値」── お金のほうが買値より少ない、つまり足りないときです。ここでは「買えるとき」ではなく、あえて「足りないとき」を先に聞いています。
  3. 【足りないとき=「なら」のほう】Wrong音のメッセージを送り、「キャロットを買うのに、お金が足りません」と2秒言います。お金は減りませんし、タネも増えません。何も起きずに終わるのが正解です。
  4. 【買えるとき=「でなければ」のほう】4つのブロックがまとまって入っています。
    • ¢ を「0 − キャロットの種の買値」ずつ変える … 所持金が買値のぶんだけ減ります。
    • 「キャロットの種」を「キャロットのロット数」ずつ変える … 1回買うと10個まとめて手に入ります。
    • 「選択中の種」を「キャロットの種」にする … 買ったタネが、そのまま選ばれた状態になります。
    • Correct音のメッセージを送る … 買えたという合図です。
  5. この「でなければ」は内側のもので、ボタンを見分ける外側のものではありません。ここをまちがえると、イチゴを押しただけでも「お金が足りません」と言われてしまいます。
  6. イチゴもまったく同じ形です。変数の名前とメッセージが違うだけなので、キャロットができたら自分で書けます。
×ボタンで店を閉じるコード
  1. いちばん下にある3つめの「もし」です。コスチュームの名前が「Close」のクローンが押されたら、変数「現在の画面」を「Garden」にします。
  2. たったこれだけで、タネ屋さんの画面が消えて畑が出てきます。第1回で作った「ずっと現在の画面を見張る」しくみが、全部やってくれるからです。
  3. ここには内側の「もし」がありません。閉じるのに条件はいらないからです。入れ子が必要なところと、いらないところのちがいを見てください。
¢ は「セント」と読みます

1ドル=100セントの、あのセントです。本家のGrow a Gardenでは「シェケル」という名前の通貨で、マークが似ているのでここでも使っています。

なぜ「買える?」ではなく「足りない?」と聞くのか

ふつうに考えたら「買値 ≦ 所持金 なら買える」と書きたいところです。でもScratchの比較ブロックは < = > の3つだけで、「以下」がありません。

ではどうするか。聞き方をひっくり返します。

「足りない?」とだけ聞いて、ちがったほう(でなければ)で買う。

「¢ < 買値」── これなら < 一個で書けます。そして「足りなくない」=「買える」なので、「でなければ」のほうに買う処理を置けばいいわけです。

ここで大事なのが「ちょうど同じとき」です。初期所持金は10、キャロットの種の買値も10。ぴったり同じですよね。「10 < 10」は成り立ちません。だから「でなければ」に進んで、ちゃんと買えます。

もし「¢ > 買値 なら買える」と書いていたら、10>10 が成り立たないので最初の1回が買えません。お金を増やす手段もないので、ゲームが始まった瞬間に詰みます。

同じ「>」と「<」でも、どっちの枝に処理を置くかで結果が変わる。プログラムではここが一番バグになりやすいところです。

音は「メッセージ」で鳴らす

Wrong音・Correct音は、このスプライトで鳴らしているのではなく、「○○を送る」でメッセージを飛ばしているだけです。受け取った側が実際に音を鳴らします。

こうしておくと、あとから音を差し替えたくなったときに受け取る側を1か所直すだけで済みます。買うところ・売るところ・収穫するところ……と、鳴らしたい場所が増えても同じです。

その瞬間に起きること=メッセージ。ずっとそうであること=変数。第1回から出てきているこの使い分けが、ここでも生きています。

「0 − 買値」で引き算をする

Scratchの「ずつ変える」は足し算しかできません。減らしたいときは、マイナスの数を作って足します。

0 − 10 = −10。これを足すから、結果として10減る。

最初のマスには 0 を打ち込んでおいてください。空のままでも0として計算されて動きますが、あとで見返したときに「ここ何も入っていないけど大丈夫?」と迷います。

買うと、ハイライトが勝手に動く

購入の最後に「選択中の種」を入れているところに注目してください。これのおかげで、買った瞬間に光るわくがそのタネに移ります。

ハイライト側のスクリプトには、買う処理のことは一行も書いてありません。ただ「選択中の種」をずっと見張っているだけです。見張っているほうが勝手に気づいて動く ── 第1回で作ったポーリングが、ここでも効いています。

変数を1つ変えるだけで、見た目は全部あとからついてくる。この設計のおかげで、買う処理はこんなに短く書けています。

おまけ:買ったタネを植えてみよう

キャロットを植える・育つ・収穫するスクリプトは、テンプレートにあらかじめ入れてあります。今回作った「買う」とつなげて、そのまま遊べます。

遊び方
  1. タネ屋さんでキャロットのタネを買う(10個手に入ります)
  2. Gardenボタンで畑へ
  3. 畑の好きなところをクリック → 苗が出てきます。タネが1個減ります
  4. しばらく待つ → 少しずつ大きくなって、実ります
  5. 実ったキャロットをクリック → 収穫されて、持ち物のキャロットが増えます

買う → 植える → 育つ → 収穫する まで、ひととおり動きます。

このスクリプトの中身は第4回で

Gardenスプライトの「Carrotを植える」と、Carrotスプライトのスクリプトには、第4回でくわしく解説しますとコメントを入れてあります。

中を開いて見るのは自由です。「作物のX」「作物のY」という変数に場所を書いてから、Carrotのクローンを作っている ── このあたりが第4回の主題になります。スプライトからスプライトへ値を渡す方法です。

今回はまず、自分で作った「買う」が、ちゃんとゲームにつながることを体で確かめてください。

動きを確かめてみよう

チェックリスト
  1. 旗を押して、タイトルからゲームを始める → 所持金は 10 ¢
  2. Seedsボタンでタネ屋さんへ → キャロットのタネを押す
  3. 買えた。所持金が 0 になり、スロットにキャロットのタネが出てきて、わくが光る
  4. そのままイチゴのタネを押す → 買えない。Wrong音と「お金が足りません」
  5. ×ボタンを押す → 畑にもどる
  6. 畑をクリック → 苗が出て、タネが1個減る
  7. ステージの ¢ を手で 50 に書きかえて、もう一度イチゴを買ってみる → 買える
  8. ステージの「キャロットの種」を 0 にする → スロットも光るわくも消える

3番と4番が今日の合格ラインです。買えるときは買えて、買えないときは買えない。これが動いていれば、条件分岐が正しく作れています。

値段を変えて遊んでみよう

ステージの初期化で、値段は自由に変えられます。自分のゲームの難しさを、自分で決めてみてください。

  • キャロットの種の買値 … 1回買うのにかかるお金
  • キャロットのロット数 … 1回買うと何個もらえるか
  • 初期所持金 … ゲームを始めるときのお金

お題1:所持金をぴったり 0 にする買い方を見つけよう(初期所持金10なら、キャロット1回で0になります)
お題2:最初からイチゴも買えるようにするには、どこをいくつにすればいい?
お題3:一番やさしいゲームと、一番きついゲームを作ってみよう

次回予告

第4回 植える + 育つ

今回テンプレートに入っていた「植える」「育つ」を、今度は自分で作ります。

・畑を押すと、選んでいるタネの苗がその場所に出てくる
・放っておくと、少しずつ育って実になる

スプライトからスプライトへ値を渡す方法と、クローンごとに別々の値を持つ変数が出てきます。全5回のなかで一番の山場です。

Scratch3.0(スクラッチ3.0)とは?

MITメディアラボにより開発されたビジュアルプログラミング言語。子供たちが物語やゲーム、 アニメーションなどのインタラクティブな作品をプログラミングできる。また、自分の作った作品を世界中の人々と共有できるコミュニティーサイトでもある。世界中で1億人を超えるユーザがいる。
こちらのホームページにアクセスすれば無料で利用できる。