我正在尝试制作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)
所以在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')
并且通过nogo
生成的card_draw()
中的一张牌也恰好被赋予了值'7'
和'Spades'
,
test_card in nogo
始终为False
。有人可以解释为什么吗?
答案 0 :(得分:5)
问题在于您总是在创建一个新对象。默认情况下,两个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
我还实现了__str__
方法,因此您可以执行print(card)
并根据Python的官方样式指南PEP8对其进行命名。
最后,您可能想要实现一个Deck
类,该类包含一副纸牌。然后,您可以从卡组中随机洗牌,并依次弹出卡,以确保每张卡只能被抽出一次。
答案 1 :(得分:1)
因为您每次都将一个新实例与nogo
列表中的其他实例进行比较。
您实际上是在这样做:
class A:
pass
a1 = A()
a2 = A()
print(a1 == a2)
哪个将始终产生False