#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. Я удалю понижающий голос. Однако объяснение того, что я имел в виду, см. В моем ответе.