「Scratch(スクラッチ)」を始めて最初につまずきそうになるのはこれじゃないでしょうか?
「変数」
『親子で学ぶプログラミング超入門』、『どすこい!おすもうプログラミング』の2冊を順番に読みながらスクラッチを始めてみたのですが、『どすこい!~』の後半に出てくる「変数」のあたりから急に難しく感じるようになりました。
今回は『どすこい!おすもうプログラミング』に出てくる話を題材として使わせてもらい「変数」の復習をしてみます。
テーマ~4つの数字をランダムに並べる
「マスターマインド」というゲームがあります。
[広告]
もともとはイギリスで生まれた、4つのピンの色と配置を当てるボードゲームですね。
これを色の代わりに数字で行うのが今回のプログラム。
ランダムで並んだ数字とその場所を当てようというものです。
ここでは当て方を学ぶのではなく、その数字を並べるのにどういうプログラムを組み立てればいいかを考えます。
「リスト」を作る
まず最初に「リスト」を作ってみます。
「データ」のところにある「リスト」をクリック。
ボックスが開くのでそこに「リスト名」を入力します。今回はマスターマインドの答えなのでリスト名を「正解」とします。
するとこのようにたくさんのブロックができあがります。
「thingを『正解』に追加する」というブロックを使って4つの数字をリストに並べていくわけですね。
ただ、その前にやっておくべきことがあります。
リストから数字を削除する
思い浮かべてほしいのですが、実際にマスターマインドをやるとき、1回1回のゲームが終わったらどうしますか?
いや、マスターマインドじゃなくても他のボードゲームでもいいです。1回目が終わって次2回目をするときにどうしますか?
・・・ピンやコマを片付けますよね?
ボード上にあるピンやコマやその他の物体を一度全部片づけますよね?でないと次のプレイが始められない。
それと同じです。
数字並べの場合も、直前の数字を全部チャラにする必要がある。
リストに直前の4つの数字を残したまま、数字を加えていくわけにはいかないですからね。
・・・と考えたとき、まず最初に組むべきブロックは何でしょう?ヒントはこの中にあります。
答えはこれです。
「1番目を『正解』から削除する」
こいつを「1番目→すべて」に変えてやります。これを旗ブロックにくっつける。
これで旗がクリックされたとき、正解リストからすべての数字が削除されます。リストは空っぽに。
1から9の乱数をリストに追加するブロック
ここで4つの数字を並べていくために次のようなブロックを組み立てたとします。
- 正解をチャラにする
- 1から9までの数字(乱数)を「正解」リストに追加する
- それを4回繰り返す
なんだか見ているとこれでできそうな気がしてきますよね?
でも残念ながら答えはブー!です。これでは、
これでは「1から9までの乱数」が毎回違う数とは限らないからです。同じ数字を選んでしまうこともある。
試しに旗をクリックしてみましょう。
というわけで、けっこうな頻度で同じ数字が表示されます。これではゲームになりません。
乱数のダブリを防ぐために
これを防ぐには「正解リスト」に入っている乱数を次に追加する乱数から除外する必要があります。
それを判断するために使うのがこのブロック。
この「『正解』にthingが含まれる」を使って組んでみたのがこちらです。
ちょっとややこしい表現になりますが、
「もし正解リストに1から9までの乱数が含まれる、ではない、なら」
つまり、
「もし正解リストに1から9までの乱数が含まれないなら」
⇨そのときは1から9までの乱数を正解リストに追加する
これなら大丈夫そうな気がしますよね?正解リストに入れた数字は除外されそうですよね?
・・・が!
残念ながらこれもブー!です。
仮に上のブロック内と下のブロック内の「1から9までの乱数」が同じ数字になるのなら成りたちます。たとえば、
正解リストに2が含まれないなら
↓
2を正解リストに追加する
これならOKですよね?
でも実際はそうはなりません。
上の「1から9までの乱数」と下の「1から9までの乱数」は関連性がないので同じ数字になるとは限らないからです。
正解リストに2が含まれないなら
↓
3を正解リストに追加する
ということが起きてしまう。これでは判定したことになりません。
「乱数」という名前の「変数」をつくる
ここで出てくるのが「変数」です。
正解リストに入れた乱数を記憶しておくために「乱数」という名の変数を作ります。
作り方はリストと同じ。「データ」にある「変数を作る」をクリックして名前を入力すると以下のようなブロックができます。
今回使うのはこのブロック。
これと組み合わせます。
「1から10までの乱数」を「1から9までの乱数」に変更して、
フュージョンって・・・・合体みたいな意味です。ドラゴンボール好きだったものでww
ただこの「乱数を1から9までの乱数にする」って一見分かりづらいですよね。
これは言いかえると、
『乱数』を『1から9までの乱数』にする
↓(ひっくり返して表現すると)
『1から9までの乱数』を『乱数(という名の箱)』に入れる
つまり、「2を入力すれば2が乱数(という名の箱)に入る」ということ。
これでまず2が「乱数」箱に入ったとします。
次はこの2を除外するためのブロックを作ります。
それがこちら。
これにより、
もし
正解リストに
乱数(この場合は2)が含まれていないなら
というプログラムができました。
さて、この後にやることは何でしょう?
正解リストに含まれていないその乱数をリストに追加する、ということですよね?それにはこの2つのブロックを使います。
これにより2が正解リストに加えられます。
この3つの手順を組み合わせたのがこちら。
- 「乱数」箱に2を入れる
- もし正解リストに2が含まれていないなら
- 2を正解リストに追加する
これで正解リストの数字が1つ決まりました。
単純に考えるとこの工程を4回繰り返せばできあがりのような気がしますが・・・
これでどうでしょう?
試しに旗をクリックしてみると・・・
あらら、なぜかリストの数字が3つで終わってる・・・
もう一度やると今度は2つに?
数回行ってようやく4つの数字が選ばれました。
もうお分かりですね?
単に「4回繰り返す」だけでは正解リストに入っていて並べられなかったときも1回と数えられてしまうので、3つや2つで終わってしまうことがあるのです。
手ごわいですね。なかなかそこまで気づきません。
これを防ぐためのブロックはこちら。どう組み立てればいいかちょっと考えてみてください。
「演算」エリアの「□=□」、「制御」の「~まで繰り返す」はともかく、「正解の長さ」って何?って感じですよね?長さ???
ヒントはこれです。
これで分かった方もいるのではないでしょうか?
答えはこちらです。
「正解リストの長さ」が4になるまで繰り返す。
これにより、4つの数字が決まるまで赤枠内の作業がプログラムで繰り返されます。
これで旗をクリックするとばらばらの4つの数字がリストに並ぶようになりました。
ちなみにわたしがまちがって組み立てたのがこちら。
どこが違うか分かるでしょうか?
これだと旗をクリックしても毎回数字が1つしか表示されません。
スクラッチ、変数を使いこなせるとさらに面白くなりそう
スクラッチに限らずこの先プログラミングの勉強をしていく中で「変数」が分かれば理解も深まるでしょうから備忘録をかねて説明させていただきました。
同じような人の役に立てばうれしいです。
もっとも子どもならこんな難しく考えず、感覚的に使いこなしてしまうのでしょうけどね。
今回参考にさせていただいたのはこの本です。子供向きに書かれていますが大人でも十分に役に立ちます。というか大人でもちゃんと読まないと昇進できませんww
興味のある人はぜひ読んでみてください。
[広告]
コメント