美文网首页
设计一副牌

设计一副牌

作者: MontyOak | 来源:发表于2018-07-22 10:41 被阅读9次

原文链接

作为演示代码,做了以下的简化处理:

  • 总共52张牌,不包含大小王
from abc import ABCMeta, abstractmethod
from enum import Enum
import sys


class Suit(Enum):

    HEART = 0
    DIAMOND = 1
    CLUBS = 2
    SPADE = 3


class Card(metaclass=ABCMeta):

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.is_available = True

    @property
    @abstractmethod
    def value(self):
        pass

    @value.setter
    @abstractmethod
    def value(self, other):
        pass


class BlackJackCard(Card):

    def __init__(self, value, suit):
        super(BlackJackCard, self).__init__(value, suit)

    def is_ace(self):
        return self._value == 1

    def is_face_card(self):
        """Jack = 11, Queen = 12, King = 13"""
        return 10 < self._value <= 13

    @property
    def value(self):
        if self.is_ace() == 1:
            return 1
        elif self.is_face_card():
            return 10
        else:
            return self._value

    @value.setter
    def value(self, new_value):
        if 1 <= new_value <= 13:
            self._value = new_value
        else:
            raise ValueError('Invalid card value: {}'.format(new_value))


class Hand(object):

    def __init__(self, cards):
        self.cards = cards

    def add_card(self, card):
        self.cards.append(card)

    def score(self):
        total_value = 0
        for card in card:
            total_value += card.value
        return total_value


class BlackJackHand(Hand):

    BLACKJACK = 21

    def __init__(self, cards):
        super(BlackJackHand, self).__init__(cards)

    def score(self):
        min_over = sys.MAXSIZE
        max_under = -sys.MAXSIZE
        for score in self.possible_scores():
            if self.BLACKJACK < score < min_over:
                min_over = score
            elif max_under < score <= self.BLACKJACK:
                max_under = score
        return max_under if max_under != -sys.MAXSIZE else min_over

    def possible_scores(self):
        """Return a list of possible scores, taking Aces into account."""
        # ...


class Deck(object):

    def __init__(self, cards):
        self.cards = cards
        self.deal_index = 0

    def remaining_cards(self):
        return len(self.cards) - deal_index

    def deal_card():
        try:
            card = self.cards[self.deal_index]
            card.is_available = False
            self.deal_index += 1
        except IndexError:
            return None
        return card

    def shuffle(self):  # ...

每张牌有花色、牌号、状态三个属性。也可以用collections里的namedtuple数据结构来实现。

相关文章

  • 设计一副牌

    原文链接 作为演示代码,做了以下的简化处理: 总共52张牌,不包含大小王 每张牌有花色、牌号、状态三个属性。也可以...

  • 基于Python的21点游戏蒙特卡洛模拟

    问题重述: 大多数赌场使用6副牌或8副牌玩这种游戏,以防止“数牌点”,在你的模拟中使用两副牌(共104张)。只有2...

  • 斗地主里的学问

    每次过节放假,我和哥嫂都会在父母那里打打斗地主以娱乐。 扑克牌的玩法还是蛮多的。有一副牌两副牌甚至更多三副牌的不同...

  • 一副牌

    每人六张跑的快 一把定输赢 第一张是小王 第二张是大王 这可是最大的两张牌了 第三张却是个瘪三 在上海话里 就喜欢...

  • [算法设计与分析]快算24 解题报告

    Problem 一副牌,除了大小王之外还有52张,从1到13每个数目各有四张。要求设计一个程序,对于任意给出52张...

  • leetcode每日一题 python解法 3月27日 pyth

    难度:简单 题目内容: 给定一副牌,每张牌上都写着一个整数。 此时,你需要选定一个数字 X,使我们可以将整副牌按下...

  • 小目标

    想买塔罗牌…… 嗯……还想买塔罗牌。 今天有小伙伴问我学习塔罗牌需要买几副牌?因为看有些人手里有好几副牌。 我个人...

  • 卡牌分组

    题目 给定一副牌,每张牌上都写着一个整数。 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组...

  • 卡牌分组

    题目: 给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组...

  • 两副牌升级攻略

    出牌的最终目的:拿分 所有的重点都是在拿分,出牌不能拿分或帮助拿分的都是无用牌。 任何一张普通牌能拿5分就非常值得...

网友评论

      本文标题:设计一副牌

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