隣の人のカードを1枚取り、ペアだったら除外する
前回は3人にカードを配り、配られたカードからペアのカードを除外しました。
今回は隣の人からカードを1枚取り、残った手持ちのカードの中で数字が同じものがあれば除外します。
今回は誰かのカードが無くなったら終了です。
カードをやり取りするプログラム
前回のプログラムに、隣の人からカードを引いてそのカードが手持ちのカードと同じ数字であれば除外する処理を追加します。
86行目以降が追加した処理です。
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 |
### インポート 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)): if i < len(cards)-1: next = i + 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]) ### カードの内容を画面表示 print('\n') for cnt,name in enumerate(PLAYER): if len(cards[cnt]) == 0: print(name, '[CLEAR!!]') ### 処理終了 end_flg = 1 else: print(name, cards[cnt]) ### 変数iのループから抜ける if end_flg == 1: break |
87行目
プログラムを終了するためのフラグを設定します。
90行目
誰かのカードが無くなるまでループします。
93~97行目
カードを引く人を変数i、カードを引かれる人を変数nextとします。
100行目
random.choice()を使って、次の人からカードを1枚取ります。
105行目
append()メソッドを使って、引いた人の配列に引いたカードを追加します。
114~135行目
引いたカードが手持ちのカードと同じ数字かどうかを確認します。
ロジックは51~71行目と同じなので、前回の記事を参照してください。
131~135行目は、130行目でbreakした時に二重ループから抜けるため処理です。
157、158行目
変数end_flgが1の場合は、93行目のループから抜けます。
そのあとwhileループに戻りますが、while文の条件が「end_flg == 0」なので、whileループも抜けてプログラムを終了します。
メモ
84行目までは前回と同じなので、詳しくは前回までの記事を参照してください。
プログラムを実行すると、以下のように誰かがクリアすると終了します。
実行例
C:\>python card7-1.py
### 配布したカード
山田 ['HA', 'SQ', 'D9', 'D4', 'C9', 'D3', 'DA', 'CQ', 'D8', 'HQ', 'C3', 'C4', 'C5', 'S4', 'SA', 'SK', 'H5', 'C7']
鈴木 ['CK', 'D5', 'DJ', 'H6', 'HK', 'H7', 'S6', 'CA', 'HT', 'CT', 'ST', 'H3', 'DT', 'HJ', 'H9', 'S5', 'JK', 'H2']
佐藤 ['CJ', 'SJ', 'H4', 'H8', 'C8', 'DK', 'S9', 'D6', 'D2', 'S7', 'DQ', 'C6', 'C2', 'S8', 'S2', 'S3', 'D7']
### ペアのカードを除外
山田 ['D8', 'HQ', 'S4', 'SA', 'SK', 'C7']
鈴木 ['H7', 'CA', 'H3', 'H9', 'JK', 'H2']
佐藤 ['H4', 'DK', 'S9', 'DQ', 'S8', 'S2', 'S3']
山田 → 鈴木 ['CA']
山田 ['D8', 'HQ', 'S4', 'SK', 'C7']
鈴木 ['H7', 'H3', 'H9', 'JK', 'H2']
佐藤 ['H4', 'DK', 'S9', 'DQ', 'S8', 'S2', 'S3']
鈴木 → 佐藤 ['S3']
山田 ['D8', 'HQ', 'S4', 'SK', 'C7']
鈴木 ['H7', 'H9', 'JK', 'H2']
佐藤 ['H4', 'DK', 'S9', 'DQ', 'S8', 'S2']
佐藤 → 山田 ['HQ']
山田 ['D8', 'S4', 'SK', 'C7']
鈴木 ['H7', 'H9', 'JK', 'H2']
佐藤 ['H4', 'DK', 'S9', 'S8', 'S2']
山田 → 鈴木 ['H2']
山田 ['D8', 'S4', 'SK', 'C7', 'H2']
鈴木 ['H7', 'H9', 'JK']
佐藤 ['H4', 'DK', 'S9', 'S8', 'S2']
鈴木 → 佐藤 ['DK']
山田 ['D8', 'S4', 'SK', 'C7', 'H2']
鈴木 ['H7', 'H9', 'JK', 'DK']
佐藤 ['H4', 'S9', 'S8', 'S2']
佐藤 → 山田 ['S4']
山田 ['D8', 'SK', 'C7', 'H2']
鈴木 ['H7', 'H9', 'JK', 'DK']
佐藤 ['S9', 'S8', 'S2']
山田 → 鈴木 ['DK']
山田 ['D8', 'C7', 'H2']
鈴木 ['H7', 'H9', 'JK']
佐藤 ['S9', 'S8', 'S2']
鈴木 → 佐藤 ['S8']
山田 ['D8', 'C7', 'H2']
鈴木 ['H7', 'H9', 'JK', 'S8']
佐藤 ['S9', 'S2']
佐藤 → 山田 ['H2']
山田 ['D8', 'C7']
鈴木 ['H7', 'H9', 'JK', 'S8']
佐藤 ['S9']
山田 → 鈴木 ['H7']
山田 ['D8']
鈴木 ['H9', 'JK', 'S8']
佐藤 ['S9']
鈴木 → 佐藤 ['S9']
山田 ['D8']
鈴木 ['JK', 'S8']
佐藤 [CLEAR!!]
カードのやり取り
カード引く人 → カードを引かれる人 [引かれるカード]