【無料】二重ループを使いこなしてビンゴマシンアプリをPythonで書いてみる 〜その2

アプリ開発

こんにちは。IT/経済ジャーナリストで投資家の渡辺です。

前半に引き続き、ビンゴゲームを作っていきます。

<前回の記事>

【無料】Listを使いこなしてビンゴマシンをPythonで書いてみる 〜その1

仕様としては、何かキーを押すと(何でもいいのですが、通常はEnterキーでいいでしょう)プログラムが動作して1〜75までのランダムな数字を重複しないように出力します。

この処理の流れをもう少し詳細に考えると、以下のようになります。

  1. 何かキーを押すのをトリガーに、1〜75の範囲で乱数を発生させる
  2. その乱数がチェックリストになければもう出たということで、1.に戻る(再度、乱数を出す)
  3. チェックリストにあるその数を消す
  4. 終了(=チェックリストの全部の数が消える、またはキーボードから “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(“これでビンゴゲームは終了です。”)

※コピペすると字下げ(インデント)のスペースがおかしくなることがあるので、その時は手動で修正してくださいね。

ところでビンゴの番号はこのミニアプリで作れますが、カード自体は別途用意する必要があるのでご注意ください。

ビンゴカード200

 

<今日の要約ノート>

ビンゴゲームでは処理全体を示す大きなループと、乱数の発生と重複チェックをしている小さなループの2つの繰り返し処理でできている。出た数字が重複しているかどうかは、小さなループの中で、リストの中身をチェックしている。もし重複していたら、continue文で乱数処理を最初からやり直している。重複なしの場合は、break文で小さなループを脱出しているが、結局大きなループがあるので、その先頭にまた戻っている。

 

コメント

タイトルとURLをコピーしました