python實(shí)戰(zhàn)之德州撲克第一步-發(fā)牌
一、前言
最近小編在做一個(gè)關(guān)于德州撲克的小游戲,當(dāng)然已經(jīng)做完了,才寫的一系列文章來記錄一下自己的開發(fā)經(jīng)歷
點(diǎn)擊鏈接查看其他文章
python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型
python實(shí)戰(zhàn)之德州撲克第三步-比較大小
一系列文章主要包括:
1.發(fā)牌 2.判斷牌型 3.比較牌的大小 4.開始游戲 5.總結(jié)
二、說明
制作的德州撲克僅供參考,提供源碼,源碼可運(yùn)行
可滿足基本操作,另外還有一些小功能,可先自行研究
和真正的德州撲克游戲相比,九牛一毛,可用來練練手
附:本源碼可優(yōu)化,如果有實(shí)力,有時(shí)間,可盡情修改代碼
注:本源碼在pycharm寫的,使用python語言
每篇文章最后都有相關(guān)源碼
三、準(zhǔn)備工作
開始做之前我們必須了解德州撲克的基本規(guī)則!
簡單說一下:
五張牌組合由大到小依次為:
皇家同花順>同花順>四條>葫蘆>同花>順子>三條>兩隊(duì)>一對>高牌
皇家同花順:同一花色最大的順子
同花順:同一花色的順子
四條:四張相同+1個(gè)單張
葫蘆:三張相同+1對
同花:5張牌花色相同
順子:花色不同的順子
三條:三張相同+2單張
兩對:2對+1單
一對:1對+3單張
高牌:五個(gè)單張牌
注:組合相同則比較牌大?。ɑ始彝槼猓〢1234為最小的順子
四、開始工作
首先需要一副撲克牌,代碼很簡單(如下):
color=["♥", "♠", "♣", "♦"] value=["2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10","J ","Q ","K ","A "] pai = [co+va+"" for co,va in product(color,value)]
怎么樣!很簡單吧!這樣就生成了一副不含鬼王的52張牌
五、效果
['♥2 ', '♥3 ', '♥4 ', '♥5 ', '♥6 ', '♥7 ', '♥8 ', '♥9 ', '♥10', '♥J ', '♥Q ', '♥K ', '♥A ', '♠2 ', '♠3 ', '♠4 ', '♠5 ', '♠6 ', '♠7 ', '♠8 ', '♠9 ', '♠10', '♠J ', '♠Q ', '♠K ', '♠A ', '♣2 ', '♣3 ', '♣4 ', '♣5 ', '♣6 ', '♣7 ', '♣8 ', '♣9 ', '♣10', '♣J ', '♣Q ', '♣K ', '♣A ', '♦2 ', '♦3 ', '♦4 ', '♦5 ', '♦6 ', '♦7 ', '♦8 ', '♦9 ', '♦10', '♦J ', '♦Q ', '♦K ', '♦A ']
按照正常思維,發(fā)牌之前都是先洗牌的,所以接下來就是洗牌了,先上代碼:
random.shuffle(pai)
說明使用了random庫里面的shuffle()函數(shù),此函數(shù)的作用就是打亂順序
洗好牌之后就是發(fā)牌了,小編使用一個(gè)二維列表來存儲所有玩家的牌,可能就有人好奇了,二維列表咋存儲,首先我們需要知道二維數(shù)組的結(jié)構(gòu),一個(gè)列表里面好幾個(gè)列表,類似于a=[[],[],[]…,[]],我們可以往里面添加元素,就拿a這個(gè)二維列表來說,a[i]存儲的是每名玩家的牌,例如a[0]存儲的是第一位玩家的牌,以此類推,有多少玩家i就有多大,羅嗦了這么多,瞅一眼代碼:
def deal_cards(number,num): pais=copy.deepcopy(pai) random.shuffle(pais) # 洗牌 players=[list() for x in range(number)] for pl in range(len(players)): players[pl]=[" " for x in range(num)] for numb in range(number):#同一副牌 n=0 while n<num: players[numb][n]=pais.pop(random.randint(0,len(pais)-1)) n+=1 return players
這個(gè)函數(shù)可以給n個(gè)人發(fā)m張牌
做一個(gè)簡單說明:
拷貝一副牌(為什么要拷貝,見下方解釋1)
洗牌
創(chuàng)建一個(gè)number行num列的二維數(shù)組players,方便存儲(為啥要?jiǎng)?chuàng)建,見解釋2)
雙重循環(huán),給players賦值(發(fā)牌)
解釋1:因?yàn)閷?shí)現(xiàn)生成了一副牌,如果直接對原來生成的牌,進(jìn)行操作,會破壞原來的牌,假如,需要給1個(gè)人發(fā)10萬次牌,來統(tǒng)計(jì)牌型的話,就需要?jiǎng)?chuàng)建100萬次的牌,隨著發(fā)牌次數(shù)的增加,所創(chuàng)建的牌占的內(nèi)存會越來越大,運(yùn)行也會越來越慢,導(dǎo)致等待幾分鐘或幾十分鐘才會輸出結(jié)果,進(jìn)行一個(gè)深拷貝,就是賦值一副牌,復(fù)制一副牌的時(shí)間和空間花銷,遠(yuǎn)遠(yuǎn)小于創(chuàng)建一副牌。通過實(shí)踐可知,10萬次發(fā)牌,通過不斷創(chuàng)建牌時(shí)間花銷大約為91秒,通過深拷貝的花銷時(shí)間為大約為6秒,對比一下,差距多么大!
解釋2:我們需要一個(gè)容器來存儲玩家的牌,可以使用列表,字典,使用列表的話就是二維列表(前面已經(jīng)說明),是用字典的話,key為玩家i,value為對應(yīng)玩家的牌。使用列表,字典的區(qū)別不大只是操作上略有不同,小編使用列表存儲玩家的牌
解釋3: players[numb][n]=pais.pop(random.randint(0,len(pais)-1)) 這一行代碼,就是從一副牌中拿一張牌,存到 players[numb][n]中,使用random.randint(0,len(pais)-1)是為了增加隨機(jī)性,最大可能的隨即發(fā)牌,達(dá)到一個(gè)公平的效果,如果函數(shù)不理解的話,可自行搜索,也可查看小編的相關(guān)文章
當(dāng)你看到這里就說明這一篇文章就馬上完結(jié)了!
以下內(nèi)容為個(gè)人觀點(diǎn),可跳過,查看下一篇文章
發(fā)牌程序可以使用很多方法來操作的,例如字典
只需要?jiǎng)?chuàng)建一副撲克牌,洗牌,發(fā)牌。完成這三步就成功了
非常感謝,非常感謝,非常感謝!
重要的事說三遍!
更過相關(guān)文章可關(guān)注我,會不斷更新的哦!
六、發(fā)牌完整源碼
import copy import random from itertools import product color=["♥", "♠", "♣", "♦"] value=["2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10","J ","Q ","K ","A "] pai = [co+va+"" for co,va in product(color,value)] print(pai) random.shuffle(pai) def deal_cards(number,num): pais=copy.deepcopy(pai) random.shuffle(pais) # 洗牌 players=[list() for x in range(number)] for pl in range(len(players)): players[pl]=[" " for x in range(num)] for numb in range(number):#同一副牌 n=0 while n<num: players[numb][n]=pais.pop(random.randint(0,len(pais)-1)) n+=1 return players
到此這篇關(guān)于python實(shí)戰(zhàn)之德州撲克第一步-發(fā)牌的文章就介紹到這了,更多相關(guān)python實(shí)現(xiàn)德州撲克發(fā)牌內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows下java、javaw、javaws以及jvm.dll等進(jìn)程的區(qū)別
這篇文章主要介紹了Windows下java、javaw、javaws以及jvm.dll等進(jìn)程的區(qū)別,本文分別講解了它們的作用并給出代碼實(shí)例,最后做出了區(qū)別總結(jié),需要的朋友可以參考下2015-03-03使用Java創(chuàng)建數(shù)據(jù)透視表并導(dǎo)出為PDF的方法
數(shù)據(jù)透視分析是一種強(qiáng)大的工具,可以幫助我們從大量數(shù)據(jù)中提取有用信息并進(jìn)行深入分析,本文將介紹如何使用Java來構(gòu)建PivotTable以及實(shí)現(xiàn)數(shù)據(jù)透視分析,并將其導(dǎo)出為PDF2023-10-10SpringBoot+MyBatis實(shí)現(xiàn)登錄案例
前端時(shí)間在網(wǎng)上看到有朋友在學(xué)習(xí)springboot項(xiàng)目的搭建過程,今天就抽空給大家分享一個(gè)案例幫助大家學(xué)習(xí)SpringBoot+MyBatis實(shí)現(xiàn)登錄功能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-06-06Java 實(shí)戰(zhàn)練手項(xiàng)目之酒店管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)酒店管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11SprinBoot整合Quart實(shí)現(xiàn)定時(shí)調(diào)度的示例代碼
這篇文章主要介紹了SprinBoot整合Quart實(shí)現(xiàn)定時(shí)調(diào)度的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10java中實(shí)現(xiàn)map與對象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)
這篇文章主要介紹了java中實(shí)現(xiàn)map與對象相互轉(zhuǎn)換的幾種實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07