Почему моя программа выходит из строя, когда хотя бы 1 из 4 списка становится пустым?

#python-3.x

#python-3.x

Вопрос:

Я создаю карточную игру «война» на python. В war вы делите все 52 карты на игроков. Проблема, с которой я сталкиваюсь, заключается в том, что когда один список костюмов становится пустым, происходит сбой программы. Я пытался решить эту проблему, сказав это suit = random.choice(poss_suits) после except IndexError: , но это не сработало. Есть какие-нибудь идеи?

 Diamonds = ['Ace', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King']
Hearts = ['Ace', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King']
Spades = ['Ace', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King']
Clubs = ['Ace', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King']

poss_suits = [Diamonds, Hearts, Spades, Clubs]
 
 player_deal = 52
while player_deal > 0:
    try:
        suit = random.choice(poss_suits)

        if suit == Diamonds:
            card = random.choice(Diamonds)
            Diamonds.remove(card)

        if suit == Hearts:
            card = random.choice(Hearts)
            Hearts.remove(card)

        if suit == Spades:
            card = random.choice(Spades)
            Spades.remove(card)

        if suit == Clubs:
            card = random.choice(Clubs)
            Clubs.remove(card)

        Player.hand.append(card)
        player_deal -= 1
    except IndexError:
 

Комментарии:

1. Просто мысли: я бы реализовал пакет в соответствии с тем, как вы это делаете физически. 1) Сделайте колоду из четырех мастей. 2) перетасуйте его. 3) рассматривайте его как стек и открывайте сверху. Легко понять, легко кодировать и тестировать. Его можно использовать везде, где требуется колода карт. Примечание: карта — это запись [масти, значения].

Ответ №1:

Выполнение list.remove(card) дает значение ошибки, если list оно пустое. Вы имели дело с ошибкой IndexError, но не с ошибкой ValueError.

Ответ №2:

Вы можете просто добавить:

 if suit == Diamonds and Diamonds:
 

Затем сделайте то же самое для других мастей. Другой лучший способ — использовать suit следующим образом:

 player_deal = 52
while player_deal > 0:
    try:
        suit = random.choice(poss_suits)
        if suit:
            card = random.choice(suit)
            suit.remove(card)
            Player.hand.append(card)
            player_deal -= 1
 

Это более упрощенный ответ, который выполняет свою работу.