有人能看看我的代码,让我知道为什么当玩家的手小于21时,Ace值没有变为11?我很难在defcheckvalue(self)
下的FOR循环中实现IF循环。这是最好的办法还是有更好的办法?在
谢谢
import random
rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
suit = ['Diamonds', 'Clubs', 'Hearts', 'Spade']
card_val = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'Jack':10, 'Queen':10, 'King':10, 'Ace':1}
class Card(object):
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
def __str__(self):
return str(self.rank) + ' of ' + str(self.suit)
def grab_suit(self):
return self.suit
def grab_rank(self):
return self.rank
def draw(self):
print(self.suit + self.rank)
class Deck(object):
def __init__(self):
self.cards = []
for i in rank:
for j in suit:
self.cards.append(Card(i,j))
def __str__(self):
return str([str(card) for card in self.cards])
def shuffle(self):
random.shuffle(self.cards)
def deal(self):
single_card = self.cards.pop()
return single_card
deck = Deck()
class Hand(object):
def __init__(self):
self.value = []
def hit(self):
self.value.append(deck.deal())
return self.value
def __str__(self):
return str([str(card) for card in self.value])
def checkvalue(self):
handvalue = 0
for card in self.value:
handvalue += card_val[card.grab_rank()]
if card.grab_rank() in self.value == 'Ace' and handvalue <= 11:
handvalue = handvalue + 10
return handvalue
playerhand = Hand()
if card.grab_rank() in self.value == 'Ace'
是胡言乱语。或者更确切地说,它被解释为这里的
card
是指手中的最后一张牌(因为它在上面的for
循环之外),而不是手上的任何一张牌。即使是这样,你也必须删除in self.value
检查。在使代码正常工作的最小更改是:
^{pr2}$分别地,}是愚蠢的。不要在Python中实现getter,只需使用属性访问(
get_rank
和{card.rank
,和card.value
)。在注意,这里有很多事情需要清理一下。一方面,卡片应该知道自己的价值,而不是必须在全局表中查找。在
然后您的
checkvalue
函数变成如果重构到继承模型并将
checkvalue
转换为属性,这将变得更加简单。在现在您调用
hand.value
,而不是hand.value()
,这样做更有意义。value
在现实世界中不是一个动作,它是一个名词而不是一个动词。将其视为属性(或属性,这是@property
装饰器所做的)。在请注意,我在这里没有定义继承时处理的,我没有定义},因为手实际上不应该打击自己。从封装的角度来看,它都没有意义(它现在依赖于一个名为
__init__
,因为这是从^{__str__
,因为它或多或少是由它自己来处理的(如果你print
一个列表,它会对它的所有成员调用str
),而且我也没有定义{deck
的对象,它有一个方法deal
),而且“命中”是手的责任也没有意义。也许考虑…在玩家击球,手不击球
当你计算一个玩家的手牌的值时,你只比较最后一个遍历
self.value
的card
,看它是否是Ace
。在因此,基本上,你需要计算手的值,同时还要确定是否有一张牌是
^{pr2}$Ace
。在你希望if在for循环中,否则你只检查一张卡(手上的最后一张卡)。我们也只关心他们是否至少有一张王牌,因为使用超过一张的11张会破产。在
尝试:
关于其余代码的小注释:
你的if检查if自我价值等于'Ace'(False),然后如果卡。抢。排名()为False,这将出错。在
Don't use getters in Python
在弹出之前,您可能需要检查deal函数中的deck是否为空,否则它将出错。在
相关问题 更多 >
编程相关推荐