カードを配り直した場合、配布したカードは元の配列から除外する
前回はカードを配り直しても元の配列は元のままでしたが、今回は一旦配布したカードは元の配列から除外するようにします。
また、必要なカード枚数が残っていない場合は、そこでプログラムを終了します。
配布したカードを元の配列から除外するプログラム
配布したカードを元の配列から除外するプログラムは、以下のようになります。
36行目で内包表記をすることによって、配布したカードを除外して新しく配列を作り直しています。
また、残りのカードが必要枚数より少なくなったら「### DRAW ###」と表示してプログラムを終了します。
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 |
### インポート import numpy as np ### 定数 MEMBER = 3 # 人数 NUMBER = 5 # 枚数 ### 初期カード配列 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'] ### 配列を退避 arr_card = CARD ### ジョーカーが出るまで繰り返す while True: ### 必要カード枚数以下の場合は終了 if len(arr_card) < MEMBER*NUMBER: print('\n### DRAW ###') break ### カードをランダムで取得 cards = np.random.choice(arr_card, [MEMBER,NUMBER], False) ### 取得した中にジョーカーがない場合 if ('JK' in cards) == False: ### 二次元配列をフラットにしてループ for x in np.ravel(cards): ### 取得したカードを配列から除外 arr_card = [tmp for tmp in arr_card if tmp != x] ### ループの先頭に戻る continue ### カードの内容を画面表示 for i,name in enumerate(['山田','鈴木','佐藤']): if ('JK' in cards[i]): print(name, cards[i], 'HIT!!') else: print(name, cards[i]) ### ループ終了 break |
プログラムを実行すると、以下のように表示されます。
1回目に実行した時は、ジョーカーが出なかったのでドローになっています。
実行例
C:\>python card4-1.py
### DRAW ###
C:\>python card4-1.py
山田 ['C3' 'D5' 'H3' 'D2' 'SK']
鈴木 ['CT' 'CK' 'ST' 'HJ' 'H9']
佐藤 ['SJ' 'H6' 'HQ' 'C7' 'JK'] HIT!!