Scratchで〇×クイズを作ろう 発展編②ランダムに問題を出そう

2021年8月16日

前回の発展編①では、問題を10問出題できるようにプログラミングしました。

今回は、10問の中からランダムで5問出題するようにプログラムを改造していきます。

10問一気に出題しても良いのですが、2~3回遊ぶと、問題を覚えてしまってつまらなくなってしまうので、遊ぶたびに出題される問題と順番が変わるようにしていきます。

発展編①はこちら: 発展編① 問題をたくさん出そう

〇×クイズを作ろう トップ記事はこちら: 〇×クイズを作ろうトップ記事

バババ
バババ
解説の画像が見づらい時は、画像をクリックして拡大して見てね!

今回やることを整理しよう

発展編②でどんなことをしていくのか整理していきます。

やりたいこと

前回は10問の問題文を作って、それを順番に出題するようにしました。

今回は、前回作った10問の問題文の中から、ランダムで5問だけ出題するようにプログラムを改造していきます。

改造する場所と内容

今回改造するスプライトと改造する内容は次の通りです。

スプライト改造する内容
問題文・出題する問題をランダムにする
マル・ランダムに出題した問題でも正しく正解・不正解を判定できるようにする
バツ・ランダムに出題した問題でも正しく正解・不正解を判定できるようにする
解説文・問題文に一致した解説文を表示するようにする
次へ・問題を5問出題したらゲームを終了させる

改造する内容のイメージ

上の表を見て、どんな改造をすれば良いかイメージできますか?言葉だけでは改造するプログラムがイメージしづらいと思うので、絵で今回の改造のイメージを見てみましょう。

今のプログラムの仕組みは↓の絵のようになっています。

今のプログラムの仕組み
今のプログラムの仕組み

『出題した問題数』の変数に入っている数字を基に、各スプライトのコスチュームや正解・不正解を判定を行っています。

『出題した問題数』の変数には2つの役割があります。

役割①:これまでに出題した問題の数を数える
役割②:今出題してい問題が何問目なのかの情報を保持する

1つの変数に2つの役割があるので、新しい変数を作って「1つの変数に1つの役割」になるようにします。

変数の役割
変数の役割のイメージ図

新しい変数を作って、そこに1~10のランダムな数字を入れてあげることにより、ランダムに問題を出題できるようにします。

改造後のプログラムの仕組み
改造後のプログラムの仕組み

このようにランダムに問題を出せるようにプログラムを改造していきます。

プログラミングしよう

では、実際にプログラミングしていきましょう。

問題文のスプライト

『問題文』のスプライトを次のように改造していきます。

・出題する問題をランダムにする

「改造する内容のイメージ」のところでも出てきたように、新しい変数を作ってランダムに問題を出せるようにします。

バババ
バババ
『問題文』のスプライトの改造が一番複雑で大変です。それ以外のスプライトの改造は簡単ですぐ終わるので、気合を入れて『問題文』のスプライトを改造していきましょう!!

出題する問題をランダムにしよう

①『問題文』のスプライトをクリックして、新しい変数『出題する問題No』を「すべてのスプライト用」として作りましょう。

この『出題する問題No』という変数には、1~10までのランダムな数字が入るようにプログラミングします。

②『出題する問題No』の変数を初期化(リセット)するために、『緑の旗が押されたとき』ブロックのかたまり の一番下に、変数の中の『[変数名▼]を0にする』ブロックをくっつけましょう。
③『[変数名▼]を0にする』ブロックの「[変数名▼]」の部分をクリックして、『出題する問題No▼』に変えましょう。

現在の問題文を表示するプログラムを『出題する問題No』の変数を使ったプログラムに改造していきます。

④変数の中の『[変数名▼]を0にする』ブロックをドラッグして、『背景が問題画面▼になったとき』ブロックの下にくっつけましょう。
⑤「[変数名▼]」の部分をクリックして、『出題する問題No▼』に変えましょう。

⑥演算の中の『1~10までの乱数』ブロックをドラッグして、『出題する問題No▼を0にする』ブロックの「0」の部分にはめこみましょう。

これで、『出題する問題No』の変数に1~10までのランダムな数字が入るようになりました。このランダムな数字に合わせてコスチュームを表示するようにします。

ですが、その前に不要になる処理を削除します。
今は『もし出題した問題数 < 11 なら ~ でなければ』ブロックを使って、問題を10問出すようにしていますが、今回は5問出題したら終了にするプログラムを『次へ』のスプライトに実装するので、『もし出題した問題数 < 11 なら ~ でなければ』ブロックを削除します。

⑦変数の中の『出題する問題No』をドラッグして、『コスチュームを出題した問題数にする』ブロックの『出題した問題数』の部分にはめこみましょう。
⑧はめこむと、『出題した問題数』ブロックが外に出てくるので、削除しましょう。

これで、問題文がランダムに表示されるようになったので、実行して確認してみましょう。
正解・不正解の判定や解説文はまだプログラミングしていないので、正しく動作してくれませんが、問題文の表示だけは確認できます。

問題文がランダムに表示されましたか?
実行して気付いた人もいるかもしれませんが、実はこのプログラムにはバグ(不具合)があります。

問題文がランダムに表示されるようになりましたが、同じ問題文が何度も表示されてしまうことがあります。

このバグを修正していきましょう。

同じ問題文が何度も表示されないようにしよう

同じ問題文が何度も表示されないようにするために、次のような仕組みを作ります。

新しく作るプログラムの仕組み
新しく作るプログラムの仕組み

解説

新しく『出題した問題リスト』というリストを作って、出題した問題の番号をメモしていきます。

『出題する問題No』の変数に入っているランダムな数字が『出題した問題リスト』にメモされていたら、すでに出題した問題なので、『出題する問題No』に別のランダムの数字を入れます。

『出題した問題リスト』にメモされていなかったら、まだ出題していない問題なので、出題します。

出題するときに、『出題した問題リスト』にその問題の番号をメモします。

まずは『出題した問題リスト』というリストを新しく作ります。
問題を出題するたびに、このリストにその問題の番号を入れるためのものです。

変数の中の『リストを作る』をクリックして、新しいリストを作りましょう。新しいリストを作るときは、次のように設定します。

・新しいリスト名:出題した問題リスト
・すべてのスプライト用を選択する

ゲームが始まったときに『出題した問題リスト』を初期化(リセット)します。

これで、ゲームが始まったら毎回『出題した問題リスト』が空っぽになります。

次に、『出題した問題No』の変数に入っている数字を、『出題した問題リスト』にメモする部分を作りましょう。

変数の中の『なにかを出題した問題リスト▼に追加する』ブロックをドラッグして、『出題した問題数▼を1ずつ変える』ブロックの下にくっつけましょう。

「なにか」の部分に、変数の中の『出題する問題No』ブロックをドラッグしてはめこみましょう。

これで、出題する問題の番号を『出題した問題リスト』にメモするようになりました。

『出題する問題No』の変数に入っている数字が、『出題した問題リスト』にメモされているか確認する部分を作ります。

制御の中の『もし<>なら』ブロックをドラッグして、『出題する問題No▼を1~10までの乱数にする』ブロックの下にあるブロックをはさみこみましょう。

『もし<>なら』の「<>」の部分には、「『出題した問題リスト』に『出題する問題No』がメモされていない」という意味になるようにブロックをはめこみます。

ただし、1つのブロックでこのような意味になるものはないので、2つのブロックを組み合わせて作ります。

演算の中から『<>ではない』ブロックをドラッグして、『もし<>なら』ブロックの「<>」の部分にはめこみます。

この『<>ではない』ブロックは、「否定」と言って、「<>」の部分にはめこんだブロックの意味を逆の意味に変える効果があります。

変数の中の『出題する問題リスト▼になにかが含まれる』ブロックをドラッグして、『<>ではない』ブロックの「<>」の部分にはめこみましょう。

変数の中の『出題する問題No』をドラッグして、『出題する問題リスト▼になにかが含まれる』ブロックの「なにか」の部分にはめこみましょう。

これで、「『出題した問題リスト』に『出題する問題No』がメモされていない」という意味になります。

『出題した問題リスト▼に出題する問題Noが含まれる』というのは、「出題した問題リストに出題する問題Noの数字がメモされている」という意味になります。

これを『<>ではない』ブロックで逆の意味に変えているので、「『出題した問題リスト』に『出題する問題No』がメモされていない」という意味になるのです。

ここまでで、↓のフローチャートの赤い矢印のルートが完成しました。

完成したルート(赤い矢印)
完成したルート(赤い矢印)

次に、『出題する問題リスト』にメモされていた場合のルートをプログラムしていきます。『出題した問題リスト』に『出題する問題No』の数字がメモされていたら、ランダムな数字を入れる処理を繰り返し行うようにします。

制御の中の『ずっと』ブロックをドラッグして、『背景が問題画面になったとき』ブロックの下にあるブロックをすべてはさみこみましょう。

これで、繰り返し処理されるようになりましたが、問題を出題する部分を『ずっと』ブロックから切り離します。

以下のブロックをずっとブロックの外に出しましょう。
・『出題した問題数▼を1ずつ変える』ブロック
・『コスチュームを出題する問題Noにする』ブロック
・『表示する』ブロック

これらのブロックが『ずっと』ブロックの中にあると、プレイヤーが問題を答える前にどんどん問題文が切り替わっていってしまうので、外に出しました。

この3つのブロックは、『出題した問題リスト』にメモされていなかったら、メッセージを送って動くようにします。

①イベントの中の『[メッセージ名▼]を送る』ブロックをドラッグして、『ずっと』ブロックの中の一番下にくっつけましょう。
②[メッセージ名▼]の部分をクリックして、新しいメッセージ「出題」を作りましょう。

このメッセージを先ほど外に出した3つのブロックが受けるようにします。

①イベントの中の『[メッセージ名▼]を受け取ったとき』ブロックをドラッグして、外に出した3つのブロックの一番上にくっつけましょう。
②[メッセージ名▼]の部分をクリックして、「出題」に変えましょう。

最後に、メッセージを送ったら『ずっと』ブロックの繰り返しを終わるようにします。

①制御の中の『すべてを止める▼』ブロックをドラッグして、『出題▼を送る』ブロックの下にくっつけましょう。
②「すべてを止める▼」の部分をクリックして、「このスクリプトを止める」に変えましょう。

これで問題文のスクリプトのプログラムは完成です。

このプログラムでは、↓のようなことをしています。

プログラムの解説
プログラムの解説

プログラムができたら、変数とリストの表示がゲーム画面に表示されないようにしておきましょう。

マルとバツのスプライト

『マル』と『バツ』のスプライトはどちらも同じように改造します。

改造する内容は次の通りです。

・ランダムに出題した問題でも正しく正解・不正解を判定できるようにする

ランダムに出題した問題でも正しく正解・不正解を判定できるようにしよう

今のプログラムでは、『答えリスト▼の 出題した問題数 番目』を見て、正解・不正解を判定しています。

これを、『出題した問題数』ではなく、『出題する問題No』に変更します。

これで完成です。同じように、『バツ』のスプライトも変更しましょう。

これで、『マル』と『バツ』のスプライトの改造は完了です。

今までは、『出題した問題数』の変数には、以下の2つの役割がありました。

役割①:これまでに出題した問題の数を数える
役割②:今出題してい問題が何問目なのかの情報を保持する

この役割①と役割②の数字が同じなので、『出題した問題数』の変数を使っていましたが、ランダムに出題することによって、役割①と役割②の数字が同じにならなくなるため、役割②を持つ『出題する問題No』の変数に変えました。

解説文のスプライト

『解説文』のスプライトは、次のように改造していきます。

・問題文に一致した解説文を表示するようにする

これも、『マル』と『バツ』のスプライトと同じ内容で改造します。

問題文に一致した解説文を表示するようにしよう

今は『コスチュームを 出題した問題数 にする』となっているので、『出題した問題数』を『出題する問題No』に変えましょう。

これで、『解説文』のスプライトの改造は完了です。

次へのスプライト

『次へ』のスプライトは、次のように改造していきます。

・問題を5問出題したらゲームを終了させる

問題を5問出題したらゲームを終了させよう

『次へ』のスプライトが押されたときに次のような条件分岐を追加します。

もし『出題した問題数』が「5」なら『すべてを止める』。
でなければ、『背景を問題画面にする』。

これで、『次へ』のスプライトの改造は完了です。

『出題した問題数』の変数は、問題を出題するたびに1ずつ増えていくので、「5」になっていたら問題を5問出題したことになるので、ゲーム終了となります。

「5」になっていなければ、問題画面を表示して、次の問題を出題します。

実行して確認しよう

今回改造したプログラムが正しく動作するか確認しましょう。

以下の内容がきちんとできていれば、発展編②でやりたいことはすべて完成です。

問題文のスプライト

『問題文』のスプライトは、次のポイントに注目して確認してみましょう。

確認ポイント

・問題文がランダムに表示されていること(何度も問題画面を表示させて確認しよう)

マルとバツのスプライト

『マル』と『バツ』のスプライトは、次のポイントに注目して確認してみましょう。

確認ポイント

・正解・不正解の判定が正しいこと

解説文のスプライト

『解説文』のスプライトは、次のポイントに注目して確認してみましょう。

確認ポイント

・問題文に一致した解説文が表示されること

次へのスプライト

『次へ』のスプライトは、次のポイントに注目して確認してみましょう。

確認ポイント

・スプライトを押したとき、1問目~4問目までは『問題画面』が表示されること

・スプライトを押したとき、5問目はゲームが終了すること

まとめ

お疲れ様でした!
これで、問題をランダムに5問出題して、正解・不正解も正しく判定できるようになりました。

今回は『問題文』のスプライトの改造が複雑で難しかったと思います。おまけに僕の説明も下手で余計分かりにくかったかもしれません…。(ごめんなさい)

わからないことや質問があれば、下にあるコメント欄や問い合わせから気軽に質問してください。

次回は「何問正解できたか」をプレイヤーに伝える画面を作成します。

今回は『問題文』のスプライトのプログラムが複雑なので、説明に「フローチャート」を使用しました。

「フローチャート」は図でプログラムを表現するもので、複雑のプログラムを人に伝えるときや処理の流れを整理するときに便利です。

次の記事「発展編②」はこちら↓
発展編③ 最終結果を表示する画面を作ろう

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

おすすめ

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

Scratch

Posted by バババ