Удаление пользовательского объекта (карты) из списка (руки игрока) в python - PullRequest
1 голос
/ 02 февраля 2020

Извините, я новичок в python, извините, если вопрос слишком базовый c. Я пытаюсь написать код для карточной игры pishti или bastra. Вкратце, у двух игроков (в моем случае пользователя и компьютера) есть руки, состоящие из 4 карт каждая, а в середине есть несколько карт, одна из которых сверху и видима игрокам (другие закрыты). Вскоре я смог раздать карточки для пользователя со списком из четырех карточных объектов. Однако после того, как пользователь разыграет одну из своих карточек, я не могу удалить карточку из списка, поскольку ее невозможно найти. (Я пытался использовать .remove () и del). Однако я могу получить доступ к карточкам со списком [index]. Вот мой код (сокращенный до частей, связанных с этим вопросом):

import random
class Card:
    def __init__(self,value,suit):
        self.value = value
        self.suit = suit
    def __repr__(self):
        return f"{self.suit} {self.value}"
    def execute(self):
        return None
class Deck:
    def __init__(self):
        suits = ["Hearts","Spades","Clubs","Diamonds"]
        values = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
        self.cards = [Card(value,suit) for value in values for suit in suits]
    def __repr__(self):
        return f"Deck of {self.count()}"
    def count(self):
        return len(self.cards)
    def shuffle(self):
        if self.count() < 52:
            raise ValueError ("Sorry only complete decks can be shuffled.")
        random.shuffle(self.cards)
        return self
    def _deal(self,num_of_cards_to_be_dealt):
        if self.count() == 0:
            raise ValueError ("Sorry, all of the cards have been dealt.")
        actual = min(self.count(),num_of_cards_to_be_dealt)
        dealt_cards = self.cards[-actual:]
        self.cards = self.cards[:-actual]
        return dealt_cards
    def deal_hand(self,hand_size = 4):
        return self._deal(hand_size)

deste = Deck()
kar_deste = deste.shuffle()


orta = (kar_deste.deal_hand())

print(f"The card in the middle: {orta[-1]}")
user_score = 0
comp_score = 0
while kar_deste.count() != 0:
    computer_hand = kar_deste.deal_hand()
    user = kar_deste.deal_hand()
    print(f"Your cards: {user}")
    while len(user) != 0:
        card_suit = input("Choose a suit: ")
        card_val = input("Choose a value: ")
        print(str(Card(card_val,card_suit)))
        user_turn = Card(card_val,card_suit)
        card_index = user.index(user_turn)
        del user[card_index]
        print(user)

Когда я запускаю В этом коде я обнаружил ошибку значения (в строке с user.index ()), указав, что карты нет в списке. Однако я могу получить к нему доступ вручную, используя его индекс. Таким образом, я не знаю, почему это не работает. У вас есть идеи, что может быть причиной этого? Заранее спасибо.

1 Ответ

2 голосов
/ 02 февраля 2020

.index вызывает метод __eq__ объектов, поэтому вам придется реализовать его в Card. В противном случае объекты будут сравниваться по адресам их памяти.

Возможная реализация:

def __eq__(self, other):
    return all((isinstance(other, self.__class__),
                self.suit == other.suit,
                self.value == other.value))

Тогда

The card in the middle: Clubs 4
Your cards: [Diamonds 10, Hearts K, Clubs 10, Hearts 5]
Choose a suit: Hearts
Choose a value: 5
Hearts 5
[Diamonds 10, Hearts K, Clubs 10]
Choose a suit: Diamonds
Choose a value: 10
Diamonds 10
[Hearts K, Clubs 10]
Choose a suit: Hearts
Choose a value: K
Hearts K
[Clubs 10]
Choose a suit: Clubs
Choose a value: 10
Clubs 10
[]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...