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

Vin*_*eau 3 python class python-3.x

我目前正在研究John Zelle的Python编程:计算机科学概论,并在第10章遇到困难.我在理解这个练习的原因和方法时遇到了一个概念性问题,需要一些帮助才能解决问题.练习要求我创建一个程序,使用命名的类显示n个卡,Card并需要以下方法.它也应该在生成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()
Run Code Online (Sandbox Code Playgroud)

因此,一旦我生成随机n卡的手,我就看不出如何使用Card类,甚至在哪里实现它.由于n是1-7之间的随机数,我需要n个变量来存储每个卡对象,然后将每个变量分配给一个实例Card.我可以告诉与手中的每个卡hand[i]在那里我通过迭代来range(n),而不需要特殊的Card类,但这不是什么从这个项目的预期.我正在寻找有关如何思考这个问题的建议,以便我可以使用这个必需的类.

Dav*_*son 11

看起来您需要更改代码的唯一方法是更改​​行:

deck.append([num, suite])
Run Code Online (Sandbox Code Playgroud)

deck.append(Card(num, suite))
Run Code Online (Sandbox Code Playgroud)

这使deck变量成为52个Card对象的列表.这很有用,因为Card对象具有一些内置功能,两个项目(如[num, suite])的列表没有.


两个例子:如果添加该行

print hand
Run Code Online (Sandbox Code Playgroud)

在您的代码之后,您当前的代码将打印出类似的内容

[["Jack", "Clubs"], ["9", "Spades"]]
Run Code Online (Sandbox Code Playgroud)

而你的新代码会打印出来

[Jack of Clubs, 9 of Spades]
Run Code Online (Sandbox Code Playgroud)

(这条线print "\n".join(map(str, hand)))可能更接近你想要的实践).您还可以使用以下行获取手的总二十一点值:

sum(c.BJValue() for c in hand)
Run Code Online (Sandbox Code Playgroud)