【问题标题】:Python Blackjack OOP - calling bust and blackjack class function keep reprinting card valuesPython Blackjack OOP - 调用 bust 和 blackjack 类函数不断重印卡值
【发布时间】:2018-06-08 10:20:13
【问题描述】:

我正在尝试使用 OOP 创建二十一点游戏,每次我调用二十一点或破灭函数时,它都会重新打印玩家和庄家的手牌价值。我认为这与正在初始化的 Hand 类有关,但我不确定那里有什么解决方法。

手类+变量的代码如下:

class Hand(object):

    def __init__(self):

        self.hand = []

    def add_card(self, card):

        self.hand.append(card)
        return self.hand

    def __str__(self):

        hand = [str(card) for card in self.hand]
        print 'Current hand is: ',hand

    def get_value(self):
        value = 0
        for card in self.hand:
            print(card)
            value += card.value
        for card in self.hand:
            if card.card == 'Ace' and value > 21:
                value -= 10
        return value

    def bust(self):
        if self.get_value() > 21:
            print ('Busted!')
        else:
            pass

    def hit_or_stand(self):

        self.hit = 'Hit'
        self.stand = 'Stand'
        self.prompter = raw_input('Would you like to hit or stand? ').lower()
        return self.prompter

    def show_hand(self):

        for card in self.hand:
            print(str(card))

    def show_dealerHand(self):

        print('Dealers Hand: '+ str(self.hand[0]) + ' ' + '[X]') 

    def blackjack(self):

        self.bj = False
        if self.get_value() == 21:
            self.bj = True
            print ('Blackjack!')
        else:
            pass

    def dealerHit(self):

        if self.get_value < 17:
            self.add_card(card)
        else:
            pass 

这是运行游戏的主要功能:

def runGame():
    player1 = Player()
    deck1 = Deck()
    playerHand = Hand()
    dealerHand = Hand()

    # deal out cards to player
    i = 0
    while i < 2:
        playerHand.add_card(deck1.drawCard())
        dealerHand.add_card(deck1.drawCard())
        i += 1
    playerHand.__str__()
    dealerHand.show_dealerHand()
    player_move = playerHand.hit_or_stand()
    if player_move == playerHand.hit.lower():
        playerHand.add_card(deck1.drawCard())
        while dealerHand.get_value() < 17:
            dealerHand.add_card(deck1.drawCard())
        if playerHand.bust():
            print('Dealer wins!')
        elif dealerHand.bust():
            print('Player wins!')
        if playerHand.blackjack() and dealerHand.blackjack():
            print('Both the Player and the Dealer have a blackjack!')
            player1.winnings += player1.amount
        elif playerHand.get_value() > dealerHand.get_value():
            print('Player wins')
            player1.winnings += player1.amount * 2
        elif playerHand.get_value() < dealerHand.get_value():
            print('Dealer wins')
            player1.winnings -= player1.amount

【问题讨论】:

  • get_value 函数是什么?和show_dealerHand?等等。似乎Hand 类中缺少一些方法
  • @noamgot 我编辑了代码以包含 Hand 类中的所有方法

标签: python class oop blackjack


【解决方案1】:

注意bust 函数什么都不返回:

def bust(self):
    if self.get_value() > 21:
        print ('Busted!')
    else:
        pass

但是,主要你“得到”它的返回值:

if playerHand.bust():
    print('Dealer wins!')
elif dealerHand.bust():
    print('Player wins!')

在这种情况下,你得到的是None。所以这里发生的是 playerHand.bust() 返回 None,其计算结果为 False。因此,elif dealerHand.bust() 也被执行,这就是为什么庄家的手牌也被打印出来。

要解决此问题,您必须根据需要返回 TrueFalse

【讨论】:

  • 谢谢你。但是在修复之后,当我调用 bust 以及调用dealerHand.add_card(deck1.drawCard()) 时,问题似乎仍然存在。
  • 要清楚,似乎每次在dealerHand.get_value()
  • 没关系..我刚刚发现我有一段调试代码忘记注释掉,导致它不断打印卡片... 掌心
  • @user2899245 是的,调试是编写程序的重要部分(如果不是最重要的部分)。祝你好运
  • 您的get_value() 函数包含print 语句。如果您尝试调试 get_value(),那很好,但一旦它工作,它应该按照它说的去做,而不是添加无关的输出。
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2020-09-02
  • 2018-07-24
相关资源
最近更新 更多