子どもがScratchで動物くじを作ったものの、「さっき出た動物が、また出てしまう」と困っていませんか。同じ項目を二度引かないくじにするには、残っている項目をリストに入れ、引いた項目をそのリストから削除する仕組みにします。
ここでは、緑の旗を押してからくじがなくなるまで、同じ動物が出ない作品を作ります。抽選の演出や得点は加えず、「選ぶ・結果を覚える・候補から外す」の順番に絞って組み立てましょう。
乱数だけでは「前に引いたもの」を除けない
たとえば、乱数で選んだ数字に動物を対応させるだけでは、前回と同じ数字も再び候補になります。「ばらばらに選ぶこと」と「一度出たものを除くこと」は、別の処理です。
Scratchの乱数ブロックは、指定した範囲から数を選びます。過去に出た数を自動で取り除くブロックではありません。基本の働きは、Scratch公式の乱数ブロック解説で確認できます。
紙のくじなら、引いた紙を箱に戻さなければ同じ紙は出ません。今回の作品でも、リストを箱に見立て、取り出した項目を戻さない形にします。
| 作りたいくじ | 引いた後の扱い |
|---|---|
| 同じ結果が何度出てもよい | 候補を残したまま、次も選ぶ |
| 全部引くまでは同じ結果を出さない | 選んだ項目を候補から削除する |
この記事で作るのは後者です。おみくじのように結果が繰り返されてもよい作品なら、削除する処理は必要ありません。
用意するのは「残りのくじ」と二つの変数
作例では、ねこ・いぬ・うさぎ・くまを一つずつ入れます。動物の種類や個数は、この手順を説明するための例です。子どもの好きな乗り物や食べ物に置き換えて構いません。
くじを引くときにクリックするスプライトを一つ選び、「変数」カテゴリーから、次のリストと変数を作ります。今回はすべて「すべてのスプライト用」でそろえます。
- リスト「残りのくじ」:まだ引かれていない動物を入れる。
- 変数「引いた番号」:今回選んだ、リスト内の位置を覚える。
- 変数「結果」:取り出した動物の名前を覚える。
変数は一つの値を、リストは順番のある複数の項目を保持できます。仕組みの確認には、Scratch Foundationの「Variables and Lists」(英語PDF)も利用できます。
制作中は「残りのくじ」をステージに表示しておくと、クリックするたびに何が消えたかを確かめられます。完成時に見せたくなければ、確認が済んでから非表示にしましょう。
緑の旗で、くじの中身を入れ直す
選んだスプライトに、次の順番でブロックをつなぎます。以下の枠内は、ブロックの組み方を文字で表したものです。テキストを貼り付けて実行するコードではありません。
緑の旗が押されたとき 「残りのくじ」のすべてを削除する 「残りのくじ」に「ねこ」を追加する 「残りのくじ」に「いぬ」を追加する 「残りのくじ」に「うさぎ」を追加する 「残りのくじ」に「くま」を追加する 「引いた番号」を 0 にする 「結果」を空欄にする 「くじをクリックしてね」と言う
先頭で中身を空にするのは、旗を押すたびに動物が追加され、同じ名前が複数入るのを防ぐためです。この作品では、緑の旗を押すことを、新しい一組のくじを用意する合図にします。
クリックしたら「番号を決める→覚える→削除する」
同じスプライトに、もう一つ、クリックされたときの処理を作ります。「もし〜なら、でなければ」の中へ、それぞれのブロックを入れてください。
このスプライトが押されたとき
もし「残りのくじ」の長さ > 0 なら
「引いた番号」を
1 から「残りのくじ」の長さまでの乱数にする
「結果」を
「残りのくじ」の「引いた番号」番目にする
「残りのくじ」の「引いた番号」番目を削除する
「結果」と言う
でなければ
「くじは全部引きました」と言う
「結果と言う」では、文字の「結果」を入力するのではなく、丸い変数ブロック「結果」を差し込みます。また、この作例では待ち時間を入れず、選んだ項目を削除してから結果を表示します。
乱数の上限は、最初の個数に固定しない
候補が減った後も最初と同じ範囲で番号を選ぶと、存在しない位置を選ぶことがあります。そこで、上限には「残りのくじの長さ」を入れます。このブロックが返すのは、現在リストに入っている項目の個数です。詳しくは、Scratch公式のリストの長さの解説を参照してください。
名前を変数に移してから、元の項目を消す
「リストの何番目」というブロックは、その位置の項目を取り出せます。今回は、その値を変数「結果」に移しておきます。ブロックの働きは、Scratch公式の項目を取り出すブロック解説に示されています。
削除した後に同じ番号の項目を読むと、そこには別の動物が移っている場合があります。「結果を覚える」が先、「削除する」が後。この順番は入れ替えないでください。
お子さまに合う学び方診断
正解・不正解を決める診断ではありません。今の様子から、取り組みやすい学び方の入口をご案内します。
動物の名前と、リストの番号を分けて確かめる
ここが混乱しやすいところです。「引いた番号」は動物固有の番号ではなく、その時点での並び順を表します。次は、動きを説明するために、選ばれた番号を仮定した例です。
| 場面 | 処理前の並び | 選んだ番号と結果 | 削除後の並び |
|---|---|---|---|
| 最初の抽選 | ねこ・いぬ・うさぎ・くま | 2番目=いぬ | ねこ・うさぎ・くま |
| 次の抽選 | ねこ・うさぎ・くま | 2番目=うさぎ | ねこ・くま |
同じ「2番目」を選んでも、取り出す動物は変わります。項目の削除でリストの長さが減ることは、Scratch公式の削除ブロック解説でも確認できます。
動作を試すときは、当たり方の印象ではなく、次の条件を見ます。
- 旗を押した直後、動物が一つずつ入っている。
- クリックすると、表示された動物がリストから消える。
- 最後の項目を引いた後は、クリックしても新しい抽選をしない。
- もう一度旗を押すと、最初の動物が一つずつ戻る。
実際に出る順番は、ここに載せた表と同じでなくて構いません。「表示した動物が候補から外れたか」が、この作品の確認点です。
同じ結果が出るときに見る、三つの場所
候補の中に、同じ名前が二つ入っていないか
「ねこ」が二つあれば、一つを削除しても、もう一つは残ります。動物名そのものを重複させたくない場合は、最初に追加する名前を一つずつにしてください。
選ぶときと消すときに、別々の乱数を使っていないか
結果を選ぶための乱数と、削除するための乱数を別々に入れると、表示した動物とは違う項目を消すことがあります。乱数を作るのは一度だけ。その番号を変数「引いた番号」に保存し、読み取りと削除の両方に使います。
クリックのたびに、候補を補充していないか
動物を追加するブロックは、旗を押したときの処理に置きます。クリック側にも追加処理があると、引いた動物をすぐ候補へ戻してしまいます。
ブロックを見直すときは、まず「補充は旗」「取り出しはクリック」と役割を分けて確認しましょう。今回の作例では、空になっても自動補充せず、終了したことが分かる表示にしています。
よくある質問(FAQ)
直前と同じ動物が出なければ十分ではありませんか?
直前の結果だけを避ける方式では、間に別の動物が出れば、以前の動物がまた出る可能性があります。「全部引くまで再登場させない」なら、今回のように引いた項目を候補から外します。
くじを全部引くと、最後の結果が消えてしまいますか?
この作例では、取り出した名前を変数「結果」に移しているため、リストが空でも最後の結果は変数に残ります。その後にもう一度クリックすると、吹き出しは終了の案内に変わります。
「当たり」を複数入れるくじにも使えますか?
使えます。ただし「当たり」という同じ表示は複数回出ます。この仕組みが防ぐのは、取り出した項目を再び引くことです。同じ表示内容まで一度きりにしたい場合は、候補自体を重複させないでください。
幼児と一緒に試すなら、何を任せればよいですか?
ブロックの組み立てが難しければ、入れる動物を選ぶ役や、画面に出た動物の紙カードを箱から取り出す役で参加できます。画面のリストと紙の箱を対応させる、この作品に限った試し方です。操作や文字の読み取りを無理に任せる必要はありません。
緑の旗を押した後も、前回引いた動物を除けますか?
この記事の作例では除けません。旗を押すと候補をすべて入れ直す設計だからです。まずは「一組を引き切るまで重複しない」範囲で完成させ、前回の状態を残す機能は分けて考えましょう。
「くじを作りたいけれど、リストの仕組みから教わりたい」という場合は、作りたい動物や、今できている部分を体験申し込み時に伝える方法もあります。CotoMiraiは南青山で、一人ひとりの年齢・興味・理解度に合わせた個別指導を行っています。指導方針はCotoMirai公式サイトで確認できます。
無料体験は年中以上のお子さま向けに案内されています。このくじ制作を体験で扱えるかは未確認のため、希望する場合は事前にお問い合わせください。
参考にした情報
- Scratch公式:pick random
- Scratch Foundation:Scratch Learning Resource — Variables and Lists
- Scratch公式:length of list
関連する記事
お子さまに合う学び方診断
正解・不正解を決める診断ではありません。今の様子から、取り組みやすい学び方の入口をご案内します。