iT邦幫忙

3

【撲克牌遊戲基礎】用python打造一副撲克牌並實作洗牌

今天要用python寫一副簡單的撲克牌,
我們想用物件導向的概念,
分別定義類別「單張撲克牌」與「一副撲克牌」,
而「一副撲克牌」就由52張「單張撲克牌」所組成

類別- 單張撲克牌

一張撲克牌由「點數」和「花色」兩個要素所組成,
因此class的初始化可以這樣寫

class Card():
    def __init__(self, value, suit):
        self.value=value
        self.suit=suit

表示輸入一張牌的「點數」和「花色」可以創建一張牌

類別- 一副撲克牌

在這個類別中,我們想要創建標準的52張撲克牌,
花色由「紅心、黑桃、方塊、梅花」所組成,
我們可以用英文「'h', 's', 'd', 'c'」("Hearts", "Spades", "Diamonds", "Clubs")來表示

點數的範圍是1~13,但由於通常撲克牌遊戲「Ace」比其它點數來的大,
把「Ace」這張牌的點數當作14對我們也許有好處,
因此點數的範圍可設為2~14

class StardardDeck():
    def __init__(self):
        self.cards = [Card(value, suit) for value in range(2,15) for suit in 'hsdc']

    def shuffule(self):
        random.shuffle(self.cards)
        
    def draw(self):
        return self.cards.pop(0)

另外實作兩個函數- shuffule()draw()
shuffule()表示把牌洗亂,
要實現這個函數相當簡單,
python內建模組random已經有shuffule函數,
能夠將陣列的順序打亂

draw()表示從牌組的上方抽一張牌
這樣我們就打造出一副牌了

列印結果

我們希望可以很方便的用print()函數印出一張牌或一副牌來測試我們程式有沒有寫對,
因此我們再類別中可以定義一個__repr__()方法,
意思是物件被print()函數呼叫時會顯示的字串,
比如說如果一張牌是「梅花8」,我們就視覺化的印出「8♣」,
又比如說如果一張牌是「紅心K」就視覺化的印出「K♡」(另外,習慣上10可當作T, Ten的意思)

我們在類別- 單張撲克牌中加入__repr__函數如下:

class Card():
    def __init__(self, value, suit):
        self.value=value
        self.suit=suit

    def __repr__(self):
        suits = {"h":"♡", "s":"♠", "d":"♢", "c":"♣"}
        values = {**{i:str(i) for i in range(2,10)}, 
        **{10:'T', 11:'J',12:'Q', 13:'K', 14:'A'}}
        return values[self.value] + suits[self.suit]

在類別- 一副撲克牌中加入__repr__函數如下:

class StardardDeck():
    def __init__(self):
        self.cards = [Card(value, suit) for value in range(2,15) for suit in 'hsdc']
                
    def __repr__(self):
        return ' '.join([card.__repr__() for card in self.cards])

    def shuffule(self):
        random.shuffle(self.cards)
        
    def draw(self):
        return self.cards.pop(0)

意思是說印出一副撲克牌相當於把每張撲克牌都印出來

完整範例程式碼

import random

class Card():
    def __init__(self, value, suit):
        self.value=value
        self.suit=suit

    def __repr__(self):
        suits = {"h":"♡", "s":"♠", "d":"♢", "c":"♣"}
        values = {**{i:str(i) for i in range(2,10)}, 
        **{10:'T', 11:'J',12:'Q', 13:'K', 14:'A'}}
        return values[self.value] + suits[self.suit]

    
class StardardDeck():
    def __init__(self):
        self.cards = [Card(value, suit) for value in range(2,15) for suit in 'hsdc']
                
    def __repr__(self):
        return ' '.join([card.__repr__() for card in self.cards])

    def shuffule(self):
        random.shuffle(self.cards)
        
    def draw(self):
        return self.cards.pop(0)
    
if __name__=='__main__':
    deck = StardardDeck()
    print("標準撲克牌:", deck)
    deck.shuffule()
    print("把牌堆洗亂")
    randomCard = deck.draw()
    print("抽出最上方的牌:", randomCard)
    print("剩下的牌為:" ,deck)

結果(隨機洗牌每次結果會不同):

標準撲克牌: 2♡ 2♠ 2♢ 2♣ 3♡ 3♠ 3♢ 3♣ 4♡ 4♠ 4♢ 4♣ 5♡ 5♠ 5♢ 5♣ 6♡ 6♠ 6♢ 6♣ 7♡ 7♠ 7♢ 7♣ 8♡ 8♠ 8♢ 8♣ 9♡ 9♠ 9♢ 9♣ T♡ T♠ T♢ T♣ J♡ J♠ J♢ J♣ Q♡ Q♠ Q♢ Q♣ K♡ K♠ K♢ K♣ A♡ A♠ A♢ A♣
把牌堆洗亂
抽出最上方的牌: Q♢
剩下的牌為: T♠ 6♠ A♢ 8♡ 5♡ 4♣ 7♢ 2♢ 8♢ 3♠ 8♠ 4♠ 2♠ 7♡ 5♠ 5♣ Q♡ 2♣ 6♢ T♣ 3♣ 6♣ K♡ 6♡ 5♢ Q♣ 9♢ 7♠ 2♡ 9♠ 4♡ 3♢ T♡ 3♡ A♣ J♢ J♠ K♠ T♢ J♡ A♠ J♣ 9♣ K♢ 9♡ A♡ Q♠ K♣ 4♢ 7♣ 8♣

尚未有邦友留言

立即登入留言