我正在尝试写俄语的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'
我的主要也是唯一的问题是如何按排名比较列表中的两张卡片(或者比列表中有更好的解决方案)。
答案 0 :(得分:1)
Python对象不会自动支持比较。 card > x
要求您的Card
类至少支持大于比较。
您可以通过直接比较卡片的属性来绕过它。如您在问题中所述,测试应查看哪个卡具有更高的排名,因此您可以在此处使用.rank
属性:
if card.rank > x.rank:
.rank
属性是一个整数值, do 整数支持比较。
如果卡片之间的所有比较应按等级进行(因此,游戏规则中永远不会考虑卡片的 suit ),那么您可以实施{ {3}};它们在被比较的对象上被调用(首先尝试左边的对象,但是右边的对象也可以被查询,有关详细信息,请参见链接的文档)。对于>
,__gt__
方法将在card
上调用,传入x
,并应返回True
或False
;比较可以很简单的排名:
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对应于婚姻西装)成为王牌,或者说通过宣布婚姻西装为王而获得分数。刚成为王牌的西装将一直保持王牌状态,直到指定新西装成为王牌或直到比赛回合结束为止。
由于这一意义,我这里不会实现丰富的比较方法,而只是在实现中直接使用rank
和card.rank
属性。
答案 1 :(得分:0)