我在试着模拟一场21点游戏的经销商,我真的很困惑。
基本上,我使用了一副只有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()有问题,但我想不出来。
提前感谢!
发布于 2013-08-23 22:42:11
您的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语句是 are 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但这是字符串的总和;字符串值总是大于数字(在Python3中,比较字符串和数字会引发错误)。
使用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发布于 2013-08-23 22:53:44
这里是你应该如何取代逻辑,以获得分数。问题在于,您将字符串视为整数,并且在不重置值的情况下重新计算整只手。
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)https://stackoverflow.com/questions/18412463
复制相似问题