用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
生活随笔
收集整理的這篇文章主要介紹了
用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、namedtuple:命名元組,可以創(chuàng)建一個沒有方法只有屬性的類
from collections import namedtuple card = namedtuple('card',['rank','suit']) # rank 牌面大小,suit牌面的花色 # card其實就是namedtuple創(chuàng)建的一個類,其屬性就是rank和suit c1 = card(2,'紅心 ') # c1是實例化的對象 print(c1) print(c1.suit)運行結(jié)果:
card(rank=2, suit='紅心 ') 紅心22、按照循環(huán)順序,通過對象[索引]任意取牌
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' from collections import namedtuple Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色 class FranchDeck:ranks = [str(n) for n in range(2,11)]+list('JQKA')suits = ['紅心','方板','梅花','黑桃']def __init__(self):self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]# 嵌套循環(huán),每循環(huán)一次都拿到一張牌,并且都會存到一個列表中,這個里面的牌是按照循環(huán)的順序的def __getitem__(self, item):return self._cards[item]deck = FranchDeck() print(deck[10]) # 出現(xiàn)對象加索引的的取法就是觸發(fā)__getitem__方法運行結(jié)果:
Card(rank='4', suit='梅花')Process finished with exit code 03、choice實現(xiàn)隨機抽取一張紙牌的過程
from collections import namedtuple Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色 class FranchDeck:ranks = [str(n) for n in range(2,11)]+list('JQKA')suits = ['紅心','方板','梅花','黑桃']def __init__(self):self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]# 嵌套循環(huán),每循環(huán)一次都拿到一張牌,并且都會存到一個列表中,這個里面的牌是按照循環(huán)的順序的def __getitem__(self, item):return self._cards[item]def __len__(self):return len(self._cards)# 實現(xiàn)按照循環(huán)循序抽取對應(yīng)的紙牌 deck = FranchDeck() print(deck[10]) # 出現(xiàn)對象加索引的的取法就是觸發(fā)__getitem__方法# 實現(xiàn)隨機抽取一張牌的過程 from random import choice print(choice(deck)) # 注意:# choice能夠?qū)崿F(xiàn)隨機抽取紙牌,必須得依賴__len__方法,如果前面沒有定義__len__方法就會報錯, # 即只要用到choice就會觸發(fā)__len__方法運行結(jié)果:
Card(rank='A', suit='梅花')Process finished with exit code 04、shuffle實現(xiàn)隨機洗牌的過程
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' from collections import namedtuple Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色 class FranchDeck:ranks = [str(n) for n in range(2,11)]+list('JQKA')suits = ['紅心','方板','梅花','黑桃']def __init__(self):self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]# 嵌套循環(huán),每循環(huán)一次都拿到一張牌,并且都會存到一個列表中,這個里面的牌是按照循環(huán)的順序的def __getitem__(self, item):return self._cards[item]def __len__(self):return len(self._cards) # 傳紙牌的長度,是從這么多張紙牌里面抽取def __setitem__(self, key, value): self._cards[key] = valuedeck = FranchDeck() print(deck[10]) # 通過shuffle和__setitem__實現(xiàn)隨機洗牌的過程,如果前面沒有定義__setitem__方法同樣會報錯 # 因為隨機洗牌的過程索引對應(yīng)的牌就會發(fā)生改變,所以只能通過__setitem__去改變from random import shuffle shuffle(deck) print(deck[10])運行結(jié)果:
Card(rank='4', suit='梅花') Card(rank='K', suit='紅心')總結(jié):
以上紙牌游戲?qū)崿F(xiàn)隨機抽牌,洗牌的過程,僅僅只是用了內(nèi)置的方法,并沒有用我們自己定 義的方法就實現(xiàn)了,需要注意的是: __getitem__與對象[索引],__len__與choice,__setitem__與shuffle必須同時結(jié)合使用
內(nèi)置函數(shù),內(nèi)置模塊,內(nèi)置的基礎(chǔ)類型<---->類的內(nèi)置方法,比如:== <--->__eq__,len()<--->__len__5、總代碼----紙牌游戲隨機取牌以及洗牌的過程
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' # 按照循環(huán)順序,通過對象[索引]任意取牌 # choice實現(xiàn)隨機抽取一張紙牌的過程 # shuffle實現(xiàn)隨機洗牌的過程 import json from collections import namedtuple Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色 class FranchDeck:ranks = [str(n) for n in range(2,11)]+list('JQKA')suits = ['紅心','方板','梅花','黑桃']def __init__(self):self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]# 嵌套循環(huán),每循環(huán)一次都拿到一張牌,并且都會存到一個列表中,這個里面的牌是按照循環(huán)的順序的def __getitem__(self, item): # 通過對象[索引]進(jìn)行觸發(fā)return self._cards[item]def __len__(self): # 通過choice進(jìn)行觸發(fā)return len(self._cards) # 傳紙牌的長度,是從這么多張紙牌里面抽取def __setitem__(self, key, value): # 通過shuffle進(jìn)行觸發(fā)self._cards[key] = valuedef __str__(self):return json.dumps(self._cards,ensure_ascii=False) # 序列化deck = FranchDeck()# 通過對象[索引]和__getitem__實現(xiàn)按照循環(huán)循序抽取對應(yīng)的紙牌 print(deck[10]) # 出現(xiàn)對象加索引的的取法就是觸發(fā)__getitem__方法# 通過choice和__len__實現(xiàn)隨機抽取一張牌的過程 from random import choice print(choice(deck)) # choice能夠?qū)崿F(xiàn)隨機抽取紙牌,必須得依賴內(nèi)置的__len__方法,如果前面沒有定義__len__方法就會報錯 print(deck[10])# 通過shuffle和__setitem__實現(xiàn)隨機洗牌的過程 from random import shuffle shuffle(deck) print(deck[10]) print(deck) # 需要進(jìn)行序列化才可以print(deck[:5]) # 直接利用對象進(jìn)行切片運行結(jié)果:
Card(rank='4', suit='梅花') Card(rank='A', suit='紅心') Card(rank='4', suit='梅花') Card(rank='A', suit='梅花') [["6", "梅花"], ["9", "梅花"], ["3", "梅花"], ["9", "方板"], ["4", "方板"], ["Q", "紅心"], ["7", "紅心"], ["J", "黑桃"], ["8", "梅花"], ["J", "紅心"], ["A", "梅花"], ["6", "黑桃"], ["Q", "方板"], ["4", "梅花"], ["10", "紅心"], ["A", "紅心"], ["4", "紅心"], ["7", "方板"], ["5", "黑桃"], ["K", "黑桃"], ["2", "方板"], ["Q", "梅花"], ["2", "黑桃"], ["8", "黑桃"], ["J", "梅花"], ["A", "黑桃"], ["2", "紅心"], ["6", "紅心"], ["5", "紅心"], ["J", "方板"], ["10", "方板"], ["K", "方板"], ["K", "紅心"], ["3", "紅心"], ["8", "紅心"], ["8", "方板"], ["5", "方板"], ["K", "梅花"], ["9", "紅心"], ["5", "梅花"], ["7", "黑桃"], ["3", "方板"], ["Q", "黑桃"], ["2", "梅花"], ["7", "梅花"], ["4", "黑桃"], ["9", "黑桃"], ["10", "梅花"], ["6", "方板"], ["3", "黑桃"], ["10", "黑桃"], ["A", "方板"]] [Card(rank='6', suit='梅花'), Card(rank='9', suit='梅花'), Card(rank='3', suit='梅花'), Card(rank='9', suit='方板'), Card(rank='4', suit='方板')]總結(jié)
以上是生活随笔為你收集整理的用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用flex布局在父元素和子元素宽高不明
- 下一篇: 量子点对垒OLED,到底哪家强?