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(), 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

相关内容

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值