クラスを使ってババ抜きプログラムを作ろう
前回までのババ抜きプログラムは、クラスや関数を使わずにプログラムを作りました。
今回はクラスを使って、ババ抜きプログラムを作ってみましょう。
クラスを使ったババ抜きプログラム
今回はPlayerというクラスを作り、そこにプレイヤーの名前や手札を保存します。
また、ペアカードの削除や隣の人からカードを引くという処理もクラス内にメソッドとして定義します。
前回まではペアだったらカードを除外するという処理が2か所に書かれていましたが、クラス化することによってdel_pair()というメソッドにまとめました。
カードの山からプレイヤーにカードを配る処理も、カードをシャッフルしてから1枚づつプレイヤーに配布するように変更しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
### インポート import numpy as np ### 初期カード配列 CARD = ['CA','C2','C3','C4','C5','C6','C7','C8','C9','CT','CJ','CQ','CK', 'DA','D2','D3','D4','D5','D6','D7','D8','D9','DT','DJ','DQ','DK', 'HA','H2','H3','H4','H5','H6','H7','H8','H9','HT','HJ','HQ','HK', 'SA','S2','S3','S4','S5','S6','S7','S8','S9','ST','SJ','SQ','SK', 'JK'] ### 定数 PLAYER = ['山田','鈴木','佐藤'] # プレイヤー名 MEMBER = len(PLAYER) # 人数 ############################ ### プレイヤークラス ############################ class Player: ############################ ### 初期化メソッド ############################ def __init__(self, name): self.name = name # プレイヤー名 self.cards = [] # 手持ちのカード ############################ ### ペアカード除外メソッド ############################ def del_pair(self): ### 削除確認用配列初期化 arr_del = [0 for i in range(len(self.cards))] ### ジョーカーの場合2を設定 for i in range(len(self.cards)): if self.cards[i] == 'JK': arr_del[i] = 2 ### 配列の先頭から比較 for i in range(len(self.cards)): ### 除外済みまたはジョーカーの場合処理を飛ばす if arr_del[i] != 0: continue ### ペアの存在を確認 for j in range(i+1, len(self.cards)): ### 除外済みまたはジョーカーの場合処理を飛ばす if arr_del[j] != 0: continue ### 同じ数字の場合 if self.cards[i][1] == self.cards[j][1]: ### 削除確認用配列に1を設定 arr_del[i] = arr_del[j] = 1 ### 一番内側のループを抜ける break ### 一時配列作成 arr_tmp = [tmp for tmp in self.cards] ### ペアを配列から削除 for i in range(len(arr_del)): if arr_del[i] == 1: self.cards.remove(arr_tmp[i]) ############################ ### カード操作メソッド ############################ def get_card(self, next_player): ### 引数で渡されたカードから1枚引く choice_card = np.random.choice(next_player.cards, 1) ### 引いたカードを画面に表示 print('\n') print(self.name, '→', next_player.name, choice_card) ### 引かれたカードを持っていた人から除外 next_player.cards.remove(choice_card) ### 引いたカードを引いた人に追加 self.cards.append(choice_card[0]) ############################ ### メイン関数 ############################ def main(): ### プレイヤーを作成 players = [Player(name) for name in PLAYER] ### カードをシャッフル np.random.shuffle(CARD) ### プレイヤーの順番 order = 0 ### カードの枚数分ループ for card in CARD: ### カードを配布 players[order].cards.append(card) ### プレイヤーの順番指定 if order < MEMBER-1: order += 1 else: order = 0 ### カードの内容を画面表示 print('### 配布したカード') for i in range(len(players)): print(players[i].name, players[i].cards) ### 配布した人数分ループ for i in range(len(players)): ### 手持ちのカードからペアを除外 players[i].del_pair() ### カードの内容を画面表示 print('\n### ペアのカードを除外') for i in range(len(players)): print(players[i].name, players[i].cards) ### 終了フラグ設定 end_flg = 0 ### 誰かがクリアするまでループ while end_flg == 0: ### カードを引く人と引かれる人を決定 for i in range(len(players)): ### 引く人のカードが0枚の場合処理を飛ばす if len(players[i].cards) == 0: continue ### 引かれる人を決定 if i < len(players)-1: next = i + 1 else: next = 0 ### 引かれる人が0枚の場合次の人にする for _ in range(len(players)-1): if len(players[next].cards) == 0: if next < len(players)-1: next += 1 else: next = 0 ### カードをランダムで引く players[i].get_card(players[next]) ### 引いたカードがペアなら除外 players[i].del_pair() ### プレイ人数 active_cnt = MEMBER ### カードの内容を画面表示 print('\n') for cnt in range(len(players)): if len(players[cnt].cards) == 0: print(players[cnt].name, '[CLEAR!!]') ### プレイ人数カウントダウン active_cnt -= 1 else: print(players[cnt].name, players[cnt].cards) ### 残り一人になったら終了フラグを立てて終了 if active_cnt == 1: end_flg = 1 break ############################ ### メイン関数呼び出し ############################ if __name__ == "__main__": ### 処理開始 main() |
プログラムの実行結果自体は、前回のプログラムと同様です。
実行例
C:\>python card9-1.py
### 配布したカード
山田 ['CJ', 'S8', 'S6', 'CK', 'C5', 'D8', 'DQ', 'S4', 'HK', 'S3', 'D2', 'C8', 'SK', 'CT', 'SQ', 'DT', 'HA', 'C3']
鈴木 ['CA', 'C2', 'HQ', 'H4', 'D3', 'D4', 'SJ', 'SA', 'CQ', 'C6', 'DK', 'D6', 'C4', 'HJ', 'S7', 'C9', 'HT', 'H2']
佐藤 ['DA', 'S9', 'S5', 'JK', 'D9', 'S2', 'H8', 'H3', 'C7', 'D7', 'DJ', 'H9', 'ST', 'H7', 'D5', 'H6', 'H5']
### ペアのカードを除外
山田 ['CJ', 'S6', 'C5', 'S4', 'D2', 'C8', 'SK', 'HA']
鈴木 ['D3', 'DK', 'C4', 'S7', 'C9', 'HT']
佐藤 ['DA', 'JK', 'S2', 'H8', 'H3', 'DJ', 'H9', 'ST', 'H7', 'H6', 'H5']
山田 → 鈴木 ['S7']
山田 ['CJ', 'S6', 'C5', 'S4', 'D2', 'C8', 'SK', 'HA', 'S7']
鈴木 ['D3', 'DK', 'C4', 'C9', 'HT']
佐藤 ['DA', 'JK', 'S2', 'H8', 'H3', 'DJ', 'H9', 'ST', 'H7', 'H6', 'H5']
鈴木 → 佐藤 ['DA']
山田 ['CJ', 'S6', 'C5', 'S4', 'D2', 'C8', 'SK', 'HA', 'S7']
鈴木 ['D3', 'DK', 'C4', 'C9', 'HT', 'DA']
佐藤 ['JK', 'S2', 'H8', 'H3', 'DJ', 'H9', 'ST', 'H7', 'H6', 'H5']
~ 中略 ~
山田 ['H7']
鈴木 ['JK', 'S7']
佐藤 [CLEAR!!]
山田 → 鈴木 ['JK']
山田 ['H7', 'JK']
鈴木 ['S7']
佐藤 [CLEAR!!]
鈴木 → 山田 ['H7']
山田 ['JK']
鈴木 [CLEAR!!]
佐藤 [CLEAR!!]