首页 > 解决方案 > 为什么在卡片组的这个while循环中绘制同一张卡片?

问题描述

我在下面的代码中构建了一副卡片。我正在运行一个while循环来尝试从牌组中抽牌,但在牌组的整个长度上重复抽出同一张牌。显然,我想要的是每次都抽不同的牌。

我究竟做错了什么?

import random


class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def show(self):
        print("{} of {}".format(self.value, self.suit))
        return self.value


class Deck(object):
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1, 14):
                self.cards.append(Card(s, v))
                #print("{} of {}". format(v, s))

    def show(self):
        for cards in self.cards:
            print(cards.show())

    def shuffle(self):
        random.shuffle(self.cards)

    def draw_card(self):
        return self.cards.pop()


class Player(object):
    def __init__(self, name):
        self.name = name
        self.hand = []

    def draw(self, Deck):
        self.hand.append(Deck.draw_card())
        return self

    def show_hand(self):
        for card in self.hand:
            card.show()
            return card.value


Computer = Player("Computer")
deck = Deck()
deck.shuffle()
while len(deck.cards) > 0:
    Computer.draw(deck)
    Computer.show_hand()

标签: pythonoop

解决方案


show_hand有一个循环,它在第一次迭代时立即退出,所以它只打印第一张牌然后退出......不管手中有多少张牌。所以抽牌没有问题。问题出在印刷...

由于card.show() 打印了一些东西,show_hand所以真的不应该返回任何东西,你应该让循环进行所有的迭代。

所以我建议将其更改为:

    def show_hand(self):
        for card in self.hand:
            card.show()

然后只调用一次,如下所示:

while len(deck.cards) > 0:
    Computer.draw(deck)
Computer.show_hand()

一些改进

我会避免调用print. 由于关注点分离的原则,这真的不应该在一个类中完成,而是留给主驱动程序代码。

此外,如果玩家的手也是Deck. 这样,您也可以将该类别的力量应用到玩家的手上。

最后,使用__repr__方法来控制类的实例如何以字符串格式表示。

例如:

import random


class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def __repr__(self):
        return "{} of {}".format(self.value, self.suit)


class Deck(object):
    def __init__(self):
        self.cards = []

    def fill(self):
        self.cards = []
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1, 14):
                self.add(Card(s, v))
        return self

    def __repr__(self):
        return ", ".join(repr(card) for card in self.cards)

    def shuffle(self):
        random.shuffle(self.cards)
        return self

    def draw(self):
        return self.cards.pop()

    def add(self, card):
        self.cards.append(card)
        return self


class Player(object):
    def __init__(self, name):
        self.name = name
        self.hand = Deck()

    def draw(self, deck):
        self.hand.add(deck.draw())
        return self

    def __repr__(self):
        return "{} has {}".format(self.name, self.hand)


Computer = Player("Computer")
deck = Deck().fill().shuffle()
k = 3
for _ in range(k):
    Computer.draw(deck)
print("After drawing {} cards:\n{}".format(k, Computer))

把它变成游戏

这里后一种想法用于运行“低/高”的游戏:

import random


class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def __repr__(self):
        return "{} of {}".format(self.value, self.suit)


class Deck(object):
    def __init__(self):
        self.cards = []

    def fill(self):
        self.cards = []
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1, 14):
                self.add(Card(s, v))
        return self

    def __repr__(self):
        return ", ".join(repr(card) for card in self.cards)

    def size(self):
        return len(self.cards)

    def shuffle(self):
        random.shuffle(self.cards)
        return self

    def draw(self):
        return self.cards.pop()

    def add(self, card):
        return self.cards.append(card)


class Player(object):
    def __init__(self, name):
        self.name = name
        self.hand = Deck()

    def draw(self, deck):
        self.hand.add(deck.draw())
        return self

    def __repr__(self):
        return "{} has {}".format(self.name, self.hand)

def play():
    deck = Deck().fill().shuffle()
    computer = Player("Computer")
    computer.draw(deck)
    print(str(computer))
    while deck.size() > 0:
        guess = "?"
        while guess not in "hl":
            guess = str(input("Will the next card be higher or lower than {} (h or l)?\n".format(computer.hand.cards[-1]))).lower()
        computer.draw(deck)
        print(str(computer))
        diff = computer.hand.cards[-1].value - computer.hand.cards[-2].value
        if diff <= 0 and guess == "h" or diff >= 0 and guess == "l":
            print("Ah... wrong guess! Game over.")
            return
        print("That was well guessed!")

    print("Unbelievable: you guesses were right for the whole deck!")

play()

推荐阅读