Использование переменной, измененной внутри класса вне класса Python - PullRequest
0 голосов
/ 08 сентября 2018

Я чувствую, что это должно быть довольно распространенной проблемой, когда кто-то впервые начинает заниматься с классами, но я не могу найти ответ на этот вопрос. Я пытаюсь сделать игру в блэкджек, и часть оценки заключается в том, чтобы завершить процесс сделки с использованием класса. Код, который я использую для этого ниже:

class Deal:

    def __init__(self,shuffled_deck,dealt_card):
        self.shuffled_deck = shuffled_deck
        self.dealt_card = dealt_card
    def dealing(self):
        dealt_card = []
        dealt_card += shuffled_deck.pop(0)
        print(dealt_card)

#Dealing the first round of cards

for name in player_hand:
    Deal(shuffled_deck,dealt_card).dealing()
    player_hand[name] += dealt_card

для справки:

  • shuffled_deck - список карт в колоде в случайном порядке
  • dealt_card изначально пустой список

Что я хочу сделать, так это отключить первый элемент в списке карт и установить его равным dealt_card. Затем я хочу добавить карту dealt_card в текущий player_hand - это пара ключ: список в диктоннике. Затем я хочу повторить этот процесс для каждого игрока в словаре.

Что я не понимаю, так это то, что вызов класса Deal () приводит к изменению shuffled_deck и изменениям, происходящим вне класса. Однако изменение переменной dealt_card происходит внутри класса, но вне класса оно остается в виде пустого списка. Почему только половина изменений, внесенных классом, переносится в пространство имен вне его?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Ваши переменные shuffled_deck и dealt_card - это отдельные переменные в разных областях ...

    class Deal:
    def __init__(self,shuffled_deck,dealt_card):
        self.shuffled_deck = shuffled_deck
        self.dealt_card = dealt_card

Это две разные переменные self.shuffled_deck (глобально для класса) и shuffled_deck> (локально), поступающие из функции init - то же самое с dealt_card - это нормально.

    def dealing(self):
        dealt_card = []
        dealt_card += shuffled_deck.pop(0)
        print(dealt_card)

dealt_card - это новая ЛОКАЛЬНАЯ переменная, которую вы только что определили для дилингового метода. shuffled_deck тоже, хотя вы его не определили ... поэтому должно выдать ошибку. Я думаю, что вы хотите self.shuffled_deck здесь.

    #Dealing the first round of cards
    for name in player_hand:
        Deal(shuffled_deck,dealt_card).dealing()
        player_hand[name] += dealt_card

Здесь вы не определили, где находятся shuffled_deck и dealt_card, но затем они передаются в функцию init класса ...

Так что используйте self.shuffled_deck в методах класса, когда вы хотите сослаться на колоду, содержащую класс.

0 голосов
/ 08 сентября 2018

Вот пример функции для раздачи рук в 5-карточном покере:

import random
class Deck:
    def __init__(self,**players):
        self.ranks   = [str(i) for i in range(2,11)] + ['J','Q','K','A']
        self.suits   = 'HDCS'
        self.deck    = [(s,r) for s in self.suits for r in self.ranks]
        self.players = players

    def deal(self):
        random.shuffle(self.deck)
        for player in self.players:
            self.players[player] = [] # empty hands on each deal
            for i in range(5):
                try:
                    card = self.deck.pop()
                    self.players[player].append(card)
                except IndexError:
                    print('Deck ran out! - reshuffling new deck...')
                    self.deck = [(s,r) for s in self.suits for r in self.ranks]
                    self.deal()

Deck = Deck(player1=[],player2=[],player3=[])
Deck.deal()
print(Deck.players)

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

Кроме того, я предполагаю, что вы намеревались разыграть полные руки для каждого игрока (а не одну карту), поэтому в приведенном выше методе deal каждому игроку по очереди раздаются по 5 карт, и словарь игрока обновляется соответствующим образом. чтобы отразить эти сданные карты.

0 голосов
/ 08 сентября 2018

В методе dealing() вам нужно использовать self.shuffled_deck (то есть dealt_card += self.shuffled_deck.pop(0)), так как вы вызываете экземпляр Deal.

Также вы можете захотетьназначить Deal каждого игрока переменной, чтобы отслеживать его, скажем, player_deal[name] = Deal(shuffled_deck,dealt_card) или что-то в этом роде?

...