[英]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.