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!