忽略或未检测到的列表项

2024-06-29 00:52:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python作为我的第一门语言,并从如何像计算机科学家一样思考的角度研究老处女游戏。我的代码进入了一个无限循环,我不明白为什么我发布了堆栈溢出。我被要求隔离问题并发布更少的代码(好的建议),我现在已经这样做了。你知道吗

问题是:最初,remove_matches会正确地检测并删除除Aces之外的所有cards对象的匹配项。现在,我已经复制了一个小规模的问题,它似乎没有删除任何卡职级匹配。在下面的示例中,我使用了匹配的A和匹配的K。两个匹配都没有被检测到。你知道吗

class Card:
suite_list = ["Clubs", "Diamonds", "Hearts", "Spades"]
rank_list = ["narf", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]
# "narf" is being used as a placeholder for the zeroith item, to allow
# card#'s to match the index #'s

def __init__(self, suite = 0, rank = 0):
    self.suite = suite
    self.rank = rank

def __str__(self):
    return self.rank_list[self.rank]+" of "+self.suite_list[self.suite]



class Deck:
def __init__ (self):
    self.cards = []
    for suite in range (4):
        for rank in range (1, 14):
            self.cards.append(Card(suite, rank))

def __str__ (self):
    s = " "
    for i in range (len(self.cards)):
        s = s + " "*i + str(self.cards[i]) + "\n"
    return s

def remove_card(self,card):
    if card in self.cards:
        self.cards.remove(card)
        return True
    else:
        return False


class Hand(Deck):
def __init__ (self, name = " "):
    self.cards = []
    self.name = name

def __str__(self):
    s = "Hand "+ self.name
    return s+ " contains\n" + Deck.__str__(self)

def remove_matches(self):
    count = 0
    for card in self.cards:
        match = Card(3 - card.suite, card.rank)
        print card, " matches ", match
        if match in self.cards:
            self.cards.remove(card)
            self.cards.remove(match)
            print "Hand %s: %s matches %s" % (self.name, card, match)
            count = 1
    return count

Joes_hand = Hand("Joe")
Joes_hand.cards = [Card(1,1), Card(2,1), Card(1,13), Card(2,13)]
print Joes_hand
Joes_hand.remove_matches()
print
print Joes_hand

Joes_hand = Hand()

首先,我创建了一个名为Joe的玩家,他手上还没有任何卡片对象。你知道吗

Joes_hand.cards = [Card(1,1), Card(2,1), Card(1,13), Card(2,13)]

现在我给乔分配了4张牌。你知道吗

print Joes_hand

然后我印了乔的手,这样我们就可以看到他的卡片了。你知道吗

Hand Joe contains Ace of Diamonds Ace of Hearts King of Diamonds King of Hearts

Joes_hand.remove_matches()

这就是我遇到问题的地方。remove_matches应该移除按等级和颜色匹配的卡片。这是可能的,因为rank和suite是我的Card对象的内置属性。我在remove_matches方法中添加了一个print语句: print card, " matches ", match,用于证明代码能够识别匹配的内容。但由于某种原因,它无法检测到匹配,即使它知道要寻找什么。因此,if语句:if match in self.cards:后面的语句都没有执行。你知道吗

输出:

Ace of Diamonds matches Ace of Hearts Ace of Hearts matches Ace of Diamonds King of Diamonds matches King of Hearts King of Hearts matches King of Diamonds

最后,我再次打印乔的手,以表明所有的卡都没有被删除。你知道吗

print print Joes_hand

Hand Joe contains Ace of Diamonds Ace of Hearts King of Diamonds King of Hearts

下面是remove_matches的另一个例子:

def remove_matches(self):
    count = 0
    for card in self.cards:
        match = Card(3 - card.suite, card.rank)
        print card, " matches ", match
        if match in self.cards:
            self.cards.remove(card)
            self.cards.remove(match)
            print "Hand %s: %s matches %s" % (self.name, card, match)
            count = 1
    return count

很抱歉,我的帖子太长了,我倾向于过度解释,但我想确保我分享了我所有的信息。我是不是漏掉了什么明显的东西?我已经挣扎了好几天了。任何想法都会有帮助。你知道吗

谢谢!你知道吗


Tags: ofselfmatchcardremovesuitecardsprint