Python, карточная игра, AttributeError - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь сделать карточную игру "дурак".Но когда я запускаю программу, я получаю AttributeError:

Введите количество игроков: 1 Игроки: player1's содержит:

Значение руки: 0 Traceback (последний последний вызов): Файл "main.py", строка 25, в печатном виде (проигрыватель) Файл "C: \ Users \ kozus \ Desktop \ fool \ fool \ Hand.py", строка 38, в str text + ="\ nHand value:" + файл str (self.getValue ()) "C: \ Users \ kozus \ Desktop \ fool \ fool \ Hand.py", строка 20, в результате getValue + = self.card.cardPoints (self) Файл "C: \ Users \ kozus \ Desktop \ fool \ fool \ Card.py", строка 8, в cardPoints, если self.rank в ["10", "J", "Q", "K", "A"]: AttributeError: У объекта 'Hand' нет атрибута 'rank'

Это мой код: из случайного импорта shuffle

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)

Кто-нибудь теперь может это исправить?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018
# Change this line:
result += self.card.cardPoints(self)
# to this:
result += card.cardPoints()

Вам не нужно передавать экземпляр объекта (self) в `cardPoints.И почему у вас это так:

self.card = Card

В этом нет необходимости, все, что вы делаете, это превращаете self.card в класс, а не в объект.

0 голосов
/ 06 октября 2018

Я думаю, вам не нужен атрибут card в Hand, поэтому вы должны удалить инициализацию из конструктора Hand.Все карты уже сохранены в cards.

. Это приведет к этой ошибке:

  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 в настоящее время возвращает None, не имея оператора return.

...