python - 为什么在卡片组的这个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()
解决方案
你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()
推荐阅读
- python - 当python包安装在本地机器上而不是virtualenv中时,如何在virtualenv上安装pytest?
- java - 如何在 jsp 文件中使用印地语内容?
- android - 在 Android Studio 上使用 Chaquopy 的致命异常
- javascript - 动态添加的脚本标签不执行
- python - Python - Lark - 语法 - 字符串
- javascript - PHP 没有从 $.ajax POST 接收数据
- r - 在时间序列上执行 ucm 代码时出错
- vue.js - Vue 3 Composition API - 如何获取安装组件的组件元素($el)
- apache-kafka - KSQL:带有关联字段的 Topk
- html - Angular如何在Angular File Upload上显示加载光标