我试着写俄语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
没有工作功能检查(列表表之前用两张卡片填充)
我得到的错误是:
TypeError: '>' not supported between instances of 'Cards' and 'Cards'
我最主要也是唯一的一个问题是,我怎样才能比较列表中的两张牌(或者可能有比在列表中做更好的解决方案)的排名。在
Python对象不自动支持比较。
card > x
要求您的Card
类至少支持大于的比较。在你可以通过直接比较牌的属性来绕过这个问题。正如您在问题中所述,测试应该查看哪个卡的等级更高,因此您可以在这里使用
.rank
属性:.rank
属性是一个整数值,整数do支持比较。在如果所有牌之间的比较都应该按等级来进行(所以游戏规则中从不考虑牌的套装),那么您可以实现rich comparison methods;这些在被比较的对象上被调用(首先尝试左边的对象,但是右边的对象也可以被查询,参见链接的文档)以获取详细信息)。对于};以比较可以简单到如下的等级:
^{pr2}$>
,将在card
上调用__gt__
,传入x
,并应返回True
或{如果}都应该基于相同的属性比较,那么您可以通过实现一个这样丰富的比较方法来保持简单,并将^{} class decorator 应用到您的} equality test method ,这意味着所有
<
和>=
和{Card
类。但是,这个decorator还要求您实现一个^{card1 == card2
等式测试都将返回True
,因为它们的rank
属性为true,因此忽略了卡片的大小。如果不是这样的话,您可能需要分别实现所有富比较方法。在从Wikipedia article on Russian Schnapsen的快速阅读,我可以看出一张牌的套装在这个游戏中确实有意义:
以及
因为这一点,我不在这里实现丰富的比较方法,而只是在实现中直接使用}属性。在
card.rank
和{为大于比较重写^{} 函数。有关在Python中重写比较运算符的详细信息,请参见this。在
相关问题 更多 >
编程相关推荐