3

我目前正在阅读 John Zelle 的 Python Programming: An Introduction to Computer Science 并在第 10 章遇到了障碍。我在理解这个练习的原因和方式方面遇到了一个概念性问题,并且需要一些关于如何解决问题的帮助. 该练习要求我创建一个程序,该程序使用一个名为的类来显示nCard个卡片,并且需要以下方法。它还应该可以从生成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]我迭代到的位置,但这不是这个项目所期望的。我正在寻找有关如何考虑这个问题的建议,以便我可以使用这个必需的课程。range(n)Card

4

2 回答 2

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)
于 2013-01-22T21:10:23.783 回答
0

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

于 2016-06-09T04:04:28.780 回答