簡體   English   中英

二十一點類難題

[英]BlackJack Class Difficulties

我正在嘗試模擬二十一點游戲的發牌人,我真的很困惑。

基本上,我使用的紙牌組僅包含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()有問題,但是我無法弄清楚。

提前致謝!

你的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)仍然為true,它們不等於'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

這是您應如何替換獲得分數的邏輯。 問題在於您將字符串視為整數,並且您在不重置值的情況下重新評估了整手牌。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM