比较列表中的两张卡

时间:2018-07-01 16:00:53

标签: python python-3.6

我正在尝试写俄语的Schnapsen(Thousand Schnapsen),但我坚持比较表上的两张牌(表列出的只有两张牌)。这里不是完整的代码,因为不需要完整的代码,我必须将我所有的变量从母语翻译成英语。

import random

class Cards:    
    def __init__(self,rank,suit):
        self.rank = rank
        self.suit = suit

    def show(self):
        if self.rank == 10:
            rank = 'J'
        elif self.rank == 11:
            rank = 'Q'
        elif self.rank == 12:
            rank = 'K'
        elif self.rank == 13:
            rank = '10'
        elif self.rank == 14:
            rank = 'A'
        else:
            rank = self.rank
        print(rank,self.suit)

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

    def build(self):

        for suit in ['Spades', 'Clubs', 'Diamonds', 'Hearts']:
            for rank in range(9,15):
                self.cards.append(Cards(rank, suit))

    def shuffle(self):
        random.shuffle(self.cards)

还有Game类,该类没有进行功能检查(列表中之前装有两张卡)

class Game:
    def __init__(self):
        self.table = []    

    def check(self):
        x = self.table[0]
        for card in self.table:
            if card > x:
                # (rest of the code...)

我得到的错误是:

TypeError: '>' not supported between instances of 'Cards' and 'Cards'

我的主要也是唯一的问题是如何按排名比较列表中的两张卡片(或者比列表中有更好的解决方案)。

2 个答案:

答案 0 :(得分:1)

Python对象不会自动支持比较。 card > x要求您的Card至少支持大于比较。

您可以通过直接比较卡片的属性来绕过它。如您在问题中所述,测试应查看哪个卡具有更高的排名,因此您可以在此处使用.rank属性:

if card.rank > x.rank:

.rank属性是一个整数值, do 整数支持比较。

如果卡片之间的所有比较应按等级进行(因此,游戏规则中永远不会考虑卡片的 suit ),那么您可以实施{ {3}};它们在被比较的对象上被调用(首先尝试左边的对象,但是右边的对象也可以被查询,有关详细信息,请参见链接的文档)。对于>__gt__方法将在card上调用,传入x,并应返回TrueFalse;比较可以很简单的排名:

def __gt__(self, other):
    if not isinstance(other, Card):
        # not a card, can't say if this is greater than the other object
        return NotImplemented
    # This card is greater than the other if the rank of this card is greater
    # than the rank of the other
    return self.rank > other.rank

如果<>=<=都应基于相同的属性比较,那么您可以通过仅实现一种此类丰富的比较方法并应用{{ 3}}转到您的Card类。 但是,该修饰符还要求您实现rich comparison methods,这意味着所有card1 == card2相等性测试都将返回True ,因为它们的{{1 }}属性为true ,因此忽略卡片的花色。如果不正确,您可能需要分别实现所有丰富的比较方法。

通过快速阅读@functools.total_ordering class decorator,我发现纸牌的花色在本场比赛中确实很重要:

  

[...] 俄国人Schnapsen具有“婚姻”(一对国王和王后穿着同一套西装),值得加分。

  

在每一轮开始时没有王牌西装,所有西装都是平等的。至少有一个窍门并且仍在结婚的玩家可以通过使用现有婚姻中的King或Queen卡移动并大声宣布该婚姻来宣布婚姻诉讼为王牌。西装X(X对应于婚姻西装)成为王牌,或者说通过宣布婚姻西装为王而获得分数。刚成为王牌的西装将一直保持王牌状态,直到指定新西装成为王牌或直到比赛回合结束为止。

由于这一意义,我这里不会实现丰富的比较方法,而只是在实现中直接使用rankcard.rank属性。

答案 1 :(得分:0)

覆盖__gt__()函数以进行比较。有关覆盖Python中的比较运算符的更多信息,请参见this