【问题标题】:Turning strings in a list to integers将列表中的字符串转换为整数
【发布时间】:2014-07-10 10:09:37
【问题描述】:

我正在制作二十一点游戏,需要一些帮助。 我希望能够打开一个字符串列表,例如:

unused_cards1 = ['AS', '2S', '3S', '4S', '5S', '6S', '7S', '8S', '9S', 'TS', 'JS', 'QS', 'KS', 'AC', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 'AH', '2H', '3H', '4H', '5H', '6H', '7H', '8H', '9H', 'TH', 'JH', 'QH', 'KH', 'AD', '2D', '3D', '4D', '5D', '6D', '7D', '8D', '9D', 'TD', 'JD', 'QD', 'KD']

当我将一个随机添加到一手牌时,它们的适当整数:

player_1_hand = []

我希望它在我展示手牌时保留它的字符串属性,并保留它的整数属性以便实际玩游戏,但问题是,我还希望将所选卡片从 used_cards1 列表中删除进入弃牌堆:used_cards = []

我该怎么做?任何方式都会有所帮助...

谢谢!

【问题讨论】:

  • QD 的合适 int 是什么(例如)?
  • A = 1, 2 = 2 ... 10 = 10, J = 10, Q = 10, K = 10。所有花色的整数相同。
  • 也许想想字典?
  • 我认为你想要一个类 - 然后你可以实现例如__eq____str__ 为每个 Card 提供适当的行为。
  • 王牌是 1 还是 11? ;-)

标签: python string list int blackjack


【解决方案1】:

另一种方法是创建一个Card 类:

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

    def face_value(self):
        return #insert face value computation here

根据需要添加其他方法(例如:__str__suit 等)。

然后在你的初始卡片组中,执行以下操作:

unused_cards1 = map(Card, ['AS', '2S', '3S', '4S', '5S', '6S', '7S', '8S', ...])

unused_cards1 将成为Card 对象的列表,而不仅仅是字符串。

【讨论】:

  • 参考stackoverflow.com/questions/23643122/…Hand.score算法。一张牌的分数取决于它所在的手牌。
  • @IceArdor ,但这在这里并不真正相关......但是你是对的,这是关于在二十一点中实现一张确实有分数的卡,这取决于你必须要的手牌调整 A 的手牌分数......但就牌而言,它不知道手牌,因此它具有谨慎的价值
【解决方案2】:
value_dict = dict(zip("23456789TJQKA",[2,3,4,5,6,7,8,9,10,10,10,10,11]))
p1_hand = ["AS","KS"]
p1_values = [value_dict[val[0]] for val in p1_hand]

甚至更好地使用类

【讨论】:

    【解决方案3】:

    我的建议是上课:

    class Card(object):
    
        FACES = {1: 'Ace', 11: 'Jack', 12: 'Queen', 13: 'King'}
        SUITS = {'S': 'Spades', 'D': 'Diamonds', 'C': 'Clubs', 'H': 'Hearts'}
    
        def __init__(self, suit, face):
            self.suit = suit
            self.face = face
    
        # Logic for how the Card is displayed:
        def __str__(self):
            return "{0} of {1}".format(self.FACES.get(self.face, self.face),
                                       self.SUITS[self.suit])
    
        # Logic for how the Card compares to others:
        def __eq__(self, other):
            return self.face == other.face
    
        def __lt__(self, other):
            return self.face < other.face
    
        # Logic for creating Card from string:
        @classmethod
        def from_string(cls, s):
            faces = {'A': 1, 'J': 11, 'Q': 12, 'K': 13}
            face, suit = s[:-1], s[-1]
            try:
                face = int(face)
            except ValueError:
                face = faces[face]
            return cls(suit, face)
    

    它们现在可以像这样使用:

    >>> card1 = Card.from_string("AS")
    >>> card2 = Card.from_string("10D")
    >>> str(card1)
    'Ace of Spades'
    >>> str(card2)
    '10 of Diamonds'
    >>> card1 < card2
    True
    

    【讨论】:

      【解决方案4】:

      听起来像字典就是你想要的:

      >>> cards = {'AS' : 11, '2S' : 2, etc...}  # default aces to 11
      >>> cards['AS']
      1
      

      然后您可以将卡片添加到已用卡片列表中:

      # use the card somehow
      used_cards.append('AS')
      

      如果牌是 ace 并且分数为 21,则在添加分数时将分数减少 10,这实际上使 ace == 1。这也只会在手中有 2 个时改变一个 ace 的值:

      for ele in hand:
          score += cards[ele]
          if score > 21 and ele in ('AS', 'AC', 'AH', 'AD'):
              score -= 10
      

      【讨论】:

      • 这是行不通的,因为 A 的得分是 11 还是 1,这取决于它所在的手牌。如果使用字典将卡片名称映射到得分,请去掉花色,这样字典只包含 13 个项目而不是 52 个。
      • OP 在评论中说A = 1。他并没有暗示它会等于 1 或 11,具体取决于上下文。
      • 对不起,我应该提到它可以用作 1 或 11 :S
      • 谢谢 :) ... 这有帮助
      • 但是我怎样才能随机选择其中一张牌,然后将其删除作为下一个玩家的选择呢?抱歉...我对此还是很陌生。 :(
      猜你喜欢
      • 1970-01-01
      • 2015-01-14
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      相关资源
      最近更新 更多