lis中两张卡片的比较

2024-09-26 22:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着写俄语Schnapsen(千张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没有工作功能检查(列表表之前用两张卡片填充)

^{pr2}$

我得到的错误是:

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

我最主要也是唯一的一个问题是,我怎样才能比较列表中的两张牌(或者可能有比在列表中做更好的解决方案)的排名。在


Tags: buildself列表initdefrandomclasscards
2条回答

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

你可以通过直接比较牌的属性来绕过这个问题。正如您在问题中所述,测试应该查看哪个卡的等级更高,因此您可以在这里使用.rank属性:

if card.rank > x.rank:

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

如果所有牌之间的比较都应该按等级来进行(所以游戏规则中从不考虑牌的套装),那么您可以实现rich comparison methods;这些在被比较的对象上被调用(首先尝试左边的对象,但是右边的对象也可以被查询,参见链接的文档)以获取详细信息)。对于>,将在card上调用__gt__,传入x,并应返回True或{};以比较可以简单到如下的等级:

^{pr2}$

如果<>=和{}都应该基于相同的属性比较,那么您可以通过实现一个这样丰富的比较方法来保持简单,并将^{} class decorator应用到您的Card类。但是,这个decorator还要求您实现一个^{} equality test method,这意味着所有card1 == card2等式测试都将返回True,因为它们的rank属性为true,因此忽略了卡片的大小。如果不是这样的话,您可能需要分别实现所有富比较方法。在

Wikipedia article on Russian Schnapsen的快速阅读,我可以看出一张牌的套装在这个游戏中确实有意义:

[...] Russian Schnapsen features "marriages" (pairs of a King and Queen of the same suit) which are worth extra points.

以及

In the beginning of every round there is no trump suit, all suits are equal. The player who has at least one trick taken and still has a marriage in his hand can declare a suit of the Marriage to be a trump suit by making a move with either King or Queen card from available marriage and declaring it out loud by saying that suit X (X corresponds to the marriage suit) becomes a trump, or saying number of scores he gets by declaring a marriage suit a trump. The suit that just became a trump stays a trump until a new suit becomes appointed to be trump or until game round ends.

因为这一点,我不在这里实现丰富的比较方法,而只是在实现中直接使用card.rank和{}属性。在

为大于比较重写^{}函数。有关在Python中重写比较运算符的详细信息,请参见this。在

相关问题 更多 >

    热门问题