如何根据Python教科书的要求实现“类卡”

时间:2013-01-22 21:02:34

标签: python class python-3.x

我目前正在研究John Zelle的Python编程:计算机科学概论,并在第10章遇到障碍。我在理解这个练习的原因和方法时遇到了一个概念性问题,需要一些帮助来解决这个问题。解决问题。练习要求我创建一个程序,使用名为Card的类显示 n 卡的数量,并需要以下方法。它也应该在生成 n 个随机卡的应用程序中调用:

  1. __init__(self, rank, suit):
  2. getRank(self)
  3. getSuite(self)
  4. BJValue(self)
  5. __str__(self)
  6. 尽管这应该是非常容易的,但是我试图实现这个课程。我创建了一个简单的应用程序,可以生成一副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 个变量来存储每个卡对象,然后将每个变量分配给{{1}的实例}。我可以用Card显示每张牌,其中i迭代到hand[i]而不需要特殊的range(n)类,但这不是这个项目所期望的。我正在寻找有关如何思考这个问题的建议,以便我可以使用这个必需的类。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我认为python中的任何卡类都应该有一个使用u“\ u2263”的__unicode__方法等等 - 只是为了好玩。我还建议使用@ functools.total_ordering以及__eq__和__gt__方法进行装饰,以便可以比较卡片;此外,“已排序”内置将适当地对卡片列表进行排序。