python實戰之德州撲克第一步-發牌
一、前言
最近小編在做一個關於德州撲克的小遊戲,當然已經做完瞭,才寫的一系列文章來記錄一下自己的開發經歷
一系列文章主要包括:
1.發牌 2.判斷牌型 3.比較牌的大小 4.開始遊戲 5.總結
二、說明
制作的德州撲克僅供參考,提供源碼,源碼可運行
可滿足基本操作,另外還有一些小功能,可先自行研究
和真正的德州撲克遊戲相比,九牛一毛,可用來練練手
附:本源碼可優化,如果有實力,有時間,可盡情修改代碼
註:本源碼在pycharm寫的,使用python語言
每篇文章最後都有相關源碼
三、準備工作
開始做之前我們必須瞭解德州撲克的基本規則!
簡單說一下:
五張牌組合由大到小依次為:
皇傢同花順>同花順>四條>葫蘆>同花>順子>三條>兩隊>一對>高牌
皇傢同花順:同一花色最大的順子
同花順:同一花色的順子
四條:四張相同+1個單張
葫蘆:三張相同+1對
同花:5張牌花色相同
順子:花色不同的順子
三條:三張相同+2單張
兩對:2對+1單
一對:1對+3單張
高牌:五個單張牌
註:組合相同則比較牌大小(皇傢同花順除外)A1234為最小的順子
四、開始工作
首先需要一副撲克牌,代碼很簡單(如下):
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 ']
按照正常思維,發牌之前都是先洗牌的,所以接下來就是洗牌瞭,先上代碼:
random.shuffle(pai)
說明使用瞭random庫裡面的shuffle()函數,此函數的作用就是打亂順序
洗好牌之後就是發牌瞭,小編使用一個二維列表來存儲所有玩傢的牌,可能就有人好奇瞭,二維列表咋存儲,首先我們需要知道二維數組的結構,一個列表裡面好幾個列表,類似於a=[[],[],[]…,[]],我們可以往裡面添加元素,就拿a這個二維列表來說,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
這個函數可以給n個人發m張牌
做一個簡單說明:
拷貝一副牌(為什麼要拷貝,見下方解釋1)
洗牌
創建一個number行num列的二維數組players,方便存儲(為啥要創建,見解釋2)
雙重循環,給players賦值(發牌)
解釋1:因為實現生成瞭一副牌,如果直接對原來生成的牌,進行操作,會破壞原來的牌,假如,需要給1個人發10萬次牌,來統計牌型的話,就需要創建100萬次的牌,隨著發牌次數的增加,所創建的牌占的內存會越來越大,運行也會越來越慢,導致等待幾分鐘或幾十分鐘才會輸出結果,進行一個深拷貝,就是賦值一副牌,復制一副牌的時間和空間花銷,遠遠小於創建一副牌。通過實踐可知,10萬次發牌,通過不斷創建牌時間花銷大約為91秒,通過深拷貝的花銷時間為大約為6秒,對比一下,差距多麼大!
解釋2:我們需要一個容器來存儲玩傢的牌,可以使用列表,字典,使用列表的話就是二維列表(前面已經說明),是用字典的話,key為玩傢i,value為對應玩傢的牌。使用列表,字典的區別不大隻是操作上略有不同,小編使用列表存儲玩傢的牌
解釋3: players[numb][n]=pais.pop(random.randint(0,len(pais)-1)) 這一行代碼,就是從一副牌中拿一張牌,存到 players[numb][n]中,使用random.randint(0,len(pais)-1)是為瞭增加隨機性,最大可能的隨即發牌,達到一個公平的效果,如果函數不理解的話,可自行搜索,也可查看小編的相關文章
當你看到這裡就說明這一篇文章就馬上完結瞭!
以下內容為個人觀點,可跳過,查看下一篇文章
發牌程序可以使用很多方法來操作的,例如字典
隻需要創建一副撲克牌,洗牌,發牌。完成這三步就成功瞭
非常感謝,非常感謝,非常感謝!
重要的事說三遍!
更過相關文章可關註我,會不斷更新的哦!
六、發牌完整源碼
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
到此這篇關於python實戰之德州撲克第一步-發牌的文章就介紹到這瞭,更多相關python實現德州撲克發牌內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- None Found