Или в цикле while не работает - Python

Прежде чем мы начнем, я совсем новичок в python.

Этот код предназначен для создания комбинации из 5 карт, которая впоследствии будет использоваться в игре «Go Fish». Причина, по которой так много переменных, заключается в более поздних целях в игре, поэтому, пожалуйста, игнорируйте беспорядок, если это возможно.

Очевидно, что карты не могут повторяться, поскольку в обычной колоде карт есть только одна карта каждой карты. Чтобы избежать создания руки с двумя одинаковыми картами, я использовал циклы while (как вы можете видеть в коде). У меня, похоже, проблема с циклами while. Кажется, что операторы «или» создают проблему в коде, когда он не будет выполняться в оболочке («>>>» даже не появляется, просто пустой курсор).

Чтобы решить проблему с выполнением, я изменил код, чтобы использовать знаки равенства.

Например: В то время как p55 == p11 == p22 == p33 == p44:

Однако при запуске кода я все равно сталкиваюсь с дубликатами карточек.

Если кто-нибудь может помочь мне понять, как обойти эту повторяющуюся ошибку, это было бы здорово.

Заранее спасибо!

def player_hand():
    CardSuit = ['Hearts','Diamonds','Clubs','Spades']
    CardNum = ['Ace','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Jack','Queen','King']

    PlayerHand = []

    p1 = str(random.choice(CardNum))
    p11 = p1, 'of', str(random.choice(CardSuit))
    p111 = " ".join(p11)
    PlayerHand.append(p111)

    p2 = str(random.choice(CardNum))
    p22 = p2, 'of', str(random.choice(CardSuit))
    while p22 == p11 :
        p2 = str(random.choice(CardNum))
        p22 = p2, 'of', str(random.choice(CardSuit))
    p222 = " ".join(p22)
    PlayerHand.append(p222)

    p3 = str(random.choice(CardNum))
    p33 = p3, 'of', str(random.choice(CardSuit))
    while p33 == p11 or p22 :
        p3 = str(random.choice(CardNum))
        p33 = p3, 'of', str(random.choice(CardSuit))
    p333 = " ".join(p33)
    PlayerHand.append(p333)

    p4 = str(random.choice(CardNum))
    p44 = p4, 'of', str(random.choice(CardSuit))
    while p44 == p11 or p22 or p33 :
        p4 = str(random.choice(CardNum))
        p44 = p4, 'of', str(random.choice(CardSuit))
    p444 = " ".join(p44)
    PlayerHand.append(p444)

    p5 = str(random.choice(CardNum))
    p55 = p5, 'of', str(random.choice(CardSuit))
    while p55 == p11 or p22 or p33 or p44 :
        p5 = str(random.choice(CardNum))
        p55 = p5, 'of', str(random.choice(CardSuit))
    p555 = " ".join(p55)
    PlayerHand.append(p555)

    return PlayerHand

person Evan Cooper    schedule 24.09.2014    source источник
comment
В качестве примечания, вы можете делать много сравнений, как вы хотите сделать с оператором in. Например, while p55 in (p11, p22, p33, p44):.   -  person Roger Fan    schedule 25.09.2014
comment
Или, поскольку вся информация в любом случае находится в переменной PlayerHand, вы можете сделать while p55 in PlayerHand:   -  person Laurent Bourgault-Roy    schedule 25.09.2014


Ответы (1)


p33 == p11 or p22

Это не то же самое, что

p33 == p11 or p33 == p22

Этот тип вопросов возникает часто, вот один из таких примеров.

Причина, по которой первый случай не работает:

p33 == p11 or p22

Разбивается на

(p33 == p11) or (p22)

Обратите внимание, что достоверность p22 оценивается отдельно.

person Cory Kramer    schedule 24.09.2014
comment
Первое читается так, как если бы вы сказали (p33 == p11) or (p22) - person TML; 25.09.2014
comment
Ok. Большое спасибо! - person Evan Cooper; 25.09.2014