面向对象_扑克牌发牌程序 (Python经典编程案例)

2021-01-28 10:06:04 浏览数 (2)

参考链接: Python程序可随机播放纸牌

案例:4名牌手打牌,计算机随机将52张牌(不含大小王)发给4名牌手,并在屏幕上显示每位牌手的牌。 

Card类:代表一张牌,FaceNum指牌面数字,Suit指花色;Hand类:代表一手牌,可以增加,清空手里的牌;Poke类:代表一副牌,deal指发牌。 

class Card():

    """A playing 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

        self.suit = suit

        self.is_face_up = face_up  # 是否显示牌的正面

    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

class Hand():

    """A hand of playing cards"""

    def __init__(self):

        self.cards = []  # cards列表变量存储牌手中的牌

    def __str__(self):

        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)

class Poke(Hand):

    """A deck of playing cards."""

    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('扑克发牌开始:')

    # 4个玩家

    players = [Hand(), Hand(), Hand(), Hand()]

    poke1 = Poke()

    poke1.populate()  # 生成一副牌

    poke1.shuffle()  # 洗牌

    poke1.deal(players, 13)  # 发给每个玩家13张牌

    # 显示4位牌手的牌

    n = 1

    for hand in players:

        print('牌手', n, end=':')

        print(hand)

        n = n 1

    input('n Press the enter key to exit.')

程序执行结果如下图:

0 人点赞