<p>Python对象不自动支持比较。<code>card > x</code>要求您的<code>Card</code>类至少支持</em>大于</em>的比较。在</p>
<p>你可以通过直接比较牌的属性来绕过这个问题。正如您在问题中所述,测试应该查看哪个卡的<em>等级更高</em>,因此您可以在这里使用<code>.rank</code>属性:</p>
<pre><code>if card.rank > x.rank:
</code></pre>
<p><code>.rank</code>属性是一个整数值,整数<em>do</em>支持比较。在</p>
<p>如果<strong>所有</strong>牌之间的比较都应该按等级来进行(所以游戏规则中从不考虑牌的<em>套装</em>),那么您可以实现<a href="https://docs.python.org/3/reference/datamodel.html#object.__lt__" rel="nofollow noreferrer"><em>rich comparison methods</em></a>;这些在被比较的对象上被调用(首先尝试左边的对象,但是右边的对象也可以被查询,参见链接的文档)以获取详细信息)。对于<code>></code>,将在<code>card</code>上调用<code>__gt__</code>,传入<code>x</code>,并应返回<code>True</code>或{<cd10>};以比较可以简单到如下的等级:</p>
^{pr2}$
<p>如果<code><</code>和<code>>=</code>和{<cd13>}都应该基于相同的属性比较,那么您可以通过实现一个这样丰富的比较方法来保持简单,并将<a href="https://docs.python.org/3/library/functools.html#functools.total_ordering" rel="nofollow noreferrer">^{<cd14>} class decorator</a>应用到您的<code>Card</code>类。<strong>但是</strong>,这个decorator还要求您实现一个<a href="https://docs.python.org/3/reference/datamodel.html#object.__eq__" rel="nofollow noreferrer">^{<cd16>} equality test method</a>,这意味着所有<code>card1 == card2</code>等式测试都将返回<code>True</code><em>,因为它们的<code>rank</code>属性为true</em>,因此忽略了卡片的大小。如果不是这样的话,您可能需要分别实现所有富比较方法。在</p>
<p>从<a href="https://en.wikipedia.org/wiki/Russian_Schnapsen" rel="nofollow noreferrer">Wikipedia article on Russian Schnapsen</a>的快速阅读,我可以看出一张牌的套装在这个游戏中确实有意义:</p>
<blockquote>
<p><em>[...]</em> Russian Schnapsen features "marriages" (pairs of a King and Queen of the same suit) which are worth extra points.</p>
</blockquote>
<p>以及</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>因为这一点,我不在这里实现丰富的比较方法,而只是在实现中直接使用<code>card.rank</code>和{<cd21>}属性。在</p>