如何根据Python教材实现'类Card

3 投票
2 回答
7928 浏览
提问于 2025-04-17 13:22

我现在正在学习约翰·泽尔的《Python编程:计算机科学导论》,在第10章遇到了一些困难。我在理解这个练习的目的和方法上有些困惑,需要一些帮助来处理这个问题。这个练习要求我创建一个程序,使用一个叫做Card的类来显示n张卡片,并且需要以下几个方法。这个程序还应该能够在一个应用程序中调用,生成n张随机卡片:

  1. __init__(self, rank, suit):
  2. getRank(self)
  3. getSuite(self)
  4. BJValue(self)
  5. __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 个回答

0

我觉得在Python中,任何卡片类都应该有一个叫做__unicode__的方法,这个方法可以用u"\u2263"这样的字符,纯粹是为了好玩。我还建议用@functools.total_ordering这个装饰器来装饰它,并且要有__eq__和__gt__这两个方法,这样卡片就可以进行比较了。而且,这样一来,Python内置的“sorted”函数就能正确地对卡片列表进行排序。

11

看起来你只需要在代码中改一行:

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)

撰写回答