ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

设计一套扑克牌

2026/8/10 20:05:19 拓冰建站 浏览量
设计一套扑克牌

约束和假设

  • 这是一幅用于类似扑克和二十一点等游戏的通用扑克牌吗?
  • 我们可以假设这副牌有52张(2-10,杰克,女王,国王,埃斯)和4种花色吗?
  • 我们可以假设输入是有效的,还是需要对其进行验证?

编码实现

from abc import ABCMeta, abstractmethod
from enum import Enum
import sysclass Suit(Enum):HEART = 0DIAMOND = 1CLUBS = 2SPADE = 3class Card(metaclass=ABCMeta):def __init__(self, value, suit):self.value = valueself.suit = suitself.is_available = true@property@abstractmethoddef value(self):pass@value.setter@abstractmethoddef value(self, other):passclass BlackJackCard(Card):def __init__(self, value, suit):super(BlackJackCard, self).__init__(value, suit)def is_ace(self):'''Jack =11, Queen = 12, King = 13'''return 10 < self._value <= 13@preopertydef value(self):if self.is_ace() == 1:return 1elif self.is_face_card():return 10else:return self._value@value.setterdef value(self, new_value):if 1 <= new_value <= 13:self._value = new_valueelse:raise ValueError('Invalid card value: {}'.format(new_value))class Hand(object):def __init__(self, cards):self.cards = cardsdef add_card(self, card):self.cards.append(card)def score(self):total_value = 0for card in self.cards:total_value += card.valuereturn total_valueclass BlackJackHand(Hand):BLACKJACK = 21def __init__(self, cards):min_over = sys.MAXSIZEmax_under = -sys.MAXSIZEfor score in self.possible_scores():if self.BLACKJACK < score < min_over:min_over = scoreelif max_under < score <= self.BLACKJACK:max_under = scorereturn max_under if max_under != -sys.MAXSIZE else min_overdef possible_scores(self):'''Return a list of possible scores, taking aces into account'''class Deck(oject):def __init__(self,card):self.cards = cardsself.deal_index = 0def remaining_cards(self):return len(self.cards) - deal_indexdef deal_card():try:card = self.card[self.deal_index]card.is_available = Falseself.deal_index += 1except IndexError:return Nonereturn carddef shuffle(self): #...