基于Python制作一副撲克牌過(guò)程詳解
整理一下通過(guò)本文分享給大家, 該案例是通過(guò) Python 類(lèi)屬性創(chuàng)建一幅除去大王、小王之后的 52 張撲克牌,并實(shí)現(xiàn)隨機(jī)抽牌、排序、洗牌等功能;
創(chuàng)建一個(gè)紙牌類(lèi)
一副撲克除去大王小王之外,剩下的 52 張紙牌以花色為基準(zhǔn)(梅花、方塊、黑桃、紅心)可分為 4 組,每組有 13 張牌組成;因此可創(chuàng)建兩個(gè)列表一個(gè)來(lái)存儲(chǔ)花色,一個(gè)存儲(chǔ) 13 個(gè)字符;通過(guò)兩個(gè)列表之間的隨機(jī)組合來(lái)生成 52 張紙牌,
代碼如下:
代碼中通過(guò)collections.namedtuple模塊創(chuàng)建一個(gè)類(lèi)來(lái)表示一幅紙牌,['rank','suit']分別表示紙牌中的字符(2-10,J-A)和花色;
FranchDeck 類(lèi)來(lái)建 52 張紙牌,其中有兩個(gè)特殊方法,len() 返回紙牌數(shù)量,__getitem__() 獲取 position(索引) 下的指定紙牌
隨機(jī)抽取一張牌
這里借助 random 模塊實(shí)現(xiàn)隨機(jī)抽牌的功能
列表迭代、切片
因?yàn)?__getitem__ 方法 把 [] 操作交給 self._cards 列表 ,除了上面提到的 index 定位之外,F(xiàn)ranckDeck() 類(lèi)還可實(shí)現(xiàn)切片、迭代操作;
排序操作
常規(guī)來(lái)說(shuō),依據(jù)點(diǎn)數(shù)來(lái)判斷撲克牌的大小的話(huà),2最小,A最大。實(shí)現(xiàn)點(diǎn)數(shù)排序是比較簡(jiǎn)單的,在創(chuàng)建點(diǎn)數(shù)列表時(shí)是以上面提到順序進(jìn)行創(chuàng)建,排序時(shí)只需按照 點(diǎn)數(shù)所在 index 作為基準(zhǔn)進(jìn)行排序即可,
除了 點(diǎn)數(shù)之外還有一個(gè) 花色也需要考慮,對(duì)于花色的話(huà),需要建立一個(gè)映射基準(zhǔn)(也可以稱(chēng)之為權(quán)重),不同花色賦予不同值;Python 的字典類(lèi)型可以很方面地滿(mǎn)足我們的需要
代碼解讀:
1,代碼中利用字典加入了一個(gè)映射機(jī)制,黑桃為3,紅心為2,方塊次之,隨后梅花;2,創(chuàng)建 spades_high 函數(shù)來(lái)計(jì)算 每張牌的權(quán)重總值;3,利用 sorted() 函數(shù) key= spades_high 來(lái)作為排序基準(zhǔn),來(lái)實(shí)現(xiàn)撲克牌排序
洗牌操作
洗牌簡(jiǎn)單來(lái)說(shuō)就是對(duì)一副撲克牌重新進(jìn)行無(wú)規(guī)則地排序;正常情況random.shuffle 可以很方面地實(shí)現(xiàn)這個(gè)功能,但前提需要保證對(duì)象 滿(mǎn)足可變協(xié)議,這里 FranchDeck() 是不滿(mǎn)足的,直接使用的話(huà)會(huì)報(bào)錯(cuò):
對(duì)于上面問(wèn)題,只需要要把 此類(lèi)由不變變成可變的即可,創(chuàng)建一個(gè)函數(shù)賦值為 __setitem__ 屬性
這里抽取到打亂前后紙牌的前 5 個(gè)元素,已經(jīng)實(shí)現(xiàn)洗牌的功能了!
根據(jù)以上的代碼部分,可以進(jìn)一步開(kāi)發(fā), 提前設(shè)計(jì)好 54 張撲克牌的可視化圖片,
創(chuàng)建一個(gè) key:value 映射關(guān)系,對(duì)撲克牌字符與可視化圖片之間創(chuàng)建一個(gè)映射關(guān)系,如下圖所示,把此關(guān)系集存儲(chǔ)到指定數(shù)據(jù)庫(kù)或文件中,后面使用后可直接調(diào)用
按照上面的進(jìn)階玩法就可以創(chuàng)建一個(gè)基于Python開(kāi)發(fā)撲克牌小程序!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django實(shí)現(xiàn)WebSocket在線聊天室功能(channels庫(kù))
本文基于channels庫(kù)Django實(shí)現(xiàn)WebSocket在線聊天室功能,包括安裝及創(chuàng)建django項(xiàng)目的全過(guò)程,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09在python tkinter界面中添加按鈕的實(shí)例
今天小編就為大家分享一篇在python tkinter界面中添加按鈕的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python自定義命令行參數(shù)選項(xiàng)和解析器
這篇文章主要介紹了Python自定義命令行參數(shù)選項(xiàng)和解析器,本文主要使用的方法為argparse.ArgumentParser(),此模塊可以讓人輕松編寫(xiě)用戶(hù)友好的命令行接口,程序定義它需要的參數(shù),需要的朋友可以參考下2023-07-07NetWorkX使用方法及nx.draw()相關(guān)參數(shù)解讀
這篇文章主要介紹了NetWorkX使用方法及nx.draw()相關(guān)參數(shù)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Pycharm中出現(xiàn)ImportError:DLL load failed:找不到指定模塊的解決方法
這篇文章主要介紹了Pycharm中出現(xiàn)ImportError:DLL load failed:找不到指定模塊的解決方法,需要的朋友可以參考下2019-09-09matplotlib部件之矩形選區(qū)(RectangleSelector)的實(shí)現(xiàn)
這篇文章主要介紹了matplotlib部件之矩形選區(qū)(RectangleSelector)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python使用CMD模塊更優(yōu)雅的運(yùn)行腳本
這篇文章主要介紹了Python使用CMD模塊更優(yōu)雅的運(yùn)行腳本的方法,實(shí)例分析了Python中cmd模塊的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05