本文档描述了纸牌组系统的面向对象设计。该实现提供了一个通用的纸牌游戏框架,并针对二十一点进行了特定扩展。该系统使用继承、抽象和封装等面向对象原则,模拟了纸牌游戏中发现的核心实体:牌、花色、手牌和牌组。
纸牌组系统实现了一个灵活、可扩展的面向对象设计,可用于模拟各种纸牌游戏。当前实现侧重于标准的 52 张牌组,并针对二十一点进行了专门化。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py1-118
Suit 枚举代表了纸牌组中的四种标准花色。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py6-11
Card 抽象基类提供了所有牌类型的基石,具有
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py14-29
BlackJackCard 类扩展了抽象的 Card 类,增加了特定于二十一点的逻辑。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py32-58
Hand 类代表一副牌的集合,具有
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py61-73
BlackJackHand 类扩展了基础的 Hand 类,具有
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py76-95
Deck 类管理一副牌的集合,并具有以下功能:
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py98-117
下图说明了这些组件在典型的纸牌游戏场景中的交互方式。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py61-117
关键设计特性之一是如何处理牌值。
Card 类将值定义为一个抽象属性,允许不同游戏实现不同的处理方式。BlackJackCard 为二十一点实现了自定义值逻辑。来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py14-58
BlackJackHand 类实现了二十一点的特定计分。
这种专门的计分逻辑封装在 BlackJackHand 类中,保持基础 Hand 类的通用性和可重用性。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py76-95
纸牌组系统展示了多种面向对象的设计模式和原则。
| 模式/原则 | 实现 |
|---|---|
| 抽象 | Card 抽象基类定义了接口,而没有实现。 |
| 继承 | BlackJackCard 和 BlackJackHand 扩展了基类,并具有特定行为。 |
| 封装 | 牌值验证和状态管理被封装在相应的类中。 |
| 单一职责 | 每个类都有一个清晰、专注的职责(例如,Deck 管理牌的集合)。 |
| 开闭原则 | 系统可以通过不修改核心类来扩展以适应新的纸牌游戏。 |
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py1-118
面向对象设计使得扩展系统以适应其他纸牌游戏变得非常简单。
Card 类。Hand 类,包含特定于游戏的计分规则。Deck 类,或在需要时扩展它。例如,要实现扑克,您需要创建一个 PokerCard 类和一个 PokerHand 类,并包含特定于扑克的牌型评估逻辑。
来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py1-118
BlackJackHand 中的 possible_scores() 方法尚未完全实现,但它负责计算所有可能的 A 牌分数(计为 1 或 11)。Deck 中的 shuffle() 方法留作练习实现。来源: solutions/object_oriented_design/deck_of_cards/deck_of_cards.py93-117