こんにちは、みやびのです。
今回は、randomライブラリのshuffle()メソッドを活用方法をトランプの処理を例にして紹介します。
具体的には以下の2点についてです。
・Pythonのrandom.shuffle()メソッドの使い方
・Pythonのrandom.shuffle()でトランプの処理を作成する例
目次
Pythonのrandom.shuffle()メソッドの使い方
「shuffle()」は、リストをランダムに並び替えることができるメソッドです。
引数には並び替えをするリストを取ります。
1 2 | list = ['a', 'b', 'c', 'd', 'e', 'f'] random.shuffle(list) |
リストはリターン値ではなく引数を直接書き換えるので注意しましょう。
(リターン値で返すよりも引数を書き換える方が高速でソートできるため)
「shuffle()」メソッドの記述例と実行例は以下の通りです。
1 2 3 4 5 6 7 8 | import random list = ['a', 'b', 'c', 'd', 'e', 'f'] # リストをシャッフルする random.shuffle(list) print(list) |
◆実行結果
1 | ['e', 'c', 'a', 'f', 'b', 'd'] |
もちろんランダムに並び替えるので毎回結果は変わります。
1 | ['b', 'c', 'f', 'a', 'e', 'd'] |
Pythonのrandom.shuffle()でトランプの処理を作成する例
Pythonのrandom.shuffle()をトランプを配る処理を作成します。作成する処理は以下の3つです。
・トランプの山札を作成する処理
・山札をシャッフル処理
・山札からカードを引く処理
トランプの山札を作成する処理
作成する山札は通常のトランプの通り、
・クラブのA〜K(13枚)
・スペードのA〜K(13枚)
・ハートのA〜K(13枚)
・ダイヤのA〜K(13枚)
・ジョーカー(1枚)
計53枚の山札を作成します。
作成例は以下の通りです。
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 | # マークのリスト symbol_list = ['C', 'H', 'S', 'D'] # カードリスト card_list = ['joker'] # マークと数字を合体させる for symbol in symbol_list: for number in range(1, 14): # 11以上と1は置き換え if number == 1: card = symbol + 'A' elif number == 11: card = symbol + 'J' elif number == 12: card = symbol + 'Q' elif number == 13: card = symbol + 'K' else: # 10以下ならそのまま card = symbol + str(number) # カードをリストに追加 card_list.append(card) print(card_list) |
◆実行結果
1 | ['joker', 'CA', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10', 'CJ', 'CQ', 'CK', 'HA', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8', 'H9', 'H10', 'HJ', 'HQ', 'HK', 'SA', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9', 'S10', 'SJ', 'SQ', 'SK', 'DA', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D10', 'DJ', 'DQ', 'DK'] |
ジョーカーを先頭に53枚のカードリストができました。
山札をシャッフル処理
上記の処理で山札は作成できましたが、カードが順番通りに並んでいるので「shuffle()メソッド」を使ってシャッフルします。
以下のコードを追記します。
1 2 3 4 5 6 | import random # カードリストをシャッフルする random.shuffle(list) print(list) |
◆実行結果
1 | ['H10', 'D9', 'H5', 'H3', 'S5', 'S6', 'DA', 'D10', 'joker', 'D4', 'SQ', 'CK', 'H7', 'SJ', 'HJ', 'D2', 'DJ', 'HA', 'DQ', 'S3', 'D8', 'S4', 'D7', 'S9', 'DK', 'H8', 'S8', 'SK', 'C10', 'H4', 'C9', 'H6', 'H2', 'HQ', 'S7', 'D5', 'D6', 'S10', 'C8', 'C5', 'CQ', 'HK', 'C4', 'S2', 'CJ', 'C3', 'C2', 'SA', 'C7', 'C6', 'CA', 'H9', 'D3'] |
上記の通り、カードの位置がシャッフルされます。
山札からカードを引く処理
最後にシャッフルされた山札からカードを引く処理を作成します。
使用するのはpop()メソッドです。
popメソッドは引数にkeyを指定できます。
今回はリストの先頭からカードを取り出したいので0を指定。
1 2 | draw_card = card_list.pop(0) print(draw_card) |
◆複数枚のカードを引きたい場合
1 2 3 4 5 6 7 8 9 | draw_cards = [] # 5回ループする for i in range(0, 5): # リストの先頭からカードを取り出す draw_cards.append(card_list.pop(0)) print(card_list) print(draw_cards) |
◆実行結果
1 | ['CK', 'SQ', 'S7', 'S2', 'D6'] |
これまでの処理をまとめたコードは以下の通りです。
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 | import random # マークのリスト symbol_list = ['C', 'H', 'S', 'D'] # カードリスト card_list = ['joker'] # マークと数字を合体させる for symbol in symbol_list: for number in range(1, 14): # 11以上と1は置き換え if number == 1: card = symbol + 'A' elif number == 11: card = symbol + 'J' elif number == 12: card = symbol + 'Q' elif number == 13: card = symbol + 'K' else: # 10以下ならそのまま card = symbol + str(number) # カードをリストに追加 card_list.append(card) # カードをシャッフルする random.shuffle(card_list) # カードを引く前のリスト print(card_list) draw_cards = [] for i in range(0, 5): draw_cards.append(card_list.pop(0)) # カードを引いた後のリスト print(card_list) # 引いたカード print(draw_cards) |
◆実行結果
カードを引く前のカードリスト
['HJ', 'H7', 'D6', 'S8', 'C7', 'C3', 'D4', 'C9', 'H10', 'H5', 'SK', 'S9', 'D9', 'D10', 'joker', 'S6', 'C5', 'S3', 'H2', 'C10', 'H3', 'C2', 'D5', 'S5', 'CJ', 'HA', 'CA', 'S2', 'DA', 'DQ', 'CQ', 'CK', 'H8', 'C4', 'S7', 'DK', 'SJ', 'D7', 'SQ', 'S10', 'SA', 'D8', 'C6', 'C8', 'H4', 'HK', 'H9', 'S4', 'D3', 'HQ', 'DJ', 'H6', 'D2']
カードを引いた後のカードリスト
['C3', 'D4', 'C9', 'H10', 'H5', 'SK', 'S9', 'D9', 'D10', 'joker', 'S6', 'C5', 'S3', 'H2', 'C10', 'H3', 'C2', 'D5', 'S5', 'CJ', 'HA', 'CA', 'S2', 'DA', 'DQ', 'CQ', 'CK', 'H8', 'C4', 'S7', 'DK', 'SJ', 'D7', 'SQ', 'S10', 'SA', 'D8', 'C6', 'C8', 'H4', 'HK', 'H9', 'S4', 'D3', 'HQ', 'DJ', 'H6', 'D2']
引いたカード
['HJ', 'H7', 'D6', 'S8', 'C7']
上記の通り、card_list(山札)の先頭から値が抜き出され、引いたカード(draw_cards)のリストに追加されています。
終わりに
トランプなどカードゲームなどを作りたい場合は今回紹介したshuffle()メソッドを使うのがおすすめです。
トランプに限らずPythonでゲームを作りたい場合はrandomライブラリの理解は必須ですね。
randomライブラリにはshuffle()以外にも便利なメソッドが備わっているのでいろいろ試してみてください。
トランプゲームの具体的な作り方については「Pythonistaで作るポーカー作成講座(全5回)」で解説します。
PythonまとめTop>>Pythonでできること・勉強方法まとめ
『Pythonプログラミングのツボとコツがゼッタイにわかる本 最初からそう教えてくれればいいのに!』という参考書では簡単なブラックジャックゲームの作り方を紹介しています。
djangoと組み合わせたGUIのゲーム作成についても触れているのでWebアプリに興味がある方にもおすすめです。
簡単なトランプゲームを作ってみたいという方は是非読んでみてください。