Python Blackjack OOP - 调用 bust 和 blackjack class 函数继续重印牌值
Python Blackjack OOP - calling bust and blackjack class function keep reprinting card values
我正在尝试使用 OOP 来创建一个二十一点游戏,每次我调用二十一点或 bust 函数时,它都会重新打印玩家和庄家的手牌价值。我认为这与 Hand class 初始化有关,但我不确定解决方法是什么。
下面的代码用于 Hand Class + 变量:
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
请注意 bust
函数 return 什么都没有:
def bust(self):
if self.get_value() > 21:
print ('Busted!')
else:
pass
不过,主要是你"get"它的return值:
if playerHand.bust():
print('Dealer wins!')
elif dealerHand.bust():
print('Player wins!')
在这种情况下,您得到的是 None
。所以这里发生的是 playerHand.bust()
returns None,计算结果为 False
。因此,elif dealerHand.bust()
也被执行,这就是庄家的手牌也被打印的原因。
为了解决这个问题,您必须根据需要 return True
或 False
。
我正在尝试使用 OOP 来创建一个二十一点游戏,每次我调用二十一点或 bust 函数时,它都会重新打印玩家和庄家的手牌价值。我认为这与 Hand class 初始化有关,但我不确定解决方法是什么。
下面的代码用于 Hand Class + 变量:
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
请注意 bust
函数 return 什么都没有:
def bust(self):
if self.get_value() > 21:
print ('Busted!')
else:
pass
不过,主要是你"get"它的return值:
if playerHand.bust():
print('Dealer wins!')
elif dealerHand.bust():
print('Player wins!')
在这种情况下,您得到的是 None
。所以这里发生的是 playerHand.bust()
returns None,计算结果为 False
。因此,elif dealerHand.bust()
也被执行,这就是庄家的手牌也被打印的原因。
为了解决这个问题,您必须根据需要 return True
或 False
。