如何根据Python教材实现'类Card
我现在正在学习约翰·泽尔的《Python编程:计算机科学导论》,在第10章遇到了一些困难。我在理解这个练习的目的和方法上有些困惑,需要一些帮助来处理这个问题。这个练习要求我创建一个程序,使用一个叫做Card
的类来显示n张卡片,并且需要以下几个方法。这个程序还应该能够在一个应用程序中调用,生成n张随机卡片:
__init__(self, rank, suit):
getRank(self)
getSuite(self)
BJValue(self)
__str__(self)
虽然这看起来应该很简单,但我在实现这个类的时候遇到了麻烦。我创建了一个简单的应用程序,能够生成一副52张的牌,询问用户想要多少张牌,然后用这些牌填充手牌。但是,一旦生成了手牌,我就看不出使用这个特定的卡片类有什么好处,或者应该在哪里使用它。以下是我目前的代码:
import random
class Card:
def __init__(self, rank, suite):
self.rank = rank
self.suite = suite
def getRank(self):
return self.rank
def getSuite(self):
return self.suite
def BJValue(self):
if self.rank == 'Ace':
return 1
elif self.rank == 'Jack' or self.rank == 'Queen' or self.rank == 'King':
return 10
else:
return int(self.rank)
def __str__(self):
return ('{0} of {1}'.format(self.rank, self.suite))
def shuffled_deck():
deck = []
for suite in ['Clubs', 'Diamonds', 'Hearts', 'Spades']:
for num in ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']:
deck.append([num, suite])
random.shuffle(deck)
return deck
def main():
deck = shuffled_deck()
hand = []
print('>> Card Generator v1 <<')
while True:
try:
n = int(input('Please enter the number of cards to display (1-7): '))
except ValueError:
print('Invalid input, please enter a number!\n')
else:
if n < 1 or n > 7:
print('Please enter a number between 1-7!\n')
else:
break
print('Your hand is:')
for i in range(n):
hand.append(deck[i])
main()
所以,一旦我生成了随机的n张牌,我就不知道如何利用Card
类,甚至不知道该如何实现它。因为n是一个在1到7之间的随机数,我需要n个变量来存储每个卡片对象,然后将每个变量分配给Card
的一个实例。我可以通过hand[i]
来显示手牌中的每张牌,其中i会遍历到range(n)
,而不需要一个特别的Card
类,但这并不是这个项目所期望的。我希望能得到一些建议,帮助我思考这个问题,以便我能利用这个必需的类。
2 个回答
我觉得在Python中,任何卡片类都应该有一个叫做__unicode__的方法,这个方法可以用u"\u2263"这样的字符,纯粹是为了好玩。我还建议用@functools.total_ordering这个装饰器来装饰它,并且要有__eq__和__gt__这两个方法,这样卡片就可以进行比较了。而且,这样一来,Python内置的“sorted”函数就能正确地对卡片列表进行排序。
看起来你只需要在代码中改一行:
deck.append([num, suite])
改成:
deck.append(Card(num, suite))
这样做会把 deck
变量变成一个包含52个 Card
对象的列表。这很有用,因为 Card
对象有一些内置的功能,而像 [num, suite]
这样的两个元素的列表就没有这些功能。
举两个例子:如果你在代码后面加上这一行:
print hand
那么你现在的代码会打印出类似于:
[["Jack", "Clubs"], ["9", "Spades"]]
而你新的代码会打印出:
[Jack of Clubs, 9 of Spades]
(这一行 print "\n".join(map(str, hand)))
可能更接近你实际想要的效果)。你还可以用这一行来获取你手牌的总黑杰克值:
sum(c.BJValue() for c in hand)