python - 如何按照Python教科书的要求实现 'class Card'

标签 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)

虽然这应该是非常容易的,但我在尝试实现这个类时遇到了困难。我创建了一个简单的应用程序,可以生成一副 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类,但这不是该项目所期望的。我正在寻求有关如何思考这个问题的建议,以便我可以使用这个必需的类(class)。

最佳答案

看起来您唯一需要在代码中更改的是更改行:

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))) 可能更接近您在实践中想要的)。您还可以通过以下行获得您的手牌的总二十一点值(value):

sum(c.BJValue() for c in hand)

关于python - 如何按照Python教科书的要求实现 'class Card',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467933/

相关文章:

python-3.x - 包含 Pandas 数据帧的 Unpickling 字典抛出 AttributeError : 'Dataframe' object has no attribute '_data'

python - 如何修复我的 virtualenv?

python - "def __iter__(self): return iter(self.file)"是做什么用的?

python - 我如何检查文件是否为空?

java - 让类在 java 中工作,构建 Android 应用程序来解析 XML

python - Kivy - 在其他屏幕中创建的访问实例

python-3.x - 在自定义包中安装 pip 时,如何修复 install_requires 列表的 'Could not find a version that satisfies the requirement'?

python - 调整 Seaborn 图的大小

c++ - 为什么我收到以下错误 : "no match for ' operator= ='" ?(带有模板的嵌套类)

javascript - 用于执行 Python 的测试套件?