将一个列表中的项目移动到另一个列表,用于纸牌游戏Python



好吧,我正在尝试用Python制作一个扑克游戏。。并且我想将用过的卡从列表移动到另一个列表,在那里我将存储用过的卡片。我使用的是这个代码:

deck = ['AS', 'KS', 'QS', 'JS', '10S', '9S', '8S', '7S', '6S', '5S', '4S', '3S', '2S',
         'AD', 'KD', 'QD', 'JD', '10D', '9D', '8D', '7D', '6D', '5D', '4D', '3D', '2D',
         'AC', 'KC', 'QC', 'JC', '10C', '9C', '8C', '7C', '6C', '5C', '4C', '3C', '2C',
         'AH', 'KH', 'QH', 'JH', '10H', '9H', '8H', '7H', '6H', '5H', '4H', '3H', '2H']
used = []
p1 = []
p2 = []
a = 0
while (a < 2):
    drawn_card = random.choice(deck)
    deck.append(drawn_card)
    deck = [f for f in deck if f not in used]
    p1.append(drawn_card)
    a+=1
# Don't read anything below this line
card1 = p1[0]
card2 = p1[1]
f_card1 = "Name/Suit"
f_card2 = "Name/Suit"
# Formatting Player1's first drawn card
if card1[0] == "A":
    f_card1 = "Ace"
elif card1[0] == "K":
    f_card1 = "King"
elif card1[0] == "Q":
    f_card1 = "Queen"
elif card1[0] == "J":
    f_card1 = "Jack"
else:
    f_card1 = card1[0]

if card1[1] == "S":
    f_card1 = f_card1 + " of Spades"
elif card1[1] == "D":
    f_card1 = f_card1 + " of Diamonds"
elif card1[1] == "C":
    f_card1 = f_card1 + " of Clubs"
else:
    f_card1 = f_card1 + " of Hearts"
# Formatting Player1's second drawn card
if card2[0] == "A":
    f_card2 = "Ace"
elif card2[0] == "K":
    f_card2 = "King"
elif card2[0] == "Q":
    f_card2 = "Queen"
elif card2[0] == "J":
    f_card2 = "Jack"
else:
    f_card2 = card2[0]

if card2[1] == "S":
    f_card2 = f_card2 + " of Spades"
elif card2[1] == "D":
    f_card2 = f_card2 + " of Diamonds"
elif card2[1] == "C":
    f_card2 = f_card2 + " of Clubs"
else:
    f_card2 = f_card2 + " of Hearts"
print(f_card1)
print(f_card2)

while函数是我的问题所在。有时我打印卡片时会得到相同的卡片。我该如何解决这个问题?我的错误在哪里?提前感谢

您只需要将绘制的卡片附加到used列表中,而不需要返回到deck:

used.append(drawn_card)   #instead of deck.append(..)

简单的修复方法是按照其他人的建议使用used.append(drawn_card)。一个更好的方法是随机洗牌,然后从中切出所需数量的牌:

CARDS_PER_HAND = 2
random.shuffle(deck)
hand = deck[:CARDS_PER_HAND]

然而,您可能正在处理来自同一个牌组的多只手牌。你可以通过跟踪偏移到打乱的甲板上,然后从那里切片来处理这个问题,但这很麻烦。或者你可以复制deck,洗牌,然后为每只手弹出所需数量的牌:

shuffled_deck = deck[:]    # make a copy of deck
random.shuffle(shuffled_deck)
hand1 = [shuffled_deck.pop() for i in range(CARDS_PER_HAND)]
hand2 = [shuffled_deck.pop() for i in range(CARDS_PER_HAND)]
... etc.

可能最干净的方法是使用itertools.islice()从迭代器中获取第一个n项:

from itertools import islice
random.shuffle(deck)
shuffled_deck = iter(deck)    # returns an iterator
hand1 = list(islice(shuffled_deck, CARDS_PER_HAND))
hand2 = list(islice(shuffled_deck, CARDS_PER_HAND))
... etc.
while (a < 2):
    drawn_card = random.choice(deck)
    used.append(drawn_card)
    deck = [f for f in deck if f not in used]
    p1.append(drawn_card)
    a+=1

已使用。append(drawn_card(

最新更新