【问题标题】:Ranking Cards to Compare要比较的排名卡
【发布时间】:2019-08-02 08:31:07
【问题描述】:

我创建了一个名为 Deck 的类来表示 Python 中的一副扑克牌。除了小丑之外,我在其中制作了所有牌的牌堆。我正在尝试制作一个中间游戏,我必须在其中比较值。

         ["2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC",
         "QC", "KC", "AC", "2D", "3D", "4D", "5D", "6D", "7D", "8D",
         "9D", "10D", "JD", "QD", "KD", "AD", "2H", "3H", "4H", "5H",
         "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", "AH", "2S",
         "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS",
         "KS", "AS"]

这是卡片列表。我如何对这些进行排名,例如,2C 小于 3C 或 4D 但与 2H 或 2S 相同?

我想知道我是否可以使用 OrderedEnum,但同时在此过程中为 2C、2D、2H、2S 分配相同的排名。

我希望当我使用“发牌”方法时,我希望能够比较已发的两张牌。

【问题讨论】:

标签: python ranking playing-cards


【解决方案1】:

这将按照描述的顺序生成你的牌组的副本,假设 A 小(将 A 移动到字符串的末尾以使 A 高):

sorted(deck,key=lambda x:"A234567891JQK".index(x[0]))

【讨论】:

    【解决方案2】:

    我也会创建一个名为 Card 的类 - 只是这个字符串的一个包装器,但它实现了比较方法:

    ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K", "A"]
    suits = ["C", "D", "H", "S"]
    
    class Card:
        def __init__(self, text):
            self.rank = text[0]
            self.suit = text[1]
        def __eq__(self, obj):
            return (self.rank, self.suit) == (obj.rank, obj.suit)
        def __lt__(self, obj):
            return (ranks.find(self.rank), suits.find(self.suit)) < (ranks.find(obj.rank), suits.find(obj.suit))
        def __str__(self):
            return f"{self.rank}{self.suit}"
        def __repr__(self):
            return str(self)
    

    之后,您可以使用一些列表推导来构建您的套牌:

    import itertools
    ...
    deck = [Card(''.join(c)) for c in itertools.product(ranks, suits)]
    print(deck)
    # [2C, 2D, 2H, 2S, 3C, 3D, 3H, 3S, 4C, 4D, 4H, 4S, 5C, 5D, 5H, 5S, 6C, 6D, 6H, 6S, 7C, 7D, 7H, 7S, 8C, 8D, 8H, 8S, 9C, 9D, 9H, 9S, JC, JD, JH, JS, QC, QD, QH, QS, KC, KD, KH, KS, AC, AD, AH, AS]
    

    如果您不想订购套装,只需将它们从 __eq____lt__ 中删除即可:

    def __eq__(self, obj):
        return self.rank == obj.rank
    def __lt__(self, obj):
        return ranks.find(self.rank) < ranks.find(obj.rank)
    

    此解决方案还可以相当容易地添加一个小丑并为其插入特殊行为。

    【讨论】:

      【解决方案3】:

      用字符串表示所有数据是初级程序员的常见病。我们将此类代码称为“字符串类型”,作为“强类型”的双关语。一般来说,字符串应该只用于表示人类阅读或书写的实际文本,其他一切都应该是数字。

      例如,一张牌是花色和等级的组合。由于我们经常想要比较排名,因此将排名设置为一个简单的整数是有意义的,其中排名最低的卡片具有最低的价值。花色可以是 0..3,任意分配(尽管我将使用几个游戏通用的排名:C、D、H、S)。

      前面的数组和字典用于将文本转换为/从文本显示给人类和人类输入,但根本不需要用于游戏逻辑本身。那只是使用数字,这些数字易于比较且操作高效。

      rank_names = [ "2","3","4","5","6","7","8","9","T","J","Q","K","A" ]
      suit_names = [ "C", "D", "H", "S" ]
      rank_values = { rank_names[i]: i for i in range(13) }
      suit_values = { suit_names[i]: i for i in range(4) }
      
      class Card:
          def __init__(self, rank, suit):
              self.rank = rank
              self.suit = suit
      
          def name(self):
              return rank_names[self.rank] + suit_name[self.suit]
      
          @classmethod
          def from_name(cls, name):
              return cls(rank_values[name[0]], suit_values[name[1]])
      
          def __lt__(self, other):
              return self.rank < other.rank
      
      deck = [ Card(r,s) for r in range(13) for s in range(4) ]
      

      ...等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        相关资源
        最近更新 更多