【问题标题】:creating a playing card Class Python创建扑克牌类 Python
【发布时间】:2017-03-22 13:06:14
【问题描述】:

我创建了一个扑克牌对象,它具有等级、套件和二十一点值的某些属性。

二十一点值部分不断收到 TypeError,表示我无法在 listint 的实例之间进行比较。我不确定如何解决(如何/如果我可以只比较列表的索引,然后根据它的索引给它二十一点值)?

if/elif 块属于 bjValue() 函数还是 init() 函数?

这是我的代码:

class Card:

    """playing card object where numeric rank, suit and blackjack values are stored"""

    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
        self.ranks = [None, "Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King"]
       self.suits = {"d": "Diamonds",
                   "c": "Clubs",
                   "h": "Hearts",
                   "s": "Spades"}




    def getRank(self):
        """returns the rank of the card"""
        return self.rank

    def getSuit(self):

        return self.suits.get(self.suit)

    def bjValue(self):

        if self.rank > 1 or self.rank < 11:
            self.value = self.rank

        elif self.rank == "Ace":
            self.value = 1

        elif self.rank == "Jack" or self.ranks == "Queen" or self.ranks == "King":
            self.value = 10


        return self.value


    def __str__(self):

        return "%s of %s" % (self.ranks[self.rank], self.suits.get(self.suit))





c1 = Card(1,"s")
c2 = Card(11,"d")
print(c1) #expect Ace of Spades
print(c2) #expect Jack of Diamonds

c3 = Card(5,"c") #expect 5 of clubs
print(c3.getRank())
print(c3.getSuit()) #expect Five
print(c3.bjValue()) #expect 5
print(c3)

c4 = Card(1,"s")
print(c4)

编辑:所以,我修正了我的错字并且不再出现错误,但我仍然得到不正确的 Jack、Queen 和 King 牌的二十一点值(我将它们的二十一点值恢复为他们的等级,即使我有 if 语句),我不明白我的逻辑缺陷在哪里......

【问题讨论】:

  • 你能分享一下确切的堆栈跟踪吗

标签: python class attributes comparison


【解决方案1】:

因为您是初学者。让我们考虑一下它给您带来的错误:

    if self.ranks > 1 or self.ranks < 11:
TypeError: '>' not supported between instances of 'list' and 'int'

bjValue 函数中有错字:

if self.ranks > 1 or self.ranks < 11:
    self.value = self.ranks

您正在与ranks 列表进行比较,而不是实际(当前)rank 值。

你的意思可能是:

if self.rank > 1 or self.rank < 11:
    self.value = self.ranks[self.rank]

编辑

根据您的评论,我怀疑您想要的是这样的。

class Card:
    def __init__(self, rank, suit):
        self.ranks = [None, "Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King"]
        self.rank = self.ranks[rank]
        self.suits = {"d": "Diamonds", "c": "Clubs", "h": "Hearts", "s": "Spades"}
        self.suit = self.suits[suit]
        self.value = -1

    def getRank(self):
        return self.rank

    def getSuit(self):
        return self.suit

    def bjValue(self):
        if self.rank == "Ace":
            self.value = 1
        elif self.rank == "Jack" or self.rank == "Queen" or self.rank == "King":
            self.value = 10
        elif type(self.rank) is int:
            if self.rank > 1 and self.rank < 11:
                self.value = self.ranks[self.rank]
        return self.value

除非您希望能够更改任何已创建卡片的等级或花色,否则我建议将 if 语句从 bjValue 移至 __init__

【讨论】:

  • 是的!天哪-谢谢你指出这一点-{我开始担心会混淆它们时,我有点担心使用 .rank 和 .ranks 并且我做到了! } ...谢谢!
  • @KindeR66 不客气!如果您将答案标记为已接受,那会让我同样高兴! :)
  • 我刚刚编辑了我的问题,因为我仍然有这个问题(我希望我能得到一些帮助)-所以,我解决了这个问题,我不再得到了错误,但我仍然得到不正确的 Jack、Queen 和 King 扑克牌值(只是找回他们的名字)
  • @KindeR66 所以只是为了确保我明白了。当您拥有 Jack 时,bjValue() 返回 Jack 但您希望它返回 11 或?如果是这样,getRank()bjValue() 有什么区别?
  • 嘿-对不起,我已经离开了,实际上我仍在努力解决这个问题(我已经解决了这个问题以解决这个游戏中更复杂的部分)-所以,基本上,我正在尝试给出这些二十一点值(self.value 变量),所以我希望 Jack、Queen 和 King 的 bjValue() 各为 10(而不是 11,12 和 13)——这就是为什么我有这条线 elif self.rank == "Jack" or self.rank == "Queen" or self.rank == "King": self.value = 10 这不是t工作@Vallentin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多