我正在关注一本非常好的python书,它教你如何为某些纸牌游戏创建模拟。正如您在下面所见,我创建了一个类“卡”,用于索引卡中所有可能的卡组合。然后我创建了一个“Deck”类,它从“Card”中的卡组合制作了套牌。我的问题是,我正在尝试打印套牌,每次它给我“黑桃王”。如果我改变循环中的范围来创建套牌,它将给我一些其他东西。我是否对范围做错了,或者类功能有问题呢?如果有的话,我希望代码对你们有些感兴趣。任何帮助,将不胜感激。感谢。
class Card:
def __init__(self, suit = 0, rank = 2):
Card.suit = suit
Card.rank = rank
#Two class attributes that are helpful in determining suit/rank
ranklist = ['narf', 'Ace', 'One', 'Two', 'Three', 'Four', 'Five' \
'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King']
suitlist = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
def __repr__(self):
return (self.ranklist[self.rank] + " of " + self.suitlist[self.suit])
class Deck:
def __init__(self):
self.cards = []
for suit in range(4):
for rank in range(1,14):
self.cards.append(Card(suit,rank))
def printDeck(self):
for card in self.cards:
print(card)
def __repr__(self):
s = ""
for i in range(len(self.cards)):
s = s + " " + str(self.cards[i]) + "\n"
return s
deck = Deck()
print(deck)
答案 0 :(得分:1)
这是关于如何初始化Card
类
class Card:
def __init__(self, suit = 0, rank = 2):
self.suit = suit
self.rank = rank
初始化类需要self
参数。
此外,您在__repr__
课程中使用的Deck
的实施存在问题我不认为它正在按照您的意愿行事。当您致电print(deck)
时,它会查找__str__
的{{1}}方法,然后如果找不到,则会查找deck
。代码中的问题是返回值只是过早地将你引出循环。
__repr__
而是这样做:
def __repr__(self):
s = ""
for i in range(len(self.cards)):
s = s + " " + str(self.cards[i]) + "\n"
return s #oops leaves your loop on the first iteration
但更好的是删除此def __repr__(self):
s = ""
for i in range(len(self.cards)):
s = s + " " + str(self.cards[i]) + "\n"
return s #now it gets the whole string in s before returning
,因为它完全没必要且更难阅读:
range(len())
此外,您在{true}应该使用def __repr__(self):
s = ""
for card in self.cards:
s = s + " " + str(card) + "\n"
return s
的地方使用__repr__
,__str__
意味着能够使用输出完全重新创建类。基本上__repr__
是有效的python代码,它可以实例化并重新创建类。如果你想要一个类的非正式字符串表示,就像你在这里一样,那么使用__repr__
就是pythonic约定。
答案 1 :(得分:0)
我很确定答案在于:
self.cards.append(Card(suit,rank))
黑桃王是加入甲板的最后一张牌并非巧合,我认为这是对象被传递参考的问题。我尽可能用适当的答案更新这个,但这可能会让你更好地了解哪里出错
编辑:这应该有效
class Card:
def __init__(self):
Card.suit = 0
Card.rank = 2
#Two class attributes that are helpful in determining suit/rank
ranklist = ['narf', 'Ace', 'One', 'Two', 'Three', 'Four', 'Five' \
'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King']
suitlist = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
def __repr__(self):
return (self.ranklist[self.rank] + " of " + self.suitlist[self.suit])
class Deck:
def __init__(self):
self.cards = []
for suit in range(4):
for rank in range(1,14):
x = Card()
x.suit = suit
x.rank = rank
self.cards.append(x)
def printDeck(self):
for card in self.cards:
print(card)
def __repr__(self):
s = ""
for i in range(len(self.cards)):
s = s + " " + str(self.cards[i]) + "\n"
return s
deck = Deck()
deck.printDeck()