#python #class #oop #object #instance
#python #класс #ооп #объект #экземпляр
Вопрос:
Я пытаюсь изучить Python и пытаюсь создать игру в блэкджек. Я создал Person
класс, в котором у него есть вызываемая переменная экземпляра self.hand
. self.hand
это пустой список, который должен содержать 2 начальные карты, и оттуда любой игрок, которому нужна карта, получит карту с помощью метода append. Однако у меня это по какой-то причине не работает. Кто-нибудь, пожалуйста, помогите, это беспокоит меня уже несколько дней!!
Я уже пытался создать get_add_card
(получить дополнительную карточку) метод экземпляра и попытался вручную добавить новый объект card в список раздач persons. Ничего не сработало.
Первый фрагмент кода — это Person
класс. В этом классе я определяю self.hand
как список, в котором изначально будут храниться 2 объекта card ( get_cards
). После этого я создал другой метод, который при необходимости должен добавить другую карточку в список. Второй блок кода должен проверить, кому нужна карточка, а затем добавить случайную карточку к этому списку конкретных лиц.
class Person:
def __init__(self, name):
self.name = name
self.hand = []
self.get_cards()
def get_cards(self):
for i in range(2):
rand_card = random.choice(Deck.cards)
self.hand.append(rand_card)
Deck.cards.remove(rand_card)
def get_add_card(self):
self.hand.append(random.choice(Deck.cards))
need_card = True
while need_card:
answer = input("Does anyone need a card? Yes or No")
if answer.lower() == 'no':
need_card = False
elif answer.lower() == 'yes':
player_need = input("Which player needs a card?").lower()
Person(player_need).get_add_card()
print (Person(player_need).hand)
else:
print("Please answer using yes or no")
Код должен добавить случайную карту в список раздач людей. Однако этого не происходит, и когда я пытаюсь распечатать их руку в конце, это показывает только, что это две карты, с которыми человек начал в начале.
Комментарии:
1. Пожалуйста, сделайте правильный отступ в своем коде.
2. Добавьте обратные метки («) до и после вашего блока кода. Кроме того, почему существуют
player_need
и aneed_player
?3. @gmds, нет, не добавляйте обратные ссылки. Просто добавьте пробелы по мере необходимости.
4. я только что сделал отступ, пожалуйста, проверьте это сейчас
5. Вам нужно сделать отступ во всем коде на дополнительные четыре пробела.
{}
Кнопка в редакторе сделает это за вас, если вы выделите весь код после того, как вставите его.
Ответ №1:
Ваша проблема в том, что каждый раз, когда вы это делаете Person(need_player)
, вы создаете отдельный Person
объект. Даже если вы используете тот же самый name
объект, это не тот же объект, что и раньше, и у него будет отдельный список в качестве hand
атрибута.
Чтобы избежать повторного создания ваших проигрывателей снова и снова, вы должны создать их заранее и поместить в список или словарь:
# up front, create the players (perhaps by prompting, but here hard-coded)
players = {"alice": Person("Alice"), "aob": Person("Bob")}
# later, you can look them up by name:
player_need = input("Which player needs a card?").lower()
players[player_need].get_add_card()
print(players[player_need]).hand)
Вероятно, вам понадобится немного больше логики, чтобы избежать ошибок, если пользователь вводит неизвестное имя, но это должно дать вам общее представление.