Преобразование int с помощью str в список (попытка напечатать целые числа как слова)

Я делаю колоду карт для игры, которую я создал, и сталкиваюсь с проблемой переименования моих лицевых карт. Все карты со значениями 11-14 я хочу сохранить их значение в коде, но показывать пользователю как валет, дама, король и туз (соответственно). Использование функций str() и int() не работает. Использование print().format не работает. И использование словаря класса соответствия не работает. Я не могу заставить отображение работать.

Вместо этого, когда я создаю свою перетасованную колоду, я получаю свою полную колоду плюс 4 дополнительные лицевые карты (4 валета, 4 дамы, 4 короля, 4 туза), которые не прошли через random.shuffle(), хотя я подозреваю, что это потому, что они не прошли через селф.карты.

Вот соответствующий код:

import random

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

    def show(self):
        print('{} of {}'.format(self.value, self.suit))

class Deck(object):
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        for s in ["Joker"]:
            for v in range(1, 3):
                self.cards.append(Card(v, s))
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(2, 15):
                if v is 11:
                    print('{} of {}'.format("Jack", s))
                if v is 12:
                    print('{} of {}'.format("Queen", s))
                if v is 13:
                    print('{} of {}'.format("King", s))
                if v is 14:
                    print('{} of {}'.format("Ace", s))
                self.cards.append(Card(v, s))
    def show(self):
        for c in self.cards:
            c.show()

    def shuffle(self):
        for i in range(len(self.cards)-1, 0, -1):
            random.shuffle(self.cards)

    def draw(self):
        return self.cards.pop()

person Jason Argo    schedule 26.09.2017    source источник
comment
где вы хотите преобразовать это точно?   -  person PRMoureu    schedule 26.09.2017
comment
В методе def build(self), потому что именно там находится список колоды (два диапазона), но я открыт для предложений.   -  person Jason Argo    schedule 26.09.2017
comment
что вы сделали с функцией str? дайте образец...   -  person DRPK    schedule 26.09.2017
comment
Я использовал str() и int() практически в каждой части раздела def build(self): method, но безрезультатно. Например, когда я получил сообщение об ошибке, что для используемого мной метода replace() требуется целое число, я использовал int() для всех значений в этом разделе. Я также обернул str() вокруг каждого значения в этом разделе.   -  person Jason Argo    schedule 26.09.2017
comment
Эй, я рад, что это сработало для вас. К вашему сведению, лучший способ пометить ответ как принятый или полезный — это щелкнуть галочку рядом с ним и / или щелкнуть стрелку вверх, чтобы проголосовать (вместо редактирования исходного сообщения для идентификации выбранного вами решения). Добро пожаловать в СО.   -  person Matt P    schedule 26.09.2017


Ответы (3)


Как вы и подозревали, карты Face нужно обрабатывать методом Card.show().

def show(self):
    if self.value is 11:
        print('Jack of {}'.format(self.suit))
    elif self.value is 12:
        print('Queen of {}'.format(self.suit))
    elif self.value is 13:
        print('King of {}'.format(self.suit))
    elif self.value is 14:
        print('Ace of {}'.format(self.suit))
    else:
        print('{} of {}'.format(self.value, self.suit))

Обратите внимание, что вам нужно будет использовать self.value при проверке того, является ли объект Card лицевой картой (туз, валет, дама, король), и self.suit, чтобы получить масть карты.

Вы также можете удалить все проверки в методе Deck.build(), чтобы он стал:

def build(self):
    for s in ["Joker"]:
        for v in range(1, 3):
            self.cards.append(Card(v, s))
    for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
        for v in range(2, 15):
            self.cards.append(Card(v, s))

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

Пример использования (функция печати python 2.7):

if __name__ == '__main__':
    d = Deck()
    d.show()
    print "number of cards=", len(d.cards)

    d.shuffle()
    c = d.draw()
    c.show()
    print "number of cards=", len(d.cards)
    d.show()
person Matt P    schedule 26.09.2017
comment
Это работает! Красивый. Большое спасибо, Мэтт П. А за это время я узнал кое-что ценное. - person Jason Argo; 26.09.2017

if v is 11:
    print('Jack of {}'.format(s))
else if v is 12:
    print('Queen of {}'.format(s))
else if v is 13:
    print('King of {}'.format(s))
else if v is 14:
    print('Ace of {}'.format(s))

Измените соответствующую часть на это.

person Adi219    schedule 26.09.2017
comment
Я попробовал это без изменений. Я даже изменил else if на elif. Я думаю, что это двойная проблема: я не могу преобразовать int в str, а лишние лицевые карты добавляются в список колод. - person Jason Argo; 26.09.2017

Я думаю, что вам нужен метод __repr__. Если вы добавите следующий метод к объекту Card, то при вызове print(Deck().draw()) вы получите имя карты, а не <__main__.Card object at 0x00000000036359E8>.

def __repr__(self):
    return '{} of {}'.format(self.value, self.suit)

Это то, что ты искал?

person Stuart Buckingham    schedule 26.09.2017