Список Python, похоже, не обновляется

Я новичок в python и пытаюсь создать блэкджек. Однако, когда я пытаюсь распечатать, какая рука у игрока, я сталкиваюсь с некоторыми трудностями.
Это мой код для удара (вытягивания карты):

def hit(card, deck):
    global money, choice

    choice = input("How much would you like to bet?\n")
    money -= int(choice)
    print("You have decided to bet $" + str(choice))
    card = card.drawCard(deck.deck)
    card.getPt()
    deck.addScore(card)
    deck.addCard(card)
    c = str(card)
    p = str(deck)
    print("You have drawn: " + str(c) + "\n")
    print("The player has:\n" + str(p) + "\n")
    print("Total score:", deck.score)

И это мой код для печати моих карт:

def __str__(self):
    for i in range(0, len(self.deck)):
        self.print = self.print + "\n" + str(self.deck[i])
    return self.print

Первое, что делает мой код, это берет две карты для дилера и игрока, что работает нормально. Однако после того, как игрок тянет карту, ситуация становится немного шаткой. Вывод примерно такой:

The player has drawn Card A  
The player has drawn Card B
Total score: number

How much would you like to bet?  
number

You have bet number  
You have drawn Card B

Player has:  
Card A  
Card B  
Card A  
Card B  
Card B  

Когда я беру новую карту, она не меняется, она остается последней картой, которую я вытянул. Затем, когда я печатаю свою колоду, она печатает мою старую колоду и мою новую колоду. Однако счет правильный, что указывает на то, что мой список состоит всего из трех карт. Что происходит и почему он печатает пять карт?

Полный код
Пример вывода


person Alex Ruan    schedule 15.11.2018    source источник
comment
Почему вы генерируете случайное число для взятия карты вместо того, чтобы один раз перетасовать колоду и просто вытащить ее сверху?   -  person user3483203    schedule 15.11.2018


Ответы (1)


Итак, чтобы ответить коротко: вы никогда не сбрасываете Deck.print. Таким образом, он продолжает накапливаться при каждом вызове __str__.

Но в целом этот код можно значительно улучшить. ваша функция __str__ далека от pythonic. Что-то в духе

return '\n'.join(self.deck)

выглядел бы намного лучше.

Как правило, нет необходимости добавлять перед каждой переменной слово «я». если они используются только внутри функции. В большинстве случаев в методе класса вы либо обновляете объектную переменную (self.something), либо возвращаете некоторое значение из функции, но не то и другое одновременно. Могут, конечно, быть и исключения из этого, но видимо в вашем случае это правило, а не исключение.

По возможности следует избегать использования глобальных переменных.

person g.a    schedule 15.11.2018