Бесконечный цикл Python для проверки выполнения условия

#python #while-loop

#python #цикл while

Вопрос:

Извините, если это очень вопрос новичка.

Я пытаюсь создать программу «камень, бумага, ножницы».

Я хочу дождаться, пока пользователь сделает другой выбор r, p, s.

Я не уверен, почему я не могу заставить это работать.

Когда я запускаю свою программу, она никогда не выходит из первого цикла while, что бы я ни вводил. Я не понимаю, почему это не происходит, когда я ввожу eather r, p или s?

 while p1_choice != 'r' or p1_choice != 's' or p1_choice != 'p':
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')

while p2_choice != 'r' or p1_choice != 's' or p1_choice != 'p':
    p2_choice = input('Player two please make your choice. Rock(r), Scissors(s), Paper(p): ')
    print()

if p1_choice == 'r' and p2_choice == 'p':
    print('Player two wins')
elif p1_choice == 'r' and p2_choice == 's':
    print('Player one wins')
elif p1_choice == 's' and p2_choice == 'r':
    print('Player two wins')
elif p1_choice == 's' and p2_choice == 'p':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 'r':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 's':
    print('Player two wins')
else:
    print('The game is a tie')
 

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

1. p1_choice != 'r' or p1_choice != 's' совпадает с тем, not (p1_choice == 'r' and p1_choice == 's') что всегда верно

Ответ №1:

Первый while цикл остановится, только если p1_choice равно 'r' , 'p' , и 's' , одновременно, что невозможно.

p1_choice != 'r' or p1_choice != 's' or p1_choice != 'p'

вычисляется как True

если p1_choice не равно 'r' или если p1_choice не равно 'p' или если p1_choice не равно 's' .

Я полагаю, вы хотели использовать and вместо or .

Ответ №2:

@codewelldev уже хорошо указал на невозможность выхода из цикла while в вашем коде. Поскольку в условии ИЛИ, если какое-либо условие истинно, цикл будет продолжаться. Вы введете одно из следующих действий. ‘r’,’s’,’p’. Итак, поскольку вы отрицаете, в лучшем случае есть два True (s) и одно False. Он никогда не завершится. Может быть, вы хотите использовать функцию ‘not in’.

 p1_choice, p2_choice = None, None
while p1_choice not in ('r','s','p'):
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')

while p2_choice not in ('r','s','p'):
    p2_choice = input('Player two please make your choice. Rock(r), Scissors(s), Paper(p): ')
    print()

if p1_choice == 'r' and p2_choice == 'p':
    print('Player two wins')
elif p1_choice == 'r' and p2_choice == 's':
    print('Player one wins')
elif p1_choice == 's' and p2_choice == 'r':
    print('Player two wins')
elif p1_choice == 's' and p2_choice == 'p':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 'r':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 's':
    print('Player two wins')
else:
    print('The game is a tie')
 

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

1. Здравствуйте. Большое спасибо за объяснение. Теперь я понимаю это намного лучше 🙂

Ответ №3:

Вот еще один способ, я думаю, самый простой для чтения:

 def getPlayerChoice() -> str:
    choice = '';
    while not (choice == 'r' or choice == 's' or choice == 'p'):
        choice = input('Please make your choice. Rock(r), Scissors(s), Paper(p): ')

p1_choice = getPlayerChoice();
p2_choice = getPlayerChoice();
 

Ответ №4:

Это утверждение p1_choice != 'r' or p1_choice != 's' or p1_choice != 'p': всегда верно, следовательно, не выйдет из цикла

Я настоятельно рекомендую вам выполнить следующий код:

 while True:
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')
    if p1_choice == 'r' or p1_choice == 's' or p1_choice == 'p':
        break
    else:
        continue
        
while True:
    p2_choice = input('Player two please make your choice. Rock(r), Scissors(s), Paper(p): ')
    if p2_choice != 'r' or p1_choice != 's' or p1_choice != 'p':
        continue
    else:
        break
 

Более удобочитаем и менее подвержен ошибкам.

Другим улучшением является делегирование проверки пользовательского ввода функции, чтобы:

 def check_inputs(user_input):
if user_input == 'r' or user_input == 's' or user_input == 'p':
    print('noe')
    return True
else:
    print('fuckl')
    return False


while True:
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')
    check = check_inputs(p1_choice)
    if check:
        break
    else:
        continue
 

Это следует правилу DRY

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

1. Однако это все еще не отвечает на первоначальный вопрос.

2. Я удалю понижающий голос. Однако объяснение того, что я имел в виду, см. В моем ответе.