BlackJack类困难

时间:2013-08-23 21:54:04

标签: python class python-3.x

我正试图模拟二十一点游戏的经销商,我真的很困惑。

基本上,我正在使用一副只包含J,Q,K,A和2-10的牌来简化这些内容,而不是使用普通的牌组设置。

我意识到所有这一切都非常混乱,我一直在和课程一起工作3个小时。

class Deck:
    '''Simulates a deck of cards.'''

    def __init__(self):
        '''Deck() -> Deck
        Creates a deck of cards'''
        self.Deck = ['J', 'J', 'J', 'J', 'Q', 'Q', 'Q', 'Q', 'K', 'K', 'K', 'K', 'A', 'A', 'A', 'A', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10']

    def __str__(self):
        '''str(Deck) -> str
        Returns string showing number of cards left'''
        output = str(len(self.Deck)) + ' cards'
        return(output)

    def shuffle(self):
        '''shuffle(self) -> Deck
        Shuffles deck.'''
        import random
        random.shuffle(self.Deck)

     def draw(self):
        if len(self.Deck) > 0:
            return(self.Deck.pop(0))
        else:
            return(-1)

    def add(self, card):
        self.Deck.append(str(card))

class BlackJackPlayer(Deck):
    '''Represents someone playing blackjack.'''

    def __init__(self, Deck):
        self.BlackJackPlayer = Deck
        self.hand = ''
        self.value = 0

    def __str__(self):
        return self.hand

    def clean_up(self):
        self.BlackJackPlayer = Deck
        self.hand = ''
        self.value = 0

    def get_value(self):
        for x in self.hand:
            if x != ',':
                if x not in range(1, 11):
                    if x != 'A':
                        self.value += 10
                    else:
                        if (self.value + 11) > 17:
                            self.value += 1
                        else:
                            self.value += 11
                else:
                    self.value += x
        return(self.value)

    def hit(self):
        Deck.shuffle(self.BlackJackPlayer)
        card = Deck.draw(self.BlackJackPlayer)
        return(card)

    def play_dealer(self):
        while BlackJackPlayer.get_value(self) < 17:
            self.hand += BlackJackPlayer.hit(self)
            print(self.hand)
            if BlackJackPlayer.get_value(self) < 17:
                self.hand += ','
        if BlackJackPlayer.get_value(self) > 21:
            return('BUST')
        else:
            return

出于某种原因,每当我打电话给jack.play_dealer()时,它就会过早停止,因为它认为手已经超过了21。

例如:

>>> deck = Deck()
>>> jack = BlackJackPlayer(deck)
>>> jack.play_dealer()
7
'BUST'
>>> jack.get_value()
40

我猜我的get_value()有些不对劲,但我无法理解。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您的Deck卡片都是字符串:

self.Deck = ['J', 'J', 'J', 'J', 'Q', 'Q', 'Q', 'Q', 'K', 'K', 'K', 'K', 'A', 'A', 'A', 'A', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10']

请注意'2''3'等字符串。

然而你试图将它们视为整数:

for x in self.hand:
    if x != ',':
        if x not in range(1, 11):

x 永远会在range(1, 11),因为您的所有值都是字符串。因此,上述if语句始终 True

下一部分是:

if x != 'A':
    self.value += 10
else:
    if (self.value + 11) > 17:
        self.value += 1
    else:
        self.value += 11

当绘制'数字'卡时,not in range(1, 11)仍然为真,它们不等于'A',因此您将所有卡计为值10。

您需要重新考虑如何在这里处理数字卡。您可以测试字母数字排序:

if x >= 'A':

也适用于您的数字卡,因为所有数字都在ASCII标准的大写字母之前排序。使用它而不是not in range(1, 11)测试。

接下来的问题是,当卡是数字时,您正尝试使用字符串来添加值:

else:
    self.value += x

但是这会增加字符串;字符串值始终大于数字(在Python 3中,比较字符串和数字会引发错误)。

使用int()对实际数字求和:

else:
    self.value += int(x)

现在至少你有一些工作:

>>> deck = Deck()
>>> jack = BlackJackPlayer(deck)
>>> jack.play_dealer()
A
A,A
A,A,9
'BUST'
>>> jack.get_value()
60

但这仍然太高了。那是因为您使用self.value存储计算但从不重置。您继续为每个新计算添加。

使用局部变量而不是self.value

def get_value(self):
    value = 0
    for x in self.hand:
        if x >= 'A':
            if x != 'A':
                value += 10
            else:
                if value > 6:
                    value += 1
                else:
                    value += 11
        else:
            value += int(x)

    return value

现在游戏按预期运作:

>>> jack = BlackJackPlayer(Deck())
>>> jack.play_dealer()
J
JA
JAA
JAA6

答案 1 :(得分:0)

以下是如何替换获得分数的逻辑。问题是你将字符串视为整数,并重新评估整个手而不重置值。

def get_value(self):
    self.value = 0 # reset for reevaluation
    aces11 = 0
    for x in self.hand.split(','):
        x = x.strip() # strip off excess whitespace
        if x in '2345678910': # numeric
            self.value += int(x)
        elif x == 'A': #An ace
            self.value += 11
            aces11 += 1
        else: # a face card
            self.value += 10
        #check to reduce aces if greater than 17
        while self.value>17 and aces11>0:
            aces11 -= 1
            self.value -= 10
    return(self.value)