【実用】ビンゴマシン

決められた範囲の数字(1~10など)をシャッフルして、先頭から順番に表示するビンゴマシンです。
1.内容
決められた範囲の数字(サンプルプログラムでは1~10)をシャッフルして、先頭から順番に表示する簡易的なビンゴマシンです。数字の最大値(サンプルプログラムでは10)はプログラム中で指定します。
このサンプルプログラムは、プログラムでシャッフルする方法(2種類)を紹介したものです。実際に、ビンゴマシンとして使用するには、数字の表示方法に工夫が必要です。例えば「ボタンAを押すごとに数字を先頭から一つずつ順番に表示する」などです。
2.このプログラムの動作に必要なもの
このプログラムは、micro:bit本体のみで動作します。
- micro:bit本体
- パソコン(*1)
- USBケーブル(*1)
(*1):パソコン・USBケーブルは、プログラミングに必要なものです。
3.サンプルプログラム(ブロック)
サンプルプログラム(ブロック)です。
最初だけ実行されるプログラム
変数の初期化を行った後、ビンゴの数字をシャッフルする関数を呼び出しています。
関数:ビンゴの初期化
ビンゴの数字という配列に、1から最大値で指定された数まで格納します。その後、配列に保管された数字を入れ換えながらシャッフルします。シャッフルの方法については「5.解説」で紹介します。
関数:ビンゴの初期化_簡易版
関数「ビンゴの初期化」と同様に、配列に保管した数字をシャッフルします。この関数は、乱数で入替元と入替先の添え字(配列の番号)を求めた後、各々に保管された数字を入れ替えてシャッフルするものです。十分にシャッフルされるように、このプログラムでは最大値を二乗した回数分、入れ替えを繰り返しています。この方法は、理解しやすいのですが、処理に無駄が多くなります。
4.サンプルプログラム(JavaScript)
サンプルプログラム(JavaScript)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | function ビンゴの初期化 (最大値: number) { for (let カウンター = 0; カウンター <= 最大値; カウンター++) { ビンゴの数字[カウンター] = カウンター + 1 } for (let 入替元 = 0; 入替元 <= 最大値 - 2; 入替元++) { 入替先 = Math.randomRange(入替元, 最大値 - 1) 入替元の数字 = ビンゴの数字[入替元] ビンゴの数字[入替元] = ビンゴの数字[入替先] ビンゴの数字[入替先] = 入替元の数字 } } function ビンゴの初期化_簡易版 (最大値: number) { for (let カウンター = 0; カウンター <= 最大値; カウンター++) { ビンゴの数字[カウンター] = カウンター + 1 } for (let i = 0; i < 最大値 * 最大値; i++) { 入替元 = Math.randomRange(0, 最大値 - 1) 入替先 = Math.randomRange(0, 最大値 - 1) 入替元の数字 = ビンゴの数字[入替元] ビンゴの数字[入替元] = ビンゴの数字[入替先] ビンゴの数字[入替先] = 入替元の数字 } } let 入替元 = 0 let 入替元の数字 = 0 let 入替先 = 0 let ビンゴの数字: number[] = [] ビンゴの数字 = [] let 数字の最大値 = 10 ビンゴの初期化(数字の最大値) for (let カウンター = 0; カウンター <= 数字の最大値 - 1; カウンター++) { basic.showNumber(ビンゴの数字[カウンター]) } |
5.解説
関数「ビンゴの初期化」で行われているシャッフル方法について図解します。
関数「ビンゴの初期化_簡易版」では、入替元と入替先の添え字(配列の番号)を求めるという方法でシャッフルします。十分にシャッフルするために、このプログラムでは最大値を二乗した回数分、入れ替えを繰り返しています。この方法は、理解しやすいのですが、処理に無駄が多くなります。最大値が10の場合、繰り返しの回数は100回となります。
一方、関数「ビンゴの初期化」では、繰り返し回数が最大値-1(最大値より一つ少ない)回数でシャッフルすることができます。その方法は、図5-1のようになります。プログラムと比較しながら、動きを考えてみましょう。