關於撲克牌的一些討論——《Fluent Python 2》讀書筆記

codists發表於2022-05-14

一、說明

參考資料為維基百科的 Playing Card 詞條,非嚴肅性論證,只是對程式碼為什麼這麼寫做討論。

二、撲克牌的起源

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]

類名為“FrenchDeck”——看書的時候還好奇為什麼使用“French”呢,難道撲克牌是法國人發明的?根據維基百科的解釋: The most common type of playing card is that found in the French-suited,standard 52-card deck. 即最常見的紙牌型別是法國式的標準52張紙牌(注:程式碼裡沒包括“鬼牌”)。

三、花色順序

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]

花色順序為:spades(黑桃) > hearts(紅桃) > diamonds(方塊) > clubs(梅花)(注:可以按首字母順序進行記憶:s > h > d > c)。(注:花色的名稱和順序在不同的地方稍有不同,在我自己的家鄉是:spades(大花) > hearts(馬屁) > clubs(梅花) > diamonds(尖肝))

四、beer card

>>> beer_card = Card('7', 'diamonds')
>>> beer_card
Card(rank='7', suit='diamonds')

看到 "beer_card" 的時候,也是好奇為啥用 "beer" 呢?參考維基百科 Beer card 詞條,beer card 是對方塊7的非正式稱呼,至於遊戲怎麼玩,我不是很懂,這裡不贅述。

相關文章