Python,纸牌游戏,属性错误

Python,纸牌游戏,属性错误,python,class,oop,attributeerror,Python,Class,Oop,Attributeerror,我想让一个纸牌游戏变傻。但当我运行程序时,我得到一个AttributeError: 输入玩家数量:1 玩家:玩家1包含: 手动值:0回溯最近的调用上次:File main.py, 第25行,在 printplayer文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第38行,str text+=\n和值:+strself.getValue文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第20行,在getValue中 结果+

我想让一个纸牌游戏变傻。但当我运行程序时,我得到一个AttributeError:

输入玩家数量:1 玩家:玩家1包含:

手动值:0回溯最近的调用上次:File main.py, 第25行,在 printplayer文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第38行,str text+=\n和值:+strself.getValue文件C:\Users\kozus\Desktop\fool\fool\Hand.py,第20行,在getValue中 结果+=self.card.cardPoints自身文件C:\Users\kozus\Desktop\fool\fool\card.py,第8行,在cardPoints中 如果[10,J,Q,K,A]中的self.rank:AttributeError:'Hand'对象没有属性'rank'

这是我的密码: 从随机导入洗牌

class Card(object):
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def getRank(self):
        return self.rank

    def cardPoints(self):
        # Rerturns amount points for some card
        if self.rank in ["10", "J", "Q", "K", "A"]:
            if self.rank == "A":
                # 11 points for ace
                return 11
            else:
                # 10 points for 10, jack, queen или king
                return 10
        else:
            # Amount points for any other card
            return ["6", "7", "8", "9"].index(self.rank) + 6

    def __str__(self):
        return "%s %s" % (self.rank, self.suit)

class Hand(object):
    def __init__(self, name):
        self.name = name
        self.cards = []
        self.card = Card

    def addCard(self, card):
        # Add card in hand
        self.cards.append(card)

    def getValue(self):
        # Amount points in hand
        result = 0
        # Amount aces in hand
        aces = 0

        for card in self.cards:
            result += self.card.cardPoints(self)

            # If ace in hand then we increasing amount of aces in hand
            if card.getRank() == "A":
                aces += 1

        # Count aces like 1 or 11 points
        if result + aces * 10 <= 21:
            result += aces * 10

        return result

    def __str__(self):
        text = "%s's contains:\n" % self.name

        for card in self.cards:
            text += str(card) + " "

        text += "\nHand value: " + str(self.getValue())

        return text

class Deck(object):
    def __init__(self):
        ranks = ["6", "7", "8", "9", "10", "J", "Q", "K", "A"] # Ranks
        suits = ["D", "C", "H", "S"] # Suits
        self.cards = [Card(r, s) for r in ranks for s in suits] # Generating deck, consists of 36 cards
        shuffle(self.cards)

    def dealCard(self):
        # Card handing over function
        self.cards.pop()

amount_players = int(input("Enter amount of players: "))
deck = Deck() # Creating deck

i = 0

# Creating players
players = [Hand("player{0}".format(i + 1)) for i in range(amount_players)]

print("Players: ")

for player in players:
    # Printing players
    print(player)

for player in players:
    while i < 6:
        # Distrbuting 6 card per player
        player.addCard(deck.dealCard())
        i += 1

for player in players:
    print(player)

有人知道如何修复它吗?

我认为您手中不需要card属性,因此您应该从Hand构造函数中删除初始化。所有卡都已存储在卡中

这将导致以下错误:

  File "/tmp/t.py", line 43, in getValue
    result += self.card.cardPoints(self)
AttributeError: 'Hand' object has no attribute 'card'
这里的问题是,您不使用card循环迭代变量,因为您使用self在对象中查找它。cardPoints方法也不接受除隐式self参数以外的任何参数,因此我们也要解决这个问题:

        for card in self.cards:
            result += card.cardPoints()
这将使您克服最初的错误

之后,您必须更改dealCard方法以实际返回从组中弹出的卡,因为dealCard方法当前不返回任何内容,根本没有返回语句

# Change this line:
result += self.card.cardPoints(self)
# to this:
result += card.cardPoints()
您不需要将对象instanceself传递给“cardPoints”。为什么会有这样的情况:

self.card = Card

没有必要这样做,您所做的只是将self.card设置为类而不是对象。

我刚刚调试了它,然后看到了Florian的答案。我的代码中提到了这些更改,并且删除了全局I变量。你永远不要使用全局i,这是我们编程前辈传给后代的一条永远不要忘记的戒律。作为旁注:你的卡片分数太大了,请尝试def cardpoints self:+try:return intself.rank+除了:如果self.rank==A else 10,则返回11