Почему или-комбинированный! = Иногда ведет себя не так, как ожидалось - PullRequest
0 голосов
/ 25 мая 2020

Итак, я пытался создать игру ti c ta c toe, и у меня возникла проблема с одним из моих методов, когда я не мог понять, почему это происходит на бесконечном l oop. Мой код:

def player_input():
    marker = ''
    while marker != 'X' or marker != 'O':
        marker = input('Do you want to be X or O: ').upper()
        print(marker)

    if marker == 'X':
        return ['X','O']
    return ['O','X']

В настоящее время он продолжает задавать вопрос, даже когда пользователь вводит X или O. Код работает, когда я использую условие:

while not (marker == 'X' or marker == 'O'):

Ответы [ 2 ]

7 голосов
/ 25 мая 2020

Проблема в вашем логе c при проверке marker != 'X' or marker != 'O'.

Притворимся marker == 'X'. Итак, наше выражение оценивается как False or True, которое оценивается как True. То же самое и с marker == 'O'. Наше выражение здесь оценивается как True or False, которое оценивается как True.

Вы должны использовать and, а не or.

Второе выражение not (marker == 'X' or marker == 'O') эквивалентно (not marker == 'X') and (not marker == 'O'), так что работает. ( л * Де Моргана aws)

def player_input():
    marker = ''
    while marker != 'X' and marker != 'O': # change from 'or' to 'and'
        marker = input('Do you want to be X or O: ').upper()
        print(marker)

    if marker == 'X':
        return ['X','O']
    return ['O','X']
2 голосов
/ 25 мая 2020

Проблема заключается в while marker != 'X' or marker != 'O'.

Что происходит в вашей первой попытке, так это то, что даже если marker != 'X' равно False (маркер равен равен 'X'), тогда marker != 'O' ДОЛЖНО быть истинным. Таким образом, он всегда будет запрашивать ввод снова, потому что это «тот или иной».

Предположим, marker != 'X' - это выражение A и marker != 'O' - это выражение В . Тогда, согласно DeMorgan's L aws, у вас есть:

(not (A and B)) is equivalent to ((not A) or (not B))

И:

(not (A or B)) is equivalent to ((not A) and (not B))

Следовательно, ваша последняя попытка работает должным образом, потому что:

while not (marker == 'X' or marker == 'O'):

Эквивалентно:

while (not marker == 'X') and (not marker == 'O'):

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