我正在尝试制作一张5张牌扑克牌游戏,而我正在努力制作一款card_draw不会出现重复牌的功能,但在尝试检查是否已经绘制了随机抽取的牌时,我遇到了问题.
from random import choice
class standard_card:
def __init__(self, value, suit):
self.value = value
self.suit = suit
self.card = value + ' of ' + suit
def val():
values = ['Ace','2','3','4','5','6','7','8',
'9','10','Jack','Queen','King']
return choice(values)
def suits():
suit = ['Spades','Hearts','Clubs','Diamonds']
return choice(suit)
def card_draw(player_hand,nogo):
for i in range(5):
draw = standard_card(val(),suits())
while draw in nogo:
draw = standard_card(val(),suits())
player_hand.append(draw)
nogo.append(draw)
nogo = []
player_hand = []
card_draw(player_hand,nogo)
Run Code Online (Sandbox Code Playgroud)
因此,def card_draw()我只是想确保同一张卡片没有画两次,这就是我的原因while draw in nogo:.
然而,while draw in nogo总是False,这意味着有时重复的卡片投入player_hand和nogo.我不明白为什么draw in nogo总是这样False.例如,如果我这样做:
test_card = standard_card('7','Spades')
Run Code Online (Sandbox Code Playgroud)
和在卡中的一个nogo通过产生card_draw()也恰好是给定的值'7'和'Spades',
test_card in nogo
Run Code Online (Sandbox Code Playgroud)
永远False.有人可以解释为什么好吗?
问题是你总是在创建一个新对象.默认情况下,如果两个Python对象是同一个对象,则它们只是相同.
换句话说,standard_card('2', 'Spades') == standard_card('2', 'Spades')将返回False.
为了让Python知道如何比较两张卡的相等性,你需要告诉它如何通过实现魔术方法__eq__:
class Card:
def __init__(self, value, suit):
self.value = value
self.suit = suit
def __eq__(self, other):
return self.value == other.value and self.suit == other.suit
def __str__(self):
return self.value + ' of ' + self.suit
Run Code Online (Sandbox Code Playgroud)
我也实现了这个__str__方法,所以你可以print(card)根据Python的官方样式指南PEP8进行命名.
最后,你可能想要实现一个Deck持有一副牌的类.然后你可以洗牌并连续从牌组中弹出牌,保证每张牌只能画一次.
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |