こんにちは。IT/経済ジャーナリストで投資家の渡辺です。
これまでやったことはPythonのごくごく基本的な文法だけですが、文字を画面に出力するだけなら、これだけでも一発芸的なプログラムならもう作れます。
というか、基礎的な文法だけ学んで、あとは短いコードを組み合わせて自分のアイデア、創意工夫でちょっとした便利ツールを作るというのが、このようなスクリプト系言語の醍醐味だと思っています。
他にも元祖Perlとか日本発のRubyとかありますが、理念は同じだと思います。
この前は乱数を使ってサイコロのプログラムを作りましたが、今回はもっと手の込んだものとして、ビンゴマシンを作ってみます。
今お使いのパソコンを宴会に持っていけば、宴会の最後のビンゴゲームをこのPythonプログラムでできるようになります(きっぱり)。
1〜75までをランダムに出す
ビンゴマシンは、中に小さなボールが入っていて、そこに1から75の数字が書かれています。
ということで、まずは1から75までの数字をランダムに出す仕組みです。
すでにサイコロを作るプログラムは作っているので、1〜6までをランダムに出すコードはあります。
<関連記事>
これを再利用しない手はありません。
サイコロのために、数値計算ライブラリNumPyの乱数関数randomを使っていました。
サイコロでは、rand()関数で生成する乱数の範囲が0から1未満なので、6倍して0から5の乱数を作り、そこに1を足して、1から6の数字をランダムに作っていました。
これを75倍して1を足せば、1から75の数字がランダムに出せることになります。
以下はサイコロのコードですが、赤字の部分だけ改変しています。
数字を全部出すために75回繰り返しています。
import numpy as np
np.random.rand()
for i in range(75):
print(int(np.random.rand()*75)+1)
このように乱数が生成されました。
重複を避ける仕組み
ところが、上のテストで最初の1行と2行を見てください。
いきなり6が2回出ています。
本来のビンゴであれば、出たボールは戻さずに表の上に並べていくので、重複した数字は出ないはずです。
ということで、出た数字は記録していき、次に出た乱数がすでに出た数字と同じだった場合は、もう1度乱数を出すようにします。
1〜75までの数字の表を作って、出た数字はチェックして消していくことにします。
何か表を作りたい場合は、Listを使うのは覚えているでしょうか。
<関連記事>
・複数のデータを便利に扱えるリスト(List)を使ってみよう
1〜75までのリストを作る
まず、1〜75まで書かれたリストを作りましょう。
リストの名称は、bingo_numとします。
bingo_num = [1, 2, 3, 4, 5…….74, 75] と力ずくで75個の数字を書いてリストを作ってもいいのですが、ちょっと大変です。
ということで、for文のループを使って、1から75までカウントさせます。
範囲指定させるときは、range()関数を使います。
range()関数は数字を1つだけ指定すると、0からその数字までの範囲を示しますが、最初の数字と最後の数字を指定すると、その範囲で範囲指定してくれます。
ということで、最初に空のリストとしてbingo_numを作って、1から75までカウントし、どんどん数字を追加していくことで、1から75までの配列を作ります。
bingo_num = []
for i in range(1, 75)
bingo_num.append(i)
もしちゃんとできているか確認したいのであれば、print文で内容が全部印字されます。
print(bingo_num)
Listに残っているかチェックする
これでチェックリストができました。
このチェックリストを通じて、ある番号の玉がすでに出たのかまだ残っているのかをチェックしていきます。
ここで理解していただきたい処理は、2つあります。
1つはリストの中に、そのとき乱数で出た数があるかの確認、もう1つは、出た数はチェックリストから削除する必要があるので、リストからある要素を削除することです。
ある配列や文字列に数字や文字が含まれているか確認したいときは、演算子inを使います。
A in B でもし長い文字列や配列のBの中にAが含まれていれば、 True(真)を返します。
たとえば、“EFG” in “ABCDEFG12345″という式の場合、後ろの文字列に“EFG”は含まれているので(下線)、この式はTrue(真)になります。
if文の式として書いておけば、条件がTrueになるので、この次の処理が実行されることになります。
次に出た数のチェックリストからの削除ですが、これは先ほどループでリストbingo_numを作った時に使ったappend()関数の仲間で、その反対の働き、つまりリストからカッコ内の要素を削除するremove()関数を使います。
先ほどの反対に、ボールの出た番号を順番に削除していきます。
bingo_num.remove(x)
これでリストbingo_numの中から、‘x’が削除されます。
続けて、実際にビンゴマシンのコードを順番に作っていきましょう。
(後半に続く)
<今日の要約ノート>
ビンゴゲームを作る時に、出玉の重複を避けるために、Listはappend()関数で要素を積み重ねていくことができる。乱数で1〜75までの数字を作ったら、in演算子を使い、その数字がチェックリストに残っているか確認する。すでに出た数字であれば、リストのremove()関数でリストの中の要素から削除する。
コメント
[…] ・【無料】Listを使いこなしてビンゴマシンをPythonで書いてみる 〜その1 […]
[…] ・【無料】Listを使いこなしてビンゴマシンをPythonで書いてみる 〜その1 […]