Pythonはトランプのデッキを作ります、興味深いケースです!

記事がよく書かれていて、ブログ記事のデータが必要な場合は、公式アカウントに注意してください:[Z氏のメモ]、50以上のPython電子書籍と200G以上の高品質のビデオ資料が用意されていますあなた。舞台裏の返信キーワード:1024が利用可能

より興味深い、「流暢なPython」に関するこの記事を共有するための整頓された例を見る前に、ケースは、52枚のトランプの後にKing、Wangを削除し、ランダムドローカードを実現するためのPythonクラス属性によって作成されました。並べ替え、シャッフル、その他の機能。

カードクラスを作成する

キングとキングを除いて、残りの52枚のカードはスーツ(クラブ、ダイヤ、スペード、ハート)に基づいて4つのグループに分けることができ、各グループは13枚のカードで構成されているため、2つのリストを作成できます。 1つは13文字を格納し、52枚のカードは2つのリストのランダムな組み合わせによって生成されます。

コードは次のように表示されます。

import collections

Card = collections.namedtuple("Card",['rank','suit'])

class FrenchDeck:
    ranks = [str(n) for n in range(2,11) ] + list("JQKA")
    suits = 'spades diamonds clubs hearts'.split()
    
    def __init__(self):
        self._cards = [Card(rank,suit) for suit in self.suits 
                       for rank in self.ranks]
    
    def __len__(self):
        return len(self._cards)
    
    def __getitem__(self, position):
        return self._cards[position]

collections.namedtupleカードモジュール、[’rank','suit']それぞれカード文字(2-10、JA)と色を表すクラスを作成してコーディングします。

FranchDeckクラスは52枚のカードを作成するために使用され、そのうち2つの特別なメソッドがあります。len()はカードの数を返し、__ getitem __()は指定されたカードを位置(インデックス)の下に取得します。

# 用 Card 创建一张纸牌
beer_card = Card('7','diamonds')
print(beer_card) # 打印输出

deck = FrenchDeck()
print('len is -----')
print(len(deck))

# 返回首张 纸牌
print(deck[0])

# 返回最后一张纸牌
print(deck[-1])


# Output

Card(rank='7', suit='diamonds')
len is -----
52
Card(rank='2', suit='spades')
Card(rank='A', suit='hearts')

ランダムにカードを引く

このモジュールでランダムランダム描画機能を実装します

from random import choice
# 利用 random.choice 随机抽取一张纸牌
print("random choice -----------")
print(choice(deck))

print(choice(deck))
print(choice(deck))

# Output

random choice -----------
Card(rank='8', suit='clubs')
Card(rank='5', suit='hearts')
Card(rank='5', suit='spades')

リストの反復、スライス

__getitem__メソッドは[]操作をself._cardsリストに渡すため、上記のインデックスの配置に加えて、FranckDeck()クラスはスライス操作と反復操作も実装できます。

# 切片操作

print('\nslice is --')
print(deck[:3])
print(deck[8:10])

print('\n迭代操作')
for card in deck[:3]:
    print(card)

print('\n 反迭代操作')
for card in reversed(deck[:3]):
    print(card)
    

# Output

slice is --
[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
[Card(rank='10', suit='spades'), Card(rank='J', suit='spades')]

迭代操作
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')

 反迭代操作
Card(rank='4', suit='spades')
Card(rank='3', suit='spades')
Card(rank='2', suit='spades')

ソート操作

従来、トランプの大きさをポイント数で判断すると、2が一番小さく、Aが一番大きい。ポイントの並べ替えは比較的簡単に実現できます。ポイントリストを作成するときは、上記の順序で作成します。並べ替えるときは、ポイントのインデックスをベンチマークとして並べ替えるだけです

ポイントに加えて、考慮する必要のあるスーツもあります。スーツの場合、マッピングの基礎(重みとも呼ばれます)を確立する必要があり、さまざまなスーツにさまざまな値が割り当てられます。Pythonの辞書タイプはさまざまな方法でニーズを満たすことができます。

# 创建一个字典映射
suit_values = dict(
    spades = 3,
    hearts = 2,
    diamonds = 1,
    clubs = 0
)
def spades_high(card):
    rank_value = FrenchDeck.ranks.index(card.rank) # 索引查询
    return rank_value*len(suit_values) + suit_values[card.suit] # index* 4 + suit.value

print('\nSorted ------------------')
# 利用 key = lambda 机制对列表进行排序
for card in sorted(deck,key = spades_high,reverse= True):
    print(card)
    
# Output

Sorted ------------------
Card(rank='A', suit='spades')
Card(rank='A', suit='hearts')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='clubs')
Card(rank='K', suit='spades')
Card(rank='K', suit='hearts')
Card(rank='K', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='Q', suit='spades')
Card(rank='Q', suit='hearts')
Card(rank='Q', suit='diamonds')

コードの解釈:

  • 1.コードは辞書を使用してマッピングメカニズムを追加します。スペードは3、ハートは2、正方形が2番目、次にクラブが続きます。
  • 2. spades_high関数を作成して、各カードの総重量を計算します。
  • 3.ソートベンチマークとしてsorted()関数key = spades_highを使用して、トランプのソートを実現します。

シャッフル操作

簡単に言うと、シャッフルとはトランプのデッキを不規則に並べ替えることです。通常の状況では、random.shuffleは多くの面でこの機能を実現できますが、オブジェクトが可変プロトコルを満たしていることを前提とする必要があります。ここで、FranchDeck()は満足していません。直接使用すると、エラーが報告されます。

from random import shuffle
print('-------------------\n'*3)
deck  =FrenchDeck()
shuffle(deck)


# Output


    x[i], x[j] = x[j], x[i]
TypeError: 'FrenchDeck' object does not support item assignment

上記の問題の場合、このような変更を行うだけで変数なり __ setitem__プロパティに割り当てられた関数が作成されます。

from random import shuffle
print('-------------------\n'*3)


def set_deck(deck,position,card):
    deck._cards[position] = card

deck1 = FrenchDeck()
print('打乱前\n')
print(deck1[:5])
FrenchDeck.__setitem__ = set_deck
shuffle(deck1)

# Output


打乱前
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')
Card(rank='5', suit='spades')
Card(rank='6', suit='spades')

打乱后:
Card(rank='6', suit='diamonds')
Card(rank='4', suit='hearts')
Card(rank='Q', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='8', suit='spades')

ここでは、カードの混乱が達成される前後の最初の5つの要素に描かれています!のシャッフル機能。

上記のコード部分によれば、それをさらに発展させることができ、54枚のトランプの視覚的画像を事前に設計することができる。

Snipaste_2020-09-27_00-59-22.png

次の図に示すように、キーと値のマッピング関係を作成し、トランプのキャラクターとビジュアル画像の間にマッピング関係を作成し、この関係セットを指定したデータベースまたはファイルに保存して、使用後すぐに呼び出します。

Snipaste_2020-09-27_01-06-46.png

上記の高度なゲームプレイに従うことで、Pythonに基づいてトランプを開発するための小さなプログラムを作成できます!

さて、上記はこの記事の全内容です。最後に、読んでいただきありがとうございます!

おすすめ

転載: blog.csdn.net/weixin_42512684/article/details/108820533