
前回は選択肢を表示するプラグラムを作りました。
今回は、選択肢を選んだら正解・不正解を判定するプログラムを作っていきます。
前回の記事はこちら:③選択肢を表示しよう
4択クイズを作ろう トップ記事はこちら:Scratchで4択クイズを作ろうトップ記事

解説の画像が見づらい時は、画像をクリックして拡大して見てね!
正解・不正解の判定方法の解説
プログラムを書いていく前に、今回どのように正解・不正解を判定するか説明します。
選択肢のスプライトがクリックされたら、その選択肢と「回答」リストに入っているアルファベットが同じかチェックします。同じだったら正解、違ったら不正解とします。

ただし、選択肢のスプライトそれぞれで正解・不正解の判定をすると、それぞれの選択肢スプライトに同じ処理を書くことになってしまいます。
②問題を出そうで説明した通り、同じ処理がいろんなところにあると、バグが発生する確率も高くなるため、正解・不正解の処理は1つにまとめて書くことにします。
どんなプログラムになるかイメージできますか?
イメージできた人は、続きを見てみて、同じようなプログラムになっているか確認してみてください。
イメージできなかった人は、一緒にプログラムしながらどういう風に実装するのか学んでいきましょう!
選択肢のスプライトが押されたときの処理を作る
選択肢のスプライトが押されたら、「このスプライトが押されたよ」というメッセージを送るようにします。
①「選択肢A」のスプライトをクリックしましょう。
②イベントの中の『このスプライトが押されたとき』ブロックをドラッグしましょう。
③イベントの中の『メッセージ▼を送る』ブロックをドラッグしましょう。
④「メッセージ▼」をクリックして、「回答A」というメッセージを新しく作って設定しましょう。

『このスプライトが押されたとき』ブロックにそのまま『メッセージ▼を送る』ブロックをくっつけてしまうと、問題を出題していないときにスプライトをクリックしてもメッセージを送ってしまいます。
そのせいで、動きがおかしくなる可能性があります。
これを防ぐために、問題を読み終わって回答するときだけメッセージを送るようにします。
そのためには、「今回答する場面だよ」ということをわかるようにする必要があります。
「状態」という変数を作って、この変数に「今はどんな状態なのか」を設定するようにします。
変数の中の『変数を作る』をクリックして、「状態」という変数を作りましょう。

①演算の中の『○=50』ブロックをドラッグしましょう。
②「○」の部分に、先ほど作成した変数「状態」をはめこみましょう。
③「50」の部分に、「回答中」を入力しましょう。

①制御の中の『もし<>なら』ブロックを『このスプライトが押されたとき』ブロックの下にくっつけましょう。
②「<>」の部分に『状態=回答中』ブロックをはめ込みましょう。
③『もし<>なら』ブロックの間に、『回答A▼を送る』ブロックを入れましょう。

これで、「状態」が「回答中」のときに「選択肢A」スプライトをクリックしたらメッセージを送るようになりました。
このブロックをコピーして、他のスプライトも同じように押されたときにメッセージを送るようにしましょう。
送るメッセージは次のように設定してください。
- 選択肢Bスプライト:回答B
- 選択肢Cスプライト:回答C
- 選択肢Dスプライト:回答D

これで、どの選択肢スプライトを押してもメッセージを送るようになりました。
「状態」変数に「回答中」を設定する
メッセージを送るときに、「状態」変数に設定されている文字が「回答中」だったら送るようにしましたが、「状態」変数に「回答中」を設定するところがないため、作成しましょう。
この記事では、選択肢のAからDを時間差で順番に表示しているため、最後に表示される選択肢Dが表示されたら、「状態」変数に「回答中」を設定するようにします。
もし、すべての選択肢が同時に表示するようにしている場合は、どれか一つのスプライトに下の画像と同じように処理を追加してください。(下の画像と同じように選択肢Dのスプライトに追加で問題ないと思います。)
①「選択肢D」スプライトをクリックしましょう。
②変数の中の『変数▼を0にする』ブロックをドラッグして、『出題▼を受け取ったとき』の処理の一番下にくっつけましょう。
③「変数▼」の部分に「状態」を設定しましょう。
④「0」の部分に「回答中」を設定しましょう。

これで、選択肢がすべて表示されたら「状態」変数が「回答中」になって、選択肢のスプライトをクリックするとメッセージを送るようになりました。
メッセージを受け取って正解・不正解を判定する
ここからはメッセージを受け取って、正解・不正解を判定するプログラムをつくっていきます。
正解・不正解を判定する処理を作成する
まずは、正解・不正解を判定する処理から作成していきます。
今回は「背景1」に正解・不正解を判定する処理を作ることにします。
①「背景1」をクリックしましょう。
②ブロック定義の中の『ブロックを作る』をクリックしましょう。

①ブロック名に「正誤判定」と入力しましょう。
②『引数を追加 数値またはテキスト』をクリックしましょう。
③ブロックに「number or text」というのが追加されているので、ここに「回答」と入力しましょう。
④「OK」をクリックしましょう。

これで、「正誤判定」と言う定義ができました。


「ブロック定義」ってなに?

いくつかの命令をひとまとめにして、自分だけの新しいブロックを作る機能です。
<解説>
同じような処理を何度も使うとき、毎回同じブロックを組み立てるのは大変です。
そこで、何度も使う処理を1つのブロックにまとめることができるのが、ブロック定義です。
今回の場合、4つの選択肢スプライトからメッセージが送られてきます。
それぞれのメッセージを受け取って、正解・不正解を判定するのですが、この判定する処理を4つも作るのは面倒です。
もし修正が必要になったら4つとも直さないといけないので、修正漏れやバグが発生する確率も高くなります。
正解・不正解を判定する処理を1つのブロック定義としてまとめることで、プログラムを短く、見やすくすることができて、修正の手間やバグが発生する確率も少なくすることができます。
『正誤判定』のブロック定義には、「回答」という引数を追加しています。
この引数には、『正誤判定』ブロックを呼び出すときに、プレイヤーが選んだ選択肢が設定されるようにします。
『正誤判定』ブロックに正解・不正解を判定する処理を書きながら、どのように引数を使うのか確認してみましょう。
①変数の中の『リスト▼の1番目』ブロックをドラッグしましょう。
②「リスト▼」の部分に「回答」を設定しましょう。
③変数の中の『問題数』ブロックを『リスト▼の1番目』ブロックの「1」の部分にはめ込みましょう。

①演算の中の『○=50』ブロックをドラッグしましょう。
②「○」の部分に『回答▼の問題数番目』ブロックをはめ込みましょう。
③「50」の部分に『正誤判定』定義の引数「回答」をはめ込みましょう。

①制御の中の『もし<>なら~でなければ』ブロックをドラッグして、『正誤判定』定義の下にくっつけましょう。
②「<>」の部分に『回答▼の問題数番目=回答』ブロックをはめ込みましょう。

『もし<>なら~でなければ』ブロックを使って正解・不正解を判定します。
「回答」リストから、今の問題の正解を取り出します。選んだ答えと同じなら正解、違っていたら不正解にします。
選んだ答えが、引数の「回答」に入ることになります。
今回は、正解の場合は「正解」というメッセージを、不正解の場合は「不正解」というメッセージを送るようにします。(※「正解」、「不正解」のメッセージを受け取ったときの処理は次回プログラミングします。)
①イベントの中の『メッセージ▼を送る』ブロックを2つドラッグして、『もし<>なら~でなければ』ブロックの間に入れます。
②「もし<>なら」のほうは、「メッセージ▼」の部分に「正解」というメッセージを作って設定しましょう。
③「でなければ」のほうには、「メッセージ▼」の部分に「不正解」というメッセージを作って設定しましょう。

問題の正解・不正解を判定したら、「状態」変数を「回答中」とは別の文字に変更して、スプライトを押しても何も起きないようにします。
①変数の中の『変数▼を0にする』ブロックをドラッグして、『正誤判定』定義の一番下にくっつけましょう。
②『変数▼を0にする』ブロックを、『状態▼を出題中にする』となるように変更しましょう。

これで、正解・不正解を判定するプログラムが完了です。
『正誤判定』定義を呼び出す処理を作成する
次に、『正誤判定』定義を呼び出す処理を作成します。
選択肢のスプライトがクリックされたら、メッセージが送られてくるので、そのメッセージを受け取ったら『正誤判定』定義を呼び出すようにします。
この時に、どの選択肢が押されたのかわかるように、選ばれた回答を引数で渡してあげます。
①イベントの中の『メッセージ▼を受け取ったとき』ブロックをドラッグしましょう。
②「メッセージ▼」の部分を「回答A」に変更しましょう。
③ブロック定義の中の『正誤判定○』ブロックを『回答A▼を受け取ったとき』ブロックにくっつけましょう。
④「○」の部分に「A」と入力しましょう。

これで、「回答A」のメッセージを受け取ったら、正誤判定に「A」という引数を渡して呼び出す処理ができました。
同じように、「回答B」、「回答C」、「回答D」のメッセージを受け取ったときの処理も書いてみましょう。
引数を、メッセージと同じアルファベットにするのを忘れないように注意しましょう。

これで、どの選択肢が選ばれても正解・不正解を判定する処理が完成しました。
まとめ
お疲れ様です!
これで、選ばれた選択肢が正解・不正解を判定することができるようになりました。
ここまで、1問だけクイズを出題して、回答して、正解・不正解を判定するという、一連の流れができました。
次回は、2問目、3問目と連続でクイズを出題して回答できるようにするプログラムを作っていきます。
今回使用したブロック定義は、何回も書かないといけない処理を1つにまとめることができるで、使いこなせるようになると、プログラムを短く、見やすくすることができます。
きれいなプログラムを書くためには、ぜひ使えるようになりたいものなので、使えそうな場面があったら積極的に使ってみましょう。
次の記事はこちら↓

4択クイズを作ろう トップ記事はこちら↓

おすすめ
Scratchでのプログラミング学習におすすめの書籍です。
コメント