こんにちは、mickです。
教育向けプログラミング環境のScratchのを試用中。
スプライト同士でやり取りをしたい
メッセージの使い方は?
選択肢って作れるの?
ということが解決するようにしていきます。
これまで作ったプロジェクト「けいさんクイズ」を使って解決させていきます。
使うこと
- メッセージ
メッセージを使うことで、スクリプトの間で通信(動作のタイミングやきっかけをやり取りする)することができるようになります。
これを使わないと、複数のスクリプトが同時に動いてしまいます。
メッセージを使って計算クイズを改造する
大まかな流れはこのようになっています。
- 気になる点から改善する方法を考える
- 元のプロジェクトをコピーする
- スクリプトを組む(プログラミングする)
- テストしてから完成
メッセージを使ったスクリプト


前に作ったスクリプトをメッセージを使うように作りかえました。
メッセージを使うことで複数のスクリプトの間で動くタイミングや動くきっかけを作ることができます。
気になる点から改善する方法を考える
元のスクリプトの気になる点を考えます。
これまでの計算クイズは、ランダムで「足し算」「ひき算」「かけ算」「わり算」のいずれかが出題するようにしていました。
これでは苦手な計算を何度も挑戦したいときに困る。
そこでメッセージの仕組みを使うことで、プレイするユーザーが選べるようにしていきます。
元プロジェクトをコピーする
元のプロジェクトをコピーします。
元のプロジェクトを残すことで、いつでもやり直すことができます。
メニュー>ファイル>コピーを保存

コピーすると元のプロジェクトの名前に「Copy」が末尾に付いたプロジェクトができあがります。

今回はこれを「けいさんクイズ(えらべる)」としています。
スクリプトを組む(プログラミングする)
これまでのスクリプトを改造していきます。
実際の大まかなプログラムの流れはこちら
- 複数のスクリプトを用意する
- 「足し算」「ひき算」「かけ算」「わり算」の動物を作る
- 選んだ動物から、四則演算のいずれかの問題を作る
- 数字と計算の種類との文字をつなげてクイズを組み立てる
複数のスクリプトを用意します。

今回はいつもの1つに4つを加えて合計5つのスクリプトがあります。
- Cat Flying(メインのスクリプト)
- Dog1(メインのスクリプトを足し算へ制御するスクリプト)
- Unicorn 2(メインのスクリプトをかけ算へ制御するスクリプト)
- Butterfly 1(メインのスクリプトをひき算へ制御するスクリプト)
- Dinosaur2(メインのスクリプトをわり算へ制御するスクリプト)
今回は、次のような動きにしています。
- 犬を選ぶと、足し算クイズになる
- 蝶々を選ぶと、ひき算クイズになる
- ユニコーンを選ぶと、かけ算クイズになる
- 恐竜を選ぶと、わり算クイズになる
メインのスクリプトを動かしたときに、4つそれぞれのスクリプトにメッセージ「けいさんせんたくメッセージ」を送ることで、ユーザーの入力を待つようにします。

ユーザーがマウスでクリックしたスクリプトに応じて、「足し算」「ひき算」「かけ算」「わり算」いずれのクイズになるかが決定します。
決定したあと、ユーザーのマウスのクリックで選ばれたスクリプトがすべてのスクリプトにメッセージ「どのけいさんかきまったメッセージ」を送って、次の動作に移ります。

スクリプトがマウスでクリックされたかは「マウスのポインターに触れた」ことと「マウスが押された」ことを同時に判定します。
「マウスがポインターに触れた」だけでは、マウスが触れただけで動作するので使いにくい。
そして「マウスが押された」だけでは、どのスクリプトが押されたかわからないからです。
ユーザーに選ばれたスクリプトは、四則演算のどの計算をするのか、共通の変数に値をいれます。
そして、すべてのスクリプトにメッセージ「どのけいさんかきまったメッセージ」を送って、それぞれ次の動作に移ります。

メッセージ「どのけいさんかきまったメッセージ」を受け取ったメインのスクリプトは動作を続け、それ以外のスクリプトは動作を終了します。
メインのスクリプトは、すべてのスクリプトに共通する変数をみて、「足し算」「ひき算」「かけ算」「わり算」いずれのクイズにするかを決定します。
テストしてから完成

スクリプトが完成したら、早速動かしていきます。
今回のスクリプトは、スタートすると動物がでてきて「足し算」「ひき算」「かけ算」「わり算」いずれのクイズをするかをユーザーが選ぶことができます。
1から10の間の数字で四則演算をするようになっています。
そして、正解と正解でないルートにいくようになります。
補足としては、わり算は答えのみで、あまりは無視しています。
また、ひき算はマイナスの答えもありえます。
テストをして、自分の思うようなスクリプトの動きができていれば完成です。
おつかれさまでした。
まとめ。ユーザーに選んで欲しかった
今回、Scratchでメッセージを使った理由はこれです。
四則演算のどのクイズをするかユーザに選んで欲しかった
これを実現しようと思ったときに思いついたのが「動物を選んでもらって、その動物によって足し算、ひき算、かけ算、わり算、のどれをやるか決めよう」でした。
こういうやり方、Scratchじゃ邪道かもしれませんが、参考になると嬉しいです。
初稿 2020/08/30