我目前拥有的是构建一副纸牌、洗牌以及从该副牌构建一手牌的代码。
from random import randint
def make_deck():
deck = []
for suit in suits:
for rank in ranks:
deck.append((suit,rank))
return deck
suits = ['spades','hearts','diamonds','clubs']
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king']
deck = make_deck() #list of cards
def shuffle(deck):
for k in range(100): # do it 100 times
card = deck.pop(randint(0,51))
deck.append(card)
def make_hand():
hand = []
for k in range(2):
card = deck.pop(randint(0,51))
hand.append(card)
return hand
hand = make_hand()
当我运行该程序时,打印 deck 会给出我喜欢的纸牌列表,然后当我尝试洗牌时,我收到一条错误消息,指出 pop 索引已超出范围。不太确定为什么它会超出索引,因为范围 (0,51) 代表一副牌中的所有 52 张牌。
当我尝试使用 make_hand() 函数时,同样的错误出现了,尽管并非总是如此。我是否错误地使用了 pop 方法?我必须更改什么才能使 shuffle 功能起作用,并且 hand 总是从一副牌中返回两张不同的牌?
请您参考如下方法:
pop 通过从列表中删除项目来改变列表。因此,列表的长度将变得小于 52 并且最终会抛出一个错误。每次 len(deck) 时都使用列表的长度,而不是 51。
对于随机播放,您还可以使用库 random 中的函数 shuffle:
from random import shuffle
## later in the code
shuffle(deck)
