Python入門講座

【Python入門講座】class習得➂ビンゴカードを作ろう

おはようございます、こんにちわ、こんばんわ。ノンストップ飯田です。

今日は前回作ったビンゴゲームに続いて、ビンゴで使うカードを作ってみようという回です。

※前回の記事はこちら

ンゴカードの要素を考える(業務要件)

まずは、ビンゴカードをビンゴカードたらしめる要素を考えてみましょう。

ビンゴカードの要素としては・・・

こんなところでしょうか。

ンゴカードの要素をPythonで実現する方法を考える(システム要件)

次に洗い出した要素毎にPythonで実現する方法を考えてみます。

5×5マスの要素をどうPythonで実現するか?

例えば、単純に5マスであればリストの概念が使えます。

※リスト型の復習はこちら

つまり、こういことですね。

但し、これだと5マスしか表せません。いわば1次元ですね。
これを5×5と二次元にするには、その名の通り二次元配列というものを使います。

リストの要素として、リストを持たせることも実は可能です。
5つの要素を持つ、リストのそれぞれの要素に5つの要素を持たせることで、5×5の2次元世界を作り出すわけです。

イメージは以下の通りです。

そこで、考えたのが以下の手法です。
5×5の二次元配列を、要素は全て0で作成する。

ビンゴカードクラスを作り、インスタンス変数としてself.cardを作成します。
self.card = [[0]*5 for i in range(5)]というプログラムで、[0]を5個並べたリストを上位のリストに5個要素として格納しています。

コマンドプロンプトで実行すると、以下のようになります。

各マスには数字が書かれている

前項で、0が25マスに書かれたビンゴカードは用意しましたが、これではビンゴゲームはできないですよね。

最終的には25マスに数字を入れていく必要があります。
リストには各要素を指定して値を更新する機能があります。

例えば、list変数に[0,0,0,0,0]というリストが代入されている場合、3番目の要素を5にしたいとします。
この場合、list[ 2 ](要素数は0からカウントするから3ではなく、2です。)と書きます。
実際にやってみましょう。

できましたね、二次元配列もやり方は同じです。
例えば、5番目のリストの3個目の要素のみ5にしたい場合は、list[ 4 ][ 2 ]というように記載します。
それでは、こちらもやってみましょう。

こちらもできましたね。

1~75までの数をランダムに抽出し、抽出した数をループ処理で要素数を指定し数を0から抽出した数に置き換える。
この処理ができれば、数字を25マスに埋めることができますよね。
いずれもインデックスの数は0~4と分かっています。

リスト内リストのインデックスを”インデックス1″、リストのインデックスを”インデックス2とした場合、インデックス1を1~4まで増やしていき、”インデックス1″が4になったら、”インデックス2″を増やし、”インデックス1″は0に戻す。
このループ処理を作ることができれば、実現できそうですね!

イメージとしてはこんな感じです。

では、久しぶりにちょっと、考えてみましょう。
自分なりに上のイメージをどう実現するか、考えてみください。
list1に25個の0が格納されている続きから、全ての要素を5で置き換えるプログラムを書いてみましょう。


 
インデックス2が4になるまで動くWhileループ処理を書き、さらにその中にインデックス1が4になるまで動くループ処理を書きます。

インデックス1のループ処理では、リストの要素を5に塗り替える事にインデックス1を1増やす動きが書いてあり、4になると印デックス2を増やすとともに、インデックス1を0に塗り替えます。

whileで設定した条件を満たした場合の処理はelseで書くことができます。

インデックス2も4になった時点で、list1を出力しています。

※Whileによるループ処理の復習はこちら

各マスの数字は重複しない

各マスに数字を入れる事には成功しましたが、同じ数字が複数並んだりしたらゲームになりませんよね。
そこで、今度は各マスに入る数字が重複しないようにする方法を考えます。

少し考えてみてください。



では、ランダムに抽出するもとをbingo_ballsリスト、選ばれた数が格納される場所をchoose_ballsリストとしてプログラムを書いてみましょう。

ちなみに、リストから削除を行う場合はremoveというメソッドでリストからマッチした値を削除することができます。



抽出された数(choose_ball)は19ですね。
抽出された数を格納しているchoose_ballsリストに格納されている数は19です。
そして、抽出もとになったbingo_ballsリストから19がなくなっています。

先ほどの順繰りに二次元配列の要素をループ処理で塗り替えていくプログラムと、この重複を排除するプログラムを組み合わせれば、ビンゴカードらしきものが作れそうですね!

あと少しです。

真ん中のマスはFREE

これはもう簡単ですね。

ではサクッとご回答をお願いします(笑)



二次元配列の[ 2 ][ 2 ]の要素を最後にXXで上書きする

最後でいいのです。
カードに数字が埋まってから、最後にXXを入れればOK。

プレイヤー毎にカードが必要

これは、ビンゴカードクラスを作ることで解決します。
今後プレイヤークラスを作るときに、プレイヤー毎にビンゴカードクラスを使って、
手持ちのカードを生成すればいいんじゃないかなーと思ってます。(まだ考えてないけど 笑)

Pythonでのビンゴカードの作り方まとめ

ではここまで書いてきた要素を、classの書き方に当てはめて、ビンゴカードクラスを書いてみましょう。


では出力してみましょう!

複数回プログラムを実行すれば、複数枚のビンゴカードが作成が可能です。

では、次回はプレイヤークラスを作っていきましょう。