Pythonで簡単に作れる抽選ゲームを紹介します。情報の授業の参考にしてみてくださいね!
準備
使う知識
リスト
整数や文字列など、いろんな型のデータをしまっておける”箱”のようなものです。リストでは、格納したデータの文字1つ1つに、「インデックス」と呼ばれる数字が割り振られます。
while文とif-break文
while文とif-break文は以下のように組み合わせて使います。
while 条件1:
if 条件2:
break
上に書いてあるwhile文では、条件1を満たす限り同じ処理を繰り返します。これをループといいます。しかし、このままでは永久にループしてしまうため、if-break文で無理やりループを抜けさせます。上に書いたようにif-break文を記述すると、条件2が満たされたときに、強制的にループを抜けます。
実現したいこと
抽選ゲームのルールを決めます。今回は、大型ショッピングモールでよく見かける、ガラガラ抽選をイメージして作っていきます。仕様はこんな感じ↓
- ガラガラ抽選でゲットできる景品は「ポケットティッシュ、ボールペン、うまい棒30本、割引券、アマゾンギフトカード、圧力なべ、ドライヤー、旅行券」の8種類。個数は先頭から、「30、20、20、15、10、5、5、1」個とする。
- チャンスは5回
- 同じ景品が3回出たら終了
- 圧力なべ、ドライヤー、旅行券は高価なため、店側への配慮としてこれらどれかが1つでも出たら抽選終了。
設計図
設計図は次のようにしてみました。
ざっくり説明すると、
- 商品を決め、「chance」の値を初期化する。
- 抽選を行い、終わったら「chance」の値に1を足す。
- これを繰り返し、「chance」の値が5になったら終了する。
- ループ中であっても、豪華景品(圧力なべ、ドライヤー、旅行券)が当たるか、もしくは同じ景品が3回当たればその時点で抽選は終了する。
作成
作成したフローチャートをもとにして、抽選ゲームを作っていきます。解説①~④をつなげるだけで抽選ゲームを作れるようにしました!
解説①
「random」・・・あとで使います。ここではスルー。
「gacha」・・・景品の情報を格納するリスト。各景品にインデックスが割り振られます。
「kaisu」・・・景品が出た回数を表示するためのリスト(あとで使います)。
「chance」・・・抽選できる回数を示すリスト。最初は0にしておき、抽選するごとに1を足していく。
解説②
「chance」の値が5より小さいとき、抽選を行います。まず「x」という仮の文字を用意して、0~7の数字を格納。このとき、景品のインデックスに一致する数字に、景品の個数(weight)を与えてあげます!この個数の偏りを与えてくれるのが、解説①でスルーした「random」。この「random」モジュールはリストの中から、ランダムに数値を選んでくれる役割も果たすので、これが抽選の要素になります!
この時点では、「x」に格納されている数字は文字として認識されています。これを数値としてコンピュータに認識させます!「y」に数値情報に変更した「x」を格納。これがwhile文中の2行目。
3行目では「gacha」リストの中から、ランダムに選ばれた数値に該当する景品を表示させます。たとえば、0が選ばれたとき、「ポケットティッシュが出ました。」と表示されます。
そして、選ばれた商品と同じ番号の「kaisu」リストの値を+1します。また、抽選が1度行われたら「chance」の値を+1します。
この操作を「chance」の値が5以上になるまで繰り返します。
解説③
続いて、制約条件を与えていきます。ここで一旦、制約条件をおさらいしておきます!
- 圧力なべ、ドライヤー、旅行券は高価なため、店側への配慮としてこれらどれかが1つでも出たら抽選終了。
- 同じ景品が3回出たら終了
まず1つ目のif文。圧力なべ、ドライヤー、旅行券に該当する番号の「kaisu」リストが1になった瞬間に、while文のループを抜けます。「or」でつなぐことで、「どれか1つでも条件を満たしたら~」ということを表現できます。
そして2つ目のif文。商品が当たった回数を記録している「kaisu」リストのうち、どれか1つでも”3”になった瞬間にwhile文のループを抜けます。
解説④
最後に結果を表示して終了!おつかれさまでした!解説①~④を合体させたものを次の章で紹介します。
完成図
完成図はこんな感じです!比較的シンプルでわかりやすいシステムになりましたね。それでは、本当に動くかどうか試してみましょう!
実行結果
実行してみると、正常に動作しているのが確認できますね!左の図では、問題なく5回抽選が行われていますし、右の図では制約条件がしっかり機能していることが確認できます。
今回はこれで終了です。私から皆さんへ発展問題を用意しているので、ぜひ挑戦してみてくださいね!
追加課題、考察
- 「weights」リストの中の値を変化させると、抽選結果はどのように変化するだろうか?考察してみよう!
- 最後の「———-complete!———-」から下の長ーーーいprintの行。実はwhile文を使うと、4行以内で記述できます。試行錯誤しながら作ってみてね!
まとめ
今回は簡単な抽選ゲームの作成を通して、Pythonについて勉強してきました。授業で習ったことを使って簡単なシステムを作ることは、理解を深めるうえで最も有効です。私もまだまだ未熟ですが、試行錯誤して作成したプログラムをアップして、自分自身もレベルを上げていきます。
これからも皆さんの情報の授業が楽しくなるようなシステムを発信していきます。また遊びに来てくださいね!