基於Python製作一副撲克牌過程詳解
整理一下通過本文分享給大家, 該案例是通過 Python 類屬性建立一幅除去大王、小王之後的 52 張撲克牌,並實現隨機抽牌、排序、洗牌等功能;
建立一個紙牌類
一副撲克除去大王小王之外,剩下的 52 張紙牌以花色為基準(梅花、方塊、黑桃、紅心)可分為 4 組,每組有 13 張牌組成;因此可建立兩個列表一個來儲存花色,一個儲存 13 個字元;通過兩個列表之間的隨機組合來生成 52 張紙牌,
程式碼如下:
程式碼中通過collections.namedtuple模組建立一個類來表示一幅紙牌,['rank','suit']分別表示紙牌中的字元(2-10,J-A)和花色;
FranchDeck 類來建 52 張紙牌,其中有兩個特殊方法,len() 返回紙牌數量,__getitem__() 獲取 position(索引) 下的指定紙牌
隨機抽取一張牌
這裡藉助 random 模組實現隨機抽牌的功能
列表迭代、切片
因為 __getitem__ 方法 把 [] 操作交給 self._cards 列表 ,除了上面提到的 index 定位之外,FranckDeck() 類還可實現切片、迭代操作;
排序操作
常規來說,依據點數來判斷撲克牌的大小的話,2最小,A最大。實現點數排序是比較簡單的,在建立點數列表時是以上面提到順序進行建立,排序時只需按照 點數所在 index 作為基準進行排序即可,
除了 點數之外還有一個 花色也需要考慮,對於花色的話,需要建立一個對映基準(也可以稱之為權重),不同花色賦予不同值;Python 的字典型別可以很方面地滿足我們的需要
程式碼解讀:
1,程式碼中利用字典加入了一個對映機制,黑桃為3,紅心為2,方塊次之,隨後梅花;2,建立 spades_high 函式來計算 每張牌的權重總值;3,利用 sorted() 函式 key= spades_high 來作為排序基準,來實現撲克牌排序
洗牌操作
洗牌簡單來說就是對一副撲克牌重新進行無規則地排序;正常情況random.shuffle 可以很方面地實現這個功能,但前提需要保證物件 滿足可變協議,這裡 FranchDeck() 是不滿足的,直接使用的話會報錯:
對於上面問題,只需要要把 此類由不變變成可變的即可,建立一個函式賦值為 __setitem__ 屬性
這裡抽取到打亂前後紙牌的前 5 個元素,已經實現洗牌的功能了!
根據以上的程式碼部分,可以進一步開發, 提前設計好 54 張撲克牌的視覺化圖片,
建立一個 key:value 對映關係,對撲克牌字元與視覺化圖片之間建立一個對映關係,如下圖所示,把此關係集儲存到指定資料庫或檔案中,後面使用後可直接呼叫
按照上面的進階玩法就可以建立一個基於Python開發撲克牌小程式!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。