Как я могу пометить объекты одним или несколькими различными типами тегов, которые можно использовать для их последующей сортировки? - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь написать сценарий, который берет список игральных карт, превращает их в карточные объекты, а затем перетасовывает и запускает тестовые руки, чтобы вы знали, какова вероятность того, что один из них будет у вас в руке, исходя из их количества в Палуба. (в идеале я хотел бы, чтобы он имитировал 10000 рук одновременно).

ПРОБЛЕМА в том, что я не знаю, как пометить эти объекты карты как одну или несколько вещей. Например, королева сердец - это много вещей: это лицевая карта, карта королевы и костюм червей.

Сейчас я беру список карточек и количество копий каждой карточки в колоде и использую класс, чтобы превратить их в список объектов карточек. В конечном итоге это возвращает список кортежей с названием и категорией карты. Затем я использую серию операторов if для сортировки карт по определенным категориям на основе жестко закодированного списка того, для каких карт нужен какой тег.

Проблема в том, что я не знаю, как дать им более одного тега за раз.

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

List = [("queen of hearts", 4), ("king of hearts", 4), ("joker", 3), ("2 of clubs", 4), ("4 of clubs", 2), ("2 of diamonds", 3)]

Type_hearts = {"queen of hearts", "king of hearts", "2 of hearts", "ace of heats"}
Type_face = {"queen of hearts", "queen of diamonds", "king of diamonds", "joker"}
Type_queen = {"queen of hearts", "queen of diamonds"}
Type_joker = {"joker"}

class Card(object):

    def __init__(self, name):
        self.name = name
        #the following if-statement codes card objects into types
        ##in order for an object to fit into these categories, the full and complete name must match exactly
        ###also, right now it looks like these can currently only be one thing at a time :(
        if name in Type_hearts:
            Type = "heart"
        if name in Type_face:
            Type = "face card"
        if name in Type_queen:
            Type = "is queen"
        else:
            Type = None
        self.card_type = Type


    def __repr__(self):
        return f"<{self.name}, {self.card_type}>"
    #now we need to tell the computer how to REPRESENT this class as a string
        #when you implement one of these, just implement both of these to have a textual representation of your class.

    def __str__(self):
        return f"<{self.name}, {self.card_type}>"

class DeckList(object):
    def __init__(self, decklist):
        self.decklist = decklist
        #self.name = name 

        #self.count = count 
        self.deck = []
        #decklist
        for name, count in decklist:
            for i in range(count):
                self.deck.append(Card(name))

Я бы хотел найти способ, чтобы программа могла инициализировать объект для карты, скажем, короля червей, и знать, что это король, лицевая карта и в костюме. сердец. Пока я просто не знаю, как это сделать, и я не могу пометить вещи более чем одной вещью одновременно.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Похоже, вы пытаетесь сделать слишком много со строками. У нас Card класс это хорошо. В настоящее время мы передаем название карты в формате human readable и работаем с этим форматом. Что если мы реструктурируем наши данные, чтобы с ними было легче работать.

Вместо того, чтобы просто брать имя, что если мы получим еще несколько значений

class Card:
    def __init__(self, name, suit, value):
        self.name = name
        self.suit = suit 
        self.value = value

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

    def is_face(self):
        return self.value > 10 # Jack and up is a face card

    def __str__(self):
        return "{} of {}".format(self.name, self.suit)

    def is_queen(self):
        return self.name == "Queen"

    def is_king(self):
        return self.name == "King"

и т.д.

Мы можем сделать несколько с

king_of_hearts = Card("King", "Hearts", 13)
queen_of_spades = Card("Queen" ,"Spades", 12)
ten_of_diamonds = Card("Ten", "Diamonds", 10)

print(king_of_hearts) # King of Hearts
print(queen_of_spades) # Queen of Spades
print(ten_of_diamonds) # Ten of Diamonds

Мы должны быть в состоянии определить type Карты на основании ее данных. Нам не нужно проверять, какие типы должны быть во время строительства.

0 голосов
/ 10 мая 2019

Вместо присвоения единственного значения card_type, вы можете назначить список, чтобы класс стал чем-то вроде -


    def __init__(self, name):
        self.name = name
        #the following if-statement codes card objects into types
        ##in order for an object to fit into these categories, the full and complete name must match exactly
        ###also, right now it looks like these can currently only be one thing at a time :(
        type_list = []
        if name in Type_hearts:
            type_list.append("heart")
        if name in Type_face:
            type_list.append("face card")
        if name in Type_queen:
            type_list.append("is queen")
        self.card_type = type_list


    def __repr__(self):
        return f"<{self.name}, {self.card_type}>"
    #now we need to tell the computer how to REPRESENT this class as a string
        #when you implement one of these, just implement both of these to have a textual representation of your class.

    def __str__(self):
        return f"<{self.name}, {self.card_type}>"```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...