текстовое выражение цикла while не работает в python - PullRequest
0 голосов
/ 05 июня 2019

Я беру входные данные p1 и p2, один должен быть X и один должен быть O в любом порядке.я использую цикл while для этого.Я предполагаю, что я не делаю никакой ошибки с текстовым выражением, я не знаю, почему оно не работает.

мне действительно нужно, чтобы кто-то проверял

def players():
    p1=p2=""
    while((p1!="X" and p2!="O")or(p1!="O" and p2!="X")):
        p1=input("enter p1:").upper()
        p2=input("enter p2:").upper()
    print(p1,p2)
players()

, когда я пытался p1 = X и p2= O или наоборот, цикл не завершился, как следует, согласно условию

, когда я попытался p1 = X, p2 = X и p1 = O, p2 = O, цикл завершился

я не понял, что я делаю не так

Ответы [ 4 ]

3 голосов
/ 05 июня 2019

Допустим, p1 == "X" и p2 == "O". Первое условие ложно, но второе условие истинно, поэтому цикл продолжается.

Более простое выражение для требуемого условия:

while p1 not in "XO" or p2 not in "XO" or p1 == p2:

Первое гарантирует, что p1 равно X или O; второй гарантирует то же самое для p2, а третий гарантирует, что оба игрока не выбрали один и тот же маркер.

Поскольку существует только два допустимых варианта, первый выбор вызывает второй, поэтому для второго приглашения нет причин:

while True:
    p1 = input("enter p1: ").upper()
    if p1 in "XO":
        break
p2 = "O" if p1 == "X" else "X"
0 голосов
/ 05 июня 2019

Ваше состояние почти действительно:

  • Вы проверяете, не совпадают ли они, а не ... обмен != на == исправляет это. Это исправляет неправильные входные данные (например, L или R от прохождения).

  • Условие перевернуто, вам нужно not результат. Это исправляет состояние, противоположное тому, что вы ожидаете. Результат обоих изменений:

    while not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X")):

Обратите внимание, что это в основном читабельно на английском языке: хотя не X и O или O и X.

Мы можем проверить это, помня, что True означает попытку еще раз:

p1 = "L"; p2 = "R"; print not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X"))
True
p1 = "X"; p2 = "X"; print not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X"))
True
p1 = "O"; p2 = "O"; print not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X"))
True
p1 = "O"; p2 = "X"; print not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X"))
False
p1 = "X"; p2 = "O"; print not ((p1 == "X" and p2 == "O") or (p1 == "O" and p2 == "X"))
False

В некоторых других примерах представлены более эффективные способы сделать это, но это то, что не так с вашим текущим кодом.

0 голосов
/ 05 июня 2019

Есть более эффективные способы сделать это, но я постарался максимально сохранить ваш код:

def players():

   p1, p2 = "",""

   options = ["X","O"]

   while True:

        p1_choice = input("enter p1:").upper()

        p2_choice = input("enter p2:").upper()

        if p1_choice or p2_choice not in options:

            break

        else:

            # Do whatever here
0 голосов
/ 05 июня 2019

Учитывая ваш пример p1 = X и p2 = O, второе условие будет иметь значение true.Это заставляет ваше время оценивать while( (false) or (true)).Поскольку одно из них истинно, цикл продолжается.

См. Эту ссылку для получения информации о циклах while: https://www.tutorialspoint.com/python/python_while_loop.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...