1. 程式人生 > 程式設計 >Python用類實現撲克牌發牌的示例程式碼

Python用類實現撲克牌發牌的示例程式碼

1. 題目

編寫程式, 4名牌手打牌,計算機隨機將52張牌(不含大小鬼)發給4名牌手,在螢幕上顯示每位牌手的牌。

提示:
設計出3個類:Card類、Hand類和Poke類。
Card類代表一張牌,其中FaceNum欄位指出是牌面數字1~13,Suit欄位指出的是花色,值“梅”為梅花,“方”為方塊,“紅”為紅心,“黑”為黑桃。
Hand類代表一手牌,可以認為是一位牌手手裡的牌,其中cards列表變數儲存牌手手裡的牌。可以增加牌、清空手裡的牌、把一張牌給別的牌手。
Poke類代表一副牌,可以把一副牌看作是有52張牌的牌手,所以繼承Hand類。

1.1 輸出樣例

This is a module with classes for playing cards.

牌手 1:紅桃6黑桃6梅花A方片6黑桃2梅花10紅桃3方片4方片10黑桃J紅桃Q紅桃10紅桃8
牌手 2:梅花J梅花9紅桃7紅桃2方片K黑桃K梅花3方片7黑桃Q黑桃10梅花Q梅花8黑桃7
牌手 3:梅花2方片A黑桃3方片9黑桃4紅桃K紅桃J梅花7紅桃4方片2梅花4梅花6紅桃5
牌手 4:黑桃5紅桃9方片8梅花5方片J黑桃A梅花K方片5黑桃9方片3黑桃8方片Q紅桃A

2. 題解

2.1 程式碼

# Card類:一張牌
class Card:
  """A playing card.card"""
  RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
  SUITS = ['梅花','方片','紅桃','黑桃']

  def __init__(self,rank,suit,face_up=True):
    self.rank = rank        # 牌面數字1~13
    self.suit = suit        # 花色
    self.is_face_up = face_up    # 是否顯示牌的正面,True為正面,False為反面

  def __str__(self):         # 重寫print()方法,列印一張牌的資訊
    if self.is_face_up:
      rep = self.suit + self.rank
    else:
      rep = 'XX'
    return rep

  def pic_order(self):       # 牌的順序號
    if self.rank == 'A':
      FaceNum = 1
    elif self.rank == 'J':
      FaceNum = 11
    elif self.rank == 'Q':
      FaceNum = 12
    elif self.rank == 'K':
      FaceNum = 13
    else:
      FaceNum = int(self.rank)
    if self.suit == '梅花':
      Suit = 1
    elif self.suit == '方片':
      Suit = 2
    elif self.suit == '紅桃':
      Suit = 3
    else:
      Suit = 4
    return (Suit - 1) * 13 + FaceNum

  def flip(self):         # 翻牌方法
    self.is_face_up = not self.is_face_up


# Hand類:一手牌
class Hand:
  """A hand of playing cards Hand"""

  def __init__(self):
    self.cards = []       # cards列表變數儲存牌手手裡的牌

  def __str__(self):        # 重寫print()方法,打印出牌手的所有牌
    if self.cards:
      rep = ''
      for card in self.cards:
        rep += str(card) + '\t'
    else:
      rep = '無牌'
    return rep

  def clear(self):         # 清空手裡的牌
    self.cards = []

  def add(self,card):       # 增加手裡的牌
    self.cards.append(card)

  def give(self,card,other_hand):  # 把一張牌給其他選手
    self.cards.remove(card)
    other_hand.add(card)
    # other_hand.append(card)  # 上面兩行可以用這一行代替


# Poke類:一副牌
# 繼承Hand類
class Poke(Hand):
  """Poke類代表一副牌,可以看做是有52張牌的牌手,所以繼承Hand類。由於其中cards列表變數要儲存52張牌
  而且要發牌,洗牌,所以增加方法如下方法:"""

  def populate(self):         # 生成一副牌
    for suit in Card.SUITS:
      for rank in Card.RANKS:
        self.add(Card(rank,suit))

  def shuffle(self):         # 洗牌
    import random
    random.shuffle(self.cards)   # 打亂牌的順序

  def deal(self,hands,per_hand=13): # 將牌發給玩家,每人預設13張牌
    for rounds in range(per_hand):
      for hand in hands:
        if self.cards:
          top_card = self.cards[0]
          self.cards.remove(top_card)
          hand.add(top_card)
          # self.give(top_card,hand) #上兩句可以用此句替換
        else:
          print('不能繼續發牌了,牌已經發完了!')


if __name__ == "__main__":
  print('This is a module with classes for playing cards.')
  players = [Hand(),Hand(),Hand()]
  poke1 = Poke()
  poke1.populate()       # 生成一副牌
  poke1.shuffle()        # 洗牌
  poke1.deal(players,13)    # 發給每人13張牌
  n = 1
  for hand in players:
    print('牌手',n,end=':')
    print(hand)
    n = n + 1

到此這篇關於Python用類實現撲克牌發牌的示例程式碼的文章就介紹到這了,更多相關Python 撲克牌發牌內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!