Задать вопрос
@DrMorro

Как реализовать колоду карт через классы на python?

Я только начал знакомиться с классами и хочу решить такую задачу: Создать колоду карт, для колоды создать несколько карт с разными атрибутами - все через классы. У колоды должны быть функции: вывести свое содержимое сортируя по группам, по хп, атаке и так далее. Потом можно будет создать еще одну колоду с другими картами и еще что-нибудь придумать. У меня пока только так получилось. Мне кажется, что это неоптимальный вариант, поскольку в том направлении, в котором я начал есть и еще будет много повторения кода и т. п. Я хотел бы понять как устроены классы и как их лучше реализовывать. Мне говорили, что подклассы опциональных и их всегда можно реализовать как-то с наследованием - только я не понимаю как такое сделать наследованием. Поэтому будут ли у вас какие-то советы как лучше такой концепт реализовать?

class Deck():
    num_of_cards = 0
    group_name = { "Intelegence" : [], "Strength" : [], "Agility" : [] }
    
    def __init__(self, deck_name = "Колода", date = None):
        self.deck_name = deck_name
        self.date = date
        
    def print_by_group(self):
        for key in self.group_name:
            print(f"Группа {key}:")
            for name in self.group_name[key]:
                print(f"  {name}") 
                
    class Card():
        
        def __init__(self, name, phys_damage, hp):
            self.name = name
            self.phys_damage = phys_damage
            self.hp = hp
            
            Deck.num_of_cards += 1
    
    class CardInt(Card):
        group = "Intelegence"
        def __init__(self, name, phys_damage, hp, mage_damage):
            super().__init__(name, phys_damage, hp)
            self.mage_damage = mage_damage
            Deck.group_name[self.group].append(self.name) 
            
    class CardStr(Card):
        group = "Strength"
        def __init__(self, name, phys_damage, hp, add_hp):
            super().__init__(name, phys_damage, hp)
            
            self.hp = hp + add_hp
            Deck.group_name[self.group].append(self.name)
            
    class CardAgl(Card):
        group = "Agility"
        def __init__(self, name, phys_damage, hp, armor):
            super().__init__(name, phys_damage, hp)
            
            self.armor = armor
            Deck.group_name[self.group].append(self.name)

my_deck = Deck("Моя колода", "24.05.2022")

# name, phys_damage, hp

techies = my_deck.CardInt("Течис", 32, 600, 100)
earth_spirit = my_deck.CardInt("Земеля", 40, 600, 60)
pudge = my_deck.CardStr("Рудге", 80, 600, 150)
antimage = my_deck.CardAgl("Крип", 60, 600, 10)

my_deck.print_by_group()
  • Вопрос задан
  • 1288 просмотров
Подписаться 2 Простой Комментировать
Ответ пользователя mayton2019 К ответам на вопрос (2)
mayton2019
@mayton2019
Bigdata Engineer
Для проверки свойств карты я-бы использовал представление кода карты как битовое число. Биткарта.
К примеру - карты делятся на красные и черные масти. Это один бит. Далее цвета делятся на трефы, пики
и т.п. Еще один бит. Тоесть двумя битами от 00 до 11 мы полностью кодируем масть. И ранг карты в игре
(он может менятся в зависимости от вида игры) можно закодировать еще четырьмя битами. Итого шесть бит.
Плюс еще отдельно остается джокер как карта универсал. Для нее можно ввести один бит масти как признак
того что масть игнорируется например. Итого 7 бит. Такой код карты удобно сортировать например или представлять различные проверки условий.
Ответ написан