您好,登錄后才能下訂單哦!
Python 中怎么實現隨機抽牌、排序、洗牌功能,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
創建一個紙牌類
一副撲克除去大王小王之外,剩下的 52 張紙牌以花色為基準(梅花、方塊、黑桃、紅心)可分為 4 組,每組有 13 張牌組成;因此可創建兩個列表一個來存儲花色,一個存儲 13 個字符;通過兩個列表之間的隨機組合來生成 52 張紙牌,
代碼如下:
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,J-A)和花色;
FranchDeck 類來建 52 張紙牌,其中有兩個特殊方法,len() 返回紙牌數量,__getitem__() 獲取 position(索引) 下的指定紙牌
# 用 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')
隨機抽取一張牌
這里借助 random 模塊實現 隨機 抽牌的功能
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 列表 ,除了上面提到的 index 定位之外,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最大。實現點數排序是比較簡單的,在創建點數列表時是以上面提到順序進行創建,排序時只需按照 點數所在 index 作為基準 進行排序即可,
除了 點數之外還有一個 花色也需要考慮,對于花色的話,需要建立一個映射基準(也可以稱之為權重),不同花色賦予不同值;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,創建 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 張撲克牌的可視化圖片,
創建一個 key:value 映射關系,對撲克牌字符與可視化圖片之間創建一個映射關系,如下圖所示,把此關系集存儲到指定數據庫或文件中,方便后面使用時可直接調用
看完上述內容,你們掌握Python 中怎么實現隨機抽牌、排序、洗牌功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。