見出し画像

【Robo Blocksの使い方】1度出た結果は2度でないクジ引きを作る ビンゴゲーム

ソフトバンクロボティクスでPepperを使ったプログラミング教育を担当してる佐藤です!
以前の記事で乱数とそれを使ったおみくじを紹介しました。
おみくじのプログラムは毎回抽選されるため大吉が2連続で出るような可能性もありますが、ビンゴゲームなどのように1度出た結果が2度出ないような抽選を作りたい場合もあると思います。
今回はビンゴゲームをお題に、結果が重複しない抽選の例を作っていきます!


ビンゴの前提

この記事ではビンゴゲームの抽選機となるPepperを作成していきます。
一般的なビンゴゲームでは用紙は5*5の25マスのものを使い、書かれている数字は1~75までですが、今回は3*3マスかつ数字は1~9までの簡易な例で作っていきます。以下のような用紙を使うビンゴのイメージです。

用紙は3*3マスで数字は1~9まで

ビンゴPepperを作る

では作っていきましょう!
まずは抽選するためのリストを作成します。このリストがポイントになります。リストを使って抽選する候補を管理することで、同じ結果は2度でないと言った動きを実現することができます。
リストには抽選したい候補を全て入れておきます。最初に初期化(すべてを削除)するのを忘れないようにしましょう。

リストに抽選したい要素を全て入れておく

上記の画像では1~9まで手動で入れていますが、追加する数字が規則的に並んでいるので繰り返し処理を作って簡素化することもできます。抽選する数字を増やしたいときなどにこちらの方が簡単なので、慣れている方はこのように組んでみると良いと思います。

繰り返し処理を使った例

これで1~9までの数字が入ったリストを作ることができましたので、さっそく抽選しましょう。2回以上繰り返したときに同じ結果が出ないようにするには以下の順番で処理します。

1.リストの中から数字を1つ抽選する
2.抽選結果を発表する
3.抽選した数字を消す
4.1~3を好きな回数繰り返す

1.リストの中から数字を1つ抽選する

まずは数字を1つ抽選します。この後の手順でリストの要素を消しますので、生成する乱数の上限を手入力しますとうまく動かなくなります。(リストには8個しか数字がないのに9番目の値を参照したりしてしまいます)
上限はリストの長さを使いましょう。これにより毎回リストの要素の数を最大として乱数を生成することができます。

毎回リストの長さを上限として乱数を生成する

生成した乱数は後ろの手順でも使いますので、変数にして記憶しておきます。

変数に乱数を保存しておく

この変数を使ってリストから数字を一つ取り出せば「1.リストの中から数字を1つ抽選する」の手順は完了です。

生成した乱数でリストから値を1つ取り出す

2.抽選結果を発表する

次に、抽選した結果を発表します。ここではPepperに発話させて発表しますが、ディスプレイに表示するなどでも良いと思います。1の手順で作ったブロックと組み合わせて、以下のようになります。

Pepeprが喋って数字を発表する

3.抽選した数字を消す

抽選結果を発表したら、今発表した要素をリストから削除します。発表する前に消してしまうと順番がずれてしまうので、必ず発表した後に消しましょう。リストのn番目を削除するブロックを使い、以下のようにします。

発表後にリストの要素を削除する

4.1~3を好きな回数繰り返す

抽選するごとにリストから数字を削除することで重複をなくすことができました。あとはこれを好きな回数繰り返すだけです。今回はわかりやすいように頭を触るたびに数字を1つ抽選するようにしてみました。
触られた後すぐにセンサを終了させているのは、短い時間で連続して触ってしまう誤操作を防ぐためです。

頭を触ったら数字を一つ発表する

これで、抽選結果が重複しないビンゴPepperの完成です!

まとめ

今回はビンゴゲームを例に、リストを使って結果が重複しない抽選を作る方法をご紹介しました。

重複する例としてはおみくじを紹介しておりますが、実社会の神社のおみくじについて考えてみると、引いたおみくじは箱に戻さないので同じ紙は2度と出ず、重複していません。
この方法で出現確率に傾斜をつけたい場合は、要素の個数に差をつける方法があります。大吉10%、中吉60%、凶30%でおみくじの枚数が10枚だとするとリストの中身は「大吉・中吉・中吉・中吉・中吉・中吉・中吉・凶・凶・凶」となります。
こちらの方が箱の中から1枚ずつクジを引いていくイメージが持てて、お子さんは分かりやすいのかもしれないですね。

是非お試しください!