Python入門講座

【Python入門講座】class習得➁ ビンゴゲームを作ろう

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

前回はclass習得➀として、オブジェクト指向について概念を説明しました。

今回は具体的なclassの書き方を説明しつつ、ビンゴゲーム(超簡略版)を作っていきたいと思います。

ンゴゲームの要素を洗い出す(業務要件)

ざっとビンゴゲームに必要な要素を、カード・ボール・ビンゴゲーム・プレイヤーと4つのオブジェクトに分けて要素を洗い出しました。
それぞれをclassで作成するイメージです。

ところが現在、カードclassの作成で目下格闘中です。(笑)

そこで、以下の要件に絞って作成したいと思います。

ビンゴゲームclassの業務要件

➊ 1~75までの数字が書かれたボールを作成し、ケースに入れる(未登場ケース)
➋ 何かキーを押すたびに、ボールをランダムで一個ひく
➌ 引かれたボールは引いたボールを入れる登場済ケースにいれる
➍ 引かれたボールを未登場ケースから除いていく
➎ 未登場ケースが空になったら終了

何か気づきましたか?そうです、カードがないとビンゴゲームができません!!

早急にカードの作り方は研究するとして、、、

まずは、以上の業務要件をもとにPythonで、実装するためのシステム要件を次に考えていきましょう。

ンゴゲームをPythonで実装するためのシステム要件を考える

洗い出した業務要件ごとにシステム要件を考えていきましょう。

➊ 1~75までの数字が書かれたボールを作成し、ケースに入れる(未登場ケース)

単純に作ると、リストを一個作って、その中に1~75の数字が格納すればOKですよね。

では書きましょう、bingo_balls = [1,2,3,4・・・] めんどくさい!!(笑)

めんどくさいことはループ処理で大抵解決できます。

bingo_ballsリストを作って、for関数で1~75までをリストに追加していきます。

bingo_balls = [] for i in range(1,76):
  bingo_balls.append(i)

これで、bingo_ballsリストに1~75までの数字を格納できます。
試しにprint関数でbingo_ballsリストを出力してみましょう。

できていますね。

※ forでのループ処理を復習したい方は以下ページへ

➋ 何かキーを押すたびに、ボールをランダムで一個ひく

初めに作ったプログラムは実行しただけで、bingo_ballsが空になるまでひたすらボールを引いてくれました。

・・・全くビンゴ感がなかった(笑)

そこで、少しビンゴ感を出すために、キーボードでsを押したら一個ずつボールを引くようにしてみます。

キー入力でプログラムを動かす

入力させる時はinput関数が使えますね。

inputで入力したものをstart変数で受け取った場合にプログラムが動くようにします。

書いてみると、こんな感じですね。

肝心のボールを引くプログラムを作る

75個のボールからランダムでボールを引く動きを作ります。

これはランダムモジュールでできますね。引いたボールは、登場済ケースに入れたり、
未登場ケースから削除したりする必要があるので一旦choose_ball変数に代入します。

こんな感じで実行したら・・・

59を引いたようですね。成功。

※ランダムモジュールについて復習したい方は以下にて

➌ 引かれたボールは引いたボールを入れる登場済ケースにいれる

引かれたボールを登場済ケースに追加します。
これは、要件➊と同じやり方ですね。

choose_ball変数を都度、登場済リスト(choose_ballsリストとでもしましょう)に追加すればOKです。

➍ 引かれたボールを未登場ケースから除いていく

リストからある要素を削除していく場合は、removeという関数を使います。

appendと同じような書き方になります。

未登場ケースはbingo_ballsリストなので、以下のようなプログラムとなります。

リストを用意して、初めの状態のbingo_ballsリスト。
引いた数を出力し、引いた数を追加したchoose_ballsリストと引いた数を削除した後のbingo_ballsリストを出力します。

これを実行すると・・・

きちんと動いていますね!

➎ 未登場ケースが空になったら終了

次がこのプログラムの肝となる部分です。

未登場ケースが空になるまで、繰り返し処理が行われるようにするループ処理を書きます。

「未登場ケースが空になる=bingo_ballsの要素が全て除かれて要素が0になる状態」ですよね。

なので、こういう場合はforよりもwhileでループ処理を書くのがよさそうです。

while len(bingo_balls) > 0: と書き出せばOKです。
(bingo_ballsの要素数が0、つまりlen(bingo_balls)が0となれば終了です)

※whileのループ処理を復習したい方はこちら

classの書き方

では、全体像は掴めたので、ここでclassの書き方について記載します。

いろいろ細かく解説すると、長くなるしいきなり理解はできないと思うので、
以下3点に絞ります。

classの記載の仕方

➊ まずはclass名を定義する
➋ インスタンス変数を定義する
➌ 必要に応じclass内にメソッド(関数)を定義する

では具体的に書き方はどうなるかというと・・・

こうなります。

➊ class名の定義は、class クラス名:と書きます。(:を忘れがちなのでお気をつけを)
一般的に暮らす名の先頭は大文字にするようです。

➋ インスタンス変数は def __init__(self):と書き、インデント(TABキーでスペースを開け)の後に、
クラスとして持たせたいリストや、変数を記載します。
例では、bingo_ballsリスト、choose_ballsリスト等を持たせています。ちなみに、インスタンス変数等、
クラス内で使う変数等にはself.を頭につけます。(self.bingo_ballsみたいに)

➌ ボールを引く機能を、take_ball関数として定義しています。
書き方はdef take_ball(self):というように、こちらも(self)を忘れずに。

ちなみにクラスを定義した関数含めて実行する時は、下の二行にあるように適当な変数に、クラスを代入。
クラスを代入した変数で関数を実行します。

定義したクラスはimportで呼び出し可能です。その辺はまた次回以降ふれていきます。

今回は、以上のとおりとして簡単に解説とします。(次回はインスタンス変数を掘り下げて説明します)

とめ Pythonのビンゴゲームclass

これまでの内容を踏まえて、ビンゴゲームクラスを以下の通り書きました。


是非、上記コードを真似してご自分で実行してみてください。
可能であれば、アレンジしてみることも習得に繋がると思います。

次回はインスタンス変数について掘り下げて解説してみたいと思います。