Class 纸牌游戏套印

Class 纸牌游戏套印,class,python-3.x,simulation,Class,Python 3.x,Simulation,我正在学习一本非常好的python书籍,它教你如何为一些纸牌游戏创建模拟。正如您在下面看到的,我创建了一个类“Card”,用于索引牌组中所有可能的牌组合。然后我创建了一个类“Deck”,它通过“Card”中的卡片组合来制作卡片组。我的问题是,我试图打印这副牌,每次它都给我“黑桃之王”。如果我更改循环中的范围以创建甲板,它将为我提供其他内容。我是不是在范围上做错了什么,或者是在类函数上做错了什么?如果有的话,我希望代码对你们中的一些人来说是有趣的。任何帮助都将不胜感激。谢谢 class Card:

我正在学习一本非常好的python书籍,它教你如何为一些纸牌游戏创建模拟。正如您在下面看到的,我创建了一个类“Card”,用于索引牌组中所有可能的牌组合。然后我创建了一个类“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)

我很确定答案在于这句话:

self.cards.append(卡片(套装、等级))

黑桃王是最后一张被添加到牌组中的牌,这不是巧合,我认为这是对象被传递引用的问题。当我可以的时候,我会用一个正确的答案来更新这个,但这可能会让你更好地了解出了什么问题

编辑:这应该有用

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

这是一个如何初始化
类的问题

class Card:
    def __init__(self, suit = 0, rank = 2):
        self.suit = suit
        self.rank = rank
初始化类需要使用
self
参数

此外,您在
Deck
类中使用的
\uuu repr\uuuu
的实现也存在问题,我认为它并不是在做您想要的事情。调用
print(deck)
时,它会查找
deck
\uuuu str\uuuu
方法,如果找不到该方法,则会查找
\uu repr\uu
。代码中的问题是,返回值只是过早地将您引导出循环

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
但更好的方法是删除这个
范围(len())
,因为它完全没有必要,而且更难阅读:

def __repr__(self):
    s = ""
    for card in self.cards:
        s = s + " " + str(card) + "\n"

    return s

另外,如果您在一个确实应该使用
\uuuuuuu str\uuuuuuuuu
的地方使用
\uuuuu repr\uuuuuuu
\uuuuuuuu repr\uuuuuuuuu>意味着能够使用输出完全重新创建类。基本上,
\uuuu repr\uuu
是可以实例化和重新创建类的有效python代码。如果你想要一个像你在这里所做的那样的类的非正式字符串表示,那么使用
\uuu str\uuu
是pythonic约定。

我对编程有点陌生,你能解释一下你的意思吗?您的意思是在初始化Card类的代码的最开始,还是在init deck函数中?谢谢你的澄清@srhoades28,这里到底有什么不合理的地方?所以我一直在向代码中添加更多功能,并遇到了另一个问题。我试图创建代码来从牌组中移除一张牌,但是尽管该牌在牌组中,程序仍然不返回任何结果。这是因为它没有在列表中找到深度相等吗?这是额外的删除函数:“def removeCard(self,card):如果self.cards中的card:self.cards.remove(card)返回True,否则:pass'@srhoades28,如果没有看到您编写的代码,就很难知道发生了什么。