美文网首页
面向对象—类和类的关系(扑克游戏)

面向对象—类和类的关系(扑克游戏)

作者: 她即我命 | 来源:发表于2018-12-01 15:39 被阅读0次
"""
类和类之间的关系:
- is-a关系(继承)
- has-a关系(关联/聚合/合成)
- use-a关系(依赖)
"""
from enum import Enum, unique

import random


# 枚举类型(定义符号常量的最佳选择,符号常量总是优于字面常量)
@unique
class Suite(Enum):
    """花色"""

    SPADE, HEART, CLUB, DIAMOND = range(4)

    def __lt__(self, other):
        return self.value < other.value


class Card(object):
    """牌"""

    def __init__(self, suite, face):
        """初始化方法"""
        self.suite = suite
        self.face = face

    def show(self):
        """显示牌面"""
        suites = ['♠️', '♥️', '♣️', '♦️']
        faces = [
            '', 'A', '2', '3', '4', '5', '6',
            '7', '8', '9', '10', 'J', 'Q', 'K'
        ]
        return f'{suites[self.suite.value]} {faces[self.face]}'

    def __str__(self):
        return self.show()

    def __repr__(self):
        return self.show()


class Poker(object):
    """扑克"""

    def __init__(self):
        self.index = 0
        self.cards = [Card(suite, face)
                      for suite in Suite
                      for face in range(1, 14)]

    def shuffle(self):
        """洗牌(随机乱序)"""
        random.shuffle(self.cards)
        self.index = 0

    def deal(self):
        """发牌"""
        card = self.cards[self.index]
        self.index += 1
        return card

    @property
    def has_more(self):
        return self.index < len(self.cards)


# Python解释器搜索一个变量会按照LEGB的顺序进行搜索
# Local --> Embedded --> Global --> Built-in
# 在函数中定义的变量正常情况下属于局部作用域
# 但是可以通过nonlocal或global关键字将其放到嵌套或全局作用域
class Player(object):
    """玩家"""

    def __init__(self, name):
        self.name = name
        self.cards = []

    def get_one(self, card):
        """摸一张牌"""
        self.cards.append(card)

    def sort(self, comp=lambda card: card.face):
        """整理手上的牌"""
        self.cards.sort(key=comp)


def main():
    """主函数"""
    poker = Poker()
    poker.shuffle()
    players = [
        Player('东邪'), Player('西毒'), 
        Player('南帝'), Player('北丐')
    ]
    for _ in range(13):
        for player in players:
            player.get_one(poker.deal())
    for player in players:
        player.sort(lambda card: (card.suite, card.face))
        print(player.name, end=': ')
        print(player.cards)


if __name__ == '__main__':
    main()

相关文章

网友评论

      本文标题:面向对象—类和类的关系(扑克游戏)

      本文链接:https://www.haomeiwen.com/subject/kbcrcqtx.html