全てのカードを人数分配布しよう
前回まではトランプのカードをそれぞれ5枚というように数を決めて配布しました。
今回は53枚全てのカードを3人に配布するプログラムを作ります。
カードの数は53枚なので、2人に18枚、1人に17枚のカードを配布します。
ndarrayを通常の配列に変換する
NumPyで作られる配列はndarrayといい、配列の要素の数は同じでなければならず、[[1,2,3],[4,5,6],[7,8]]のような形にはできません。
今回は配列の要素の数が異なるため、NumPyのndarrayをPythonの通常の配列に変換する必要があります。
ndarrayを通常の配列に変換するには、tolist()メソッドを使います。
ndarrayオブジェクト.tolist()
実行例
■ ndarray配列
>>> np.arange(5)
array([0, 1, 2, 3, 4])
■ 通常の配列
>>> np.arange(5).tolist()
[0, 1, 2, 3, 4]
トランプの山から全てのカードを配布するプログラム
トランプの山から全てのカードを配布するプログラムは、以下のようになります。
21行目でtolist()メソッドを使って、ndarray配列を通常の配列に変換しています。
24~27行目で残ったカードを取得して、30、31行目で残ったカードを先頭の配列と次の配列に追加しています。
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 |
### インポート import numpy as np ### 定数 MEMBER = 3 # 人数 ### 初期カード配列 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'] ### 元の配列を退避 tmp_card = CARD ### カードの総数を人数で割る number = int(len(CARD)/MEMBER) ### カードをランダムで取得 cards = np.random.choice(CARD, [MEMBER,number], False).tolist() ### 二次元配列をフラットにしてループ for x in np.ravel(cards): ### 取得したカードを配列から除外 tmp_card = [tmp for tmp in tmp_card if tmp != x] ### 残ったカードを追加 for i,card in enumerate(tmp_card): cards[i].append(card) ### カードの内容を画面表示 for i,name in enumerate(['山田','鈴木','佐藤']): print(name, cards[i]) |
プログラムを実行すると、以下のように山田さんと鈴木さんに18枚、佐藤さんに17枚のカードが配布されます。
実行例
C:\>python card5-1.py
山田 ['D2', 'S7', 'CJ', 'S6', 'D5', 'D3', 'DQ', 'D8', 'C5', 'D7', 'S8', 'SA', 'SJ', 'SQ', 'HJ', 'SK', 'DT', 'H5']
鈴木 ['DJ', 'S4', 'C7', 'H3', 'D9', 'HK', 'HA', 'H7', 'D6', 'CQ', 'C6', 'C4', 'DA', 'C8', 'DK', 'CT', 'H4', 'ST']
佐藤 ['S5', 'H6', 'H9', 'C9', 'CK', 'HQ', 'H2', 'S3', 'JK', 'CA', 'S2', 'C2', 'H8', 'C3', 'D4', 'S9', 'HT']