【问题标题】:Converting int with str into list (trying to print integers as words)将 int 与 str 转换为列表(尝试将整数打印为单词)
【发布时间】:2018-03-08 02:36:19
【问题描述】:

我正在为我创建的游戏制作一副牌,并且遇到了重命名我的面卡的问题。所有值为 11-14 的卡片我想在代码中保留它们的值,但向用户显示为 Jack、Queen、King 和 Ace(分别)。使用 str()int() 函数不起作用。使用print().format 不起作用。并且使用匹配类字典不起作用。我无法使映射工作。

相反,当我实例化我的洗牌套牌时,我得到了我的完整套牌加上 4 张额外的面牌(4 张 J,4 张 Q,4 张 K,4 A),但我怀疑这是因为他们没有通过 self.cards。

以下是相关代码:

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()

【问题讨论】:

  • 你想把它精确地转换到哪里?
  • 在 def build(self) 方法中,因为这是套牌列表所在的位置(两个范围),但我愿意接受建议。
  • 你用str函数做了什么?给我一个样品...
  • 我在“def build(self):”方法部分的几乎每个部分都使用了 str() 和 int(),但无济于事。例如,当我收到我使用的 replace() 方法需要一个整数的错误时,我对该部分中的所有值都使用了 int()。我还将 str() 包裹在该部分中的每个值周围。
  • 嘿,很高兴它对你有用。仅供参考,将答案标记为已接受或有帮助的最佳方法是单击其旁边的复选标记和/或单击向上箭头进行投票(而不是编辑您的原始帖子以标识您选择的解决方案)。欢迎来到 SO。

标签: python data-conversion


【解决方案1】:

正如您所怀疑的,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))

请注意,在检查 Card 对象是否为 Face 牌(Ace、Jack、Queen、King)时,您需要使用 self.value,并使用 self.suit 来获取 Card 的花色。

你也可以去掉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 张牌的套牌以及 2 个额外的小丑。我测试了其他 Deck 方法,在这些更改之后一切似乎都很好。

示例用法(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()

【讨论】:

  • 这行得通!美丽的。非常感谢,Matt P。与此同时,我学到了一些有价值的东西。
【解决方案2】:
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))

把相关部分改成这个。

【讨论】:

  • 我试过了,没有任何变化。我什至把“else if”改成了“elif”。我认为这是一个双重问题:我无法将 int 转换为 str,并且额外的面卡被附加到 Deck 列表中。
【解决方案3】:

我认为您想要的是__repr__ 方法。如果将以下方法添加到 Card 对象,当您调用 print(Deck().draw()) 时,您将获得卡片名称而不是 <__main__.Card object at 0x00000000036359E8>

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

这就是你要找的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多