ババを持った最後の一人になるまでプログラムを続ける
前回は誰かがクリアするとそこでプログラムは終了しましたが、今回はババを持った最後の一人になるまでプログラムを続けます。
最後の一人になるまで処理を続けるプログラム
最後の一人になるまでプログラムを続けるために、クリアしている人は飛ばす処理を追加しています。
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 |
### インポート import numpy as np ### 定数 PLAYER = ['山田','鈴木','佐藤'] # プレイヤー名 MEMBER = len(PLAYER) # 人数 ### 初期カード配列 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'] ### 元の配列を退避 choice_card = CARD ### カードの総数を人数で割る number = int(len(CARD)/MEMBER) ### カードをランダムで取得 cards = np.random.choice(CARD, [MEMBER,number], False).tolist() ### 二次元配列をフラットにしてループ for x in np.ravel(cards): ### 取得したカードを配列から除外 choice_card = [tmp for tmp in choice_card if tmp != x] ### 残ったカードを追加 for i,card in enumerate(choice_card): cards[i].append(card) ### カードの内容を画面表示 print('### 配布したカード') for i,name in enumerate(PLAYER): print(name, cards[i]) ### 配布した人数分ループ for i in range(len(cards)): ### 削除確認用配列初期化 arr_del = [0 for pos in range(len(cards[i]))] ### ジョーカーの場合2を設定 for pos in range(len(cards[i])): if cards[i][pos] == 'JK': arr_del[pos] = 2 ### 配列の先頭から比較 for j in range(len(cards[i])): ### 除外済みまたはジョーカーの場合処理を飛ばす if arr_del[j] != 0: continue ### ペアの存在を確認 for k in range(j+1, len(cards[i])): ### 除外済みまたはジョーカーの場合処理を飛ばす if arr_del[k] != 0: continue ### 同じ数字の場合 if cards[i][j][1] == cards[i][k][1]: ### 削除確認用配列に1を設定 arr_del[j] = arr_del[k] = 1 ### 一番内側のループを抜ける break ### 一時配列作成 arr_tmp = [tmp for tmp in cards[i]] ### ペアを配列から削除 for j in range(len(arr_del)): if arr_del[j] == 1: cards[i].remove(arr_tmp[j]) ### カードの内容を画面表示 print('\n### ペアのカードを除外') for i,name in enumerate(PLAYER): print(name, cards[i]) ### 終了フラグ設定 end_flg = 0 ### 誰かがクリアするまでループ while end_flg == 0: ### カードを引く人と引かれる人を決定 for i in range(len(cards)): ### 引く人のカードが0枚の場合処理を飛ばす if len(cards[i]) == 0: continue ### 引かれる人を決定 if i < len(cards)-1: next = i + 1 else: next = 0 ### 引かれる人が0枚の場合次の人にする for _ in range(len(cards)-1): if len(cards[next]) == 0: if next < len(cards)-1: next += 1 else: next = 0 ### カードをランダムで引く choice_card = np.random.choice(cards[next], 1) print('\n') print(PLAYER[i], '→', PLAYER[next], choice_card) ### 引かれたカードを持っていた人から除外 cards[next].remove(choice_card) ### 引いたカードを引いた人に追加 cards[i].append(choice_card[0]) ### 削除確認用配列初期化 arr_del = [0 for pos in range(len(cards[i]))] ### ペアを確認するためループ for j in range(len(cards[i])): ### ジョーカーの場合処理を飛ばす if cards[i][j] == 'JK': continue ### 手持ちのカードから数字を比較 for k in range(j+1, len(cards[i])): ### ジョーカーの場合処理を飛ばす if cards[i][k] == 'JK': continue ### 数字が同じなら配列にフラグを設定してループ終了 if cards[i][j][1] == cards[i][k][1]: arr_del[j] = arr_del[k] = 1 break else: continue ### 変数jのループから抜ける break ### 一時配列作成 arr_tmp = [tmp for tmp in cards[i]] ### ペアを配列から削除 for j in range(len(arr_del)): if arr_del[j] == 1: cards[i].remove(arr_tmp[j]) ### プレイ人数 active_cnt = MEMBER ### カードの内容を画面表示 print('\n') for cnt,name in enumerate(PLAYER): if len(cards[cnt]) == 0: print(name, '[CLEAR!!]') ### プレイ人数カウントダウン active_cnt -= 1 else: print(name, cards[cnt]) ### 残り一人になったら終了フラグを立てて終了 if active_cnt == 1: end_flg = 1 break |
96、97行目
カードを引く人がクリアしていれば次の人に回します。
106~111行目
カードを引かれる人がクリアしていれば次の人に回します。
160~176行目
クリアした人数が一人になるまで処理を繰り返します。
プログラムを実行すると、最後の一人になるまで処理続けます。
実行例
C:\>python card8-1.py
### 配布したカード
山田 ['DA', 'D8', 'S8', 'HQ', 'H7', 'DK', 'CT', 'CA', 'CK', 'D5', 'D3', 'C2', 'C9', 'D6', 'H4', 'H2', 'SA', 'C5']
鈴木 ['DQ', 'C8', 'HJ', 'CJ', 'S2', 'S4', 'HT', 'S9', 'C4', 'H3', 'H9', 'H6', 'C3', 'S5', 'C6', 'S6', 'D4', 'JK']
佐藤 ['HK', 'D2', 'DT', 'D9', 'D7', 'SJ', 'SK', 'H5', 'C7', 'S3', 'H8', 'HA', 'CQ', 'S7', 'ST', 'DJ', 'SQ']
### ペアのカードを除外
山田 ['HQ', 'H7', 'CT', 'D3', 'C9', 'D6', 'H4', 'SA']
鈴木 ['DQ', 'C8', 'S2', 'HT', 'S5', 'S6', 'D4', 'JK']
佐藤 ['D2', 'D9', 'H5', 'S3', 'H8', 'HA', 'S7']
山田 → 鈴木 ['S5']
山田 ['HQ', 'H7', 'CT', 'D3', 'C9', 'D6', 'H4', 'SA', 'S5']
鈴木 ['DQ', 'C8', 'S2', 'HT', 'S6', 'D4', 'JK']
佐藤 ['D2', 'D9', 'H5', 'S3', 'H8', 'HA', 'S7']
鈴木 → 佐藤 ['H5']
山田 ['HQ', 'H7', 'CT', 'D3', 'C9', 'D6', 'H4', 'SA', 'S5']
鈴木 ['DQ', 'C8', 'S2', 'HT', 'S6', 'D4', 'JK', 'H5']
佐藤 ['D2', 'D9', 'S3', 'H8', 'HA', 'S7']
~ 中略 ~
山田 ['D3']
鈴木 ['S6', 'JK']
佐藤 ['S3', 'D6']
佐藤 → 山田 ['D3']
山田 [CLEAR!!]
鈴木 ['S6', 'JK']
佐藤 ['D6']
鈴木 → 佐藤 ['D6']
山田 [CLEAR!!]
鈴木 ['JK']
佐藤 [CLEAR!!]