我正试图模拟二十一点游戏的经销商,我真的很困惑。
基本上,我正在使用一副只包含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()有些不对劲,但我无法理解。
提前致谢!
答案 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)