我的程序涉及从牌组中抽出牌,将牌的价值加到我手上,然后从牌组中删除牌(因为我不想两次画同一张牌)。
卡片示例:
card = ["4 of clubs", 4]
不起作用的代码:
card_number = random.randrange(len(deck_cards))
card = deck_cards[card_number][0]
print(card)
hand_value += deck_cards[card_number][1]
deck_cards.remove(card_number)
我不知道我做错了什么,如果我将代码更改为
card_number = random.chioce(deck_cards)
它不会接受card = deck_cards[card_number][0]
部分。
怎么办?
答案 0 :(得分:2)
list.remove
将对象而不是索引作为参数。
因此,您应该修改代码以检索卡片并直接使用它:
>>> card = random.choice(deck_cards) # Retrieve an object, not an index
>>> print (card) # card is you card list, i.e.:
["4 of clubs", 4]
>>> print (card[0])
4 of clubs
>>> hand_value += card[1]
>>> deck_cards.remove (card)
请注意,您还可以使用内置的del
删除指定索引处的对象:
>>> card_number = random.randrange(len(deck_cards))
>>> card = deck_cards[card_number][0]
>>> print(card)
"4 of clubs"
>>> hand_value += deck_cards[card_number][1]
>>> del deck_cards[card_number]
答案 1 :(得分:0)
random.choice(list)
返回列表的随机元素,但列表deck_cards[card_number]
期望项目的位置从列表中检索(因此是整数)。所以只说明card = random.choice(deck_cards)[0]
就足够了。
此外,使用列表作为卡的再现是一个糟糕的选择,因为它不代表卡的对象特征。如果您为卡片编写了自己的类,那么您的代码将变得更具可读性。如果这个类看起来像这样:
class Card(object):
def __init__(self, name, value):
self.name = name
self.value = value
并且你实例化了一张像card = Card('4 of clubs', 4)
这样的卡片,你可以编写像hand_value = deck_cards[index].value
这样的代码并摆脱那些丑陋的指数。对于诅咒,你必须为这个班级编写自己的字符串演示者,以便轻松输出卡片,但这也不难。
所以(没有那个字符串代表性代码)你的问题会像这样解决:
card = random.choice(deck_cards)
print('{},{}'.format(card.name, card.value))
hand_value += card.value
deck_cards.remove(card)