纸牌游戏甲板印刷

时间:2014-02-07 01:04:36

标签: class python-3.x simulation

我正在关注一本非常好的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)

2 个答案:

答案 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()