こんにちは。IT/経済ジャーナリストで投資家の渡辺です。
前半に引き続き、ビンゴゲームを作っていきます。
<前回の記事>
・【無料】Listを使いこなしてビンゴマシンをPythonで書いてみる 〜その1
仕様としては、何かキーを押すと(何でもいいのですが、通常はEnterキーでいいでしょう)プログラムが動作して1〜75までのランダムな数字を重複しないように出力します。
この処理の流れをもう少し詳細に考えると、以下のようになります。
- 何かキーを押すのをトリガーに、1〜75の範囲で乱数を発生させる
- その乱数がチェックリストになければもう出たということで、1.に戻る(再度、乱数を出す)
- チェックリストにあるその数を消す
- 終了(=チェックリストの全部の数が消える、またはキーボードから “end” と入力される)でなければ、1.に戻って乱数処理を続ける
ここではプログラム全体の大ループ、乱数を出して重複があれば再度乱数を出す処理の小ループという2つのループから成り立っています。
この記事の目次
2つのループを実装してみる
それでは上記の流れに沿って、大きなループ(赤い破線の枠内)、小さなループ(オレンジの実線)で実際にプログラムを作成していきます。
ちなみにこのように実際に動くものを作ることを「実装」といいます。
大きなループ
最初の行と次の行で、日本語コードの指定と、乱数を使うため数値計算ライブラリのNumPyを読み込みます。
これはもうプログラムの最初のお作法という感じです。
# coding: utf-8
import numpy as np
先ほどの繰り返しになりますが、ビンゴの出玉をチェックするためのチェックリストを作ります。
bingo_num = []
for i in range(1, 75)
bingo_num.append(i)
ここからがメインの処理です。
キーボードを押すたびに、重複しないようチェックしつつ乱数を1回発生させるようにします。
キーボードからの入力を受ける変数inbufには、文字ということが分かるよう、最初にダミーでスペースを入れています。
inbuf = ‘ ‘
while inbuf != “end”:
inbuf = input(“次の玉を出します(endで終了):”)
もし、“end”という文字が入力されたら、終了するようにします。
最大75回のループなので、for文で75回カウントさせて用が済んだらbreak文で抜けても良いのですが、キーボードからの終了コマンド(”end”)を受け付ける必要もあるので、while文でループさせています。
小さなループ
次に乱数の発生です。
重複した場合は再度乱数を発生させるので、1段目のインデントをかけて、ここにもう1つのwhile文を入れます。
インデントを忘れないでください。
while True:
bingo_ball = int(np.random.rand()*75)+1
発生させた乱数は0から0.99の範囲なので、75倍して端数(小数)を切り捨てています。
その結果、0から74の整数ができるので、それに単純に1を足して1から75の整数が得られるわけです。
次に重複の判定です。
配列の中にその数字があれば、まだ出ていないということなので、1)その数字を画面に印字して、2)済みということでチェックリストから削除します。
また引き続きビンゴのボールを引く操作をするので、break文で、小さいループを抜け出します。
言い換えれば、小さなループを抜けるのですが、その先には大きなループが続いているので、その先頭に来ます。
if bingo_ball in bingo_num:
print(bingo_ball, “が出ました。”)
bingo_num.remove(bingo_ball)
break
else:
continue
もしそこで出た数字がチェックリストbingo_numになければ、もう出てしまっているということなので、再度乱数を作る必要があります。
そのため、小さいループの先頭に戻ります。
そのための命令が、continue文です(ここで初めて出てきました)。
continue文はbreak文の兄弟分ですが、breakはループを抜ける(=ループの次に行く)のに対し、continueはループの先頭に戻り、また頭からそのループの処理を実行します。
何か判断をさせてループから抜けたいならbreak文、もう一度最初からループを始めるならcontinue文です。
どちらもループを使いこなすには、必須の命令です。
最後にビンゴゲームを終わらせるもう1つの条件であるチェックリストに残りカードがなくなったら、言い換えればチェックリストbingo_numの要素がすっからかんになったら、大きなループからも抜けて終了処理に向かいます。
if len(bingo_num) == 0:
break
終了処理といっても、ここでは大したことはしていませんが、いちおうユーザーにプログラムが終了したことを知らせるメッセージを出力しています。
print(“これでビンゴゲームは終了です。”)
まとめとして、最後にソースコードを全てまとめて貼り付けておきます。
これまでprint文を皮切りに、変数、whileやforのループ、if文、乱数のライブラリなど、ごく基礎的な文法しかやっていません。
それでも、こんな便利なミニアプリが作れてしまうのがPythonの面白いところです。
# coding: utf-8
import numpy as np
bingo_num = []
bingo_ball = 0
for i in range(1, 75):
bingo_num.append(i)
inbuf = ‘ ‘
while inbuf != “end”:
inbuf = input(“次の玉を出します(endで終了):”)
while True:
bingo_ball = int(np.random.rand()*75)+1
if bingo_ball in bingo_num:
print(bingo_ball, “が出ました。”)
bingo_num.remove(bingo_ball)
break
else:
continue
# ここが小さいループの終わり
if len(bingo_num) == 0:
break
# ここが大きいループの終わり
print(“これでビンゴゲームは終了です。”)
※コピペすると字下げ(インデント)のスペースがおかしくなることがあるので、その時は手動で修正してくださいね。
ところでビンゴの番号はこのミニアプリで作れますが、カード自体は別途用意する必要があるのでご注意ください。
<今日の要約ノート>
ビンゴゲームでは処理全体を示す大きなループと、乱数の発生と重複チェックをしている小さなループの2つの繰り返し処理でできている。出た数字が重複しているかどうかは、小さなループの中で、リストの中身をチェックしている。もし重複していたら、continue文で乱数処理を最初からやり直している。重複なしの場合は、break文で小さなループを脱出しているが、結局大きなループがあるので、その先頭にまた戻っている。
コメント