Условия внутри цикла while
Как исправить код так, чтобы после неправильного пароля можно было вводить пароль ещё 2 раза (всего 3 попыток). Зацикливаться должен только пароль (переменная password)!
name = input ("Введите ваше имя:\n")
if name == "Иван":
print ('Здравствуйте,' + name + '!')
jkl = 0
while jkl < 3:
password = input ('Введите ваш пароль:\n')
if password == 'wasd666':
print ('Правильный пароль!')
surname = input ("Введите вашу фамилию:\n")
if surname == 'Иванов':
print ('Правильная фамилия!')
nickname = input ('Введите ваш никнейм:\n')
if nickname == 'ivansky':
print ('Правильный никнейм!')
denr = input("""Введите дату вашего дня рождения в формате ДД.ММ.ГГГГ.:\n""")
if denr == '13.06.2002.' or '13.06.2002':
print ('Правильная дата дня рождения!')
password_file = input ("Введите пароль от файла:\n")
if password_file == 'qwerty99':
print ('Правильный пароль от файла!')
#конец
else:
print ("Неправильный пароль от файла!")
else:
print ('Неправильная дата дня рождения!')
else:
print ("Неправильный никнейм!")
else:
print ('Неправильная фамилия!')
else:
print ("Неправильный пароль!")
jkl += 1
if jkl == 1:
print ("У вас осталось попытки")
if jkl == 2:
print ("У вас осталось 1 попытка")
if jkl == 3:
print ("У вас последняя попытка!")
else:
print ('Неправильное имя!')
input("Press Enter")
Ответы (4 шт):
Вот уже изменённый код (добавил цикл for, break, а также изменил условия if, но оставил код Вашего типа):
name = input ("Введите ваше имя:\n")
if name == "Иван":
print ('Здравствуйте,' + name + '!')
for i in range(3):
password = input ('Введите ваш пароль:\n')
if password == 'wasd666':
print ('Правильный пароль!')
surname = input ("Введите вашу фамилию:\n")
if surname == 'Иванов':
print ('Правильная фамилия!')
nickname = input ('Введите ваш никнейм:\n')
if nickname == 'ivansky':
print ('Правильный никнейм!')
denr = input("""Введите дату вашего дня рождения в формате ДД.ММ.ГГГГ.:\n""")
if denr == '13.06.2002.' or '13.06.2002':
print ('Правильная дата дня рождения!')
password_file = input ("Введите пароль от файла:\n")
if password_file == 'qwerty99':
print ('Правильный пароль от файла!')
#конец
break #выход из цикла
else:
print ("Неправильный пароль от файла!")
else:
print ('Неправильная дата дня рождения!')
else:
print ("Неправильный никнейм!")
else:
print ('Неправильная фамилия!')
else:
print ("Неправильный пароль!")
if i == 0: print ("У вас осталось 2 попытки")
if i == 1: print ("У вас последняя попытка!")
else:
print ('Неправильное имя!')
input("Press Enter")
Я бы не делал такую ступенчатую структуру, а пошел бы от обратного - завернул бы всё в функцию и при неправильных ответах просто сразу из нее выходил бы (можно с некоторым значением, показывающим, что произошла ошибка, например return -1)
def get_data():
name = input ("Введите ваше имя:\n")
if name != "Иван":
print ('Неправильное имя!')
return
print (f'Здравствуйте, {name}!')
jkl = 0
while jkl < 3:
password = input ('Введите ваш пароль:\n')
if password != 'wasd666':
print("Неправильный пароль!")
jkl += 1
if jkl == 1:
print("У вас осталось 2 попытки")
if jkl == 2:
print("У вас осталось 1 попытка")
if jkl == 3:
print("У вас последняя попытка!")
if jkl >= 3:
return -1
surname = input ("Введите вашу фамилию:\n")
if surname != 'Иванов':
print('Неправильная фамилия!')
return
print ('Правильная фамилия!')
nickname = input ('Введите ваш никнейм:\n')
if nickname != 'ivansky':
print ("Неправильный никнейм!")
return
print ('Правильный никнейм!')
denr = input('Введите дату вашего дня рождения в формате ДД.ММ.ГГГГ.:\n')
if denr not in ['13.06.2002.', '13.06.2002']:
print ('Неправильная дата дня рождения!')
return
print ('Правильная дата дня рождения!')
password_file = input ("Введите пароль от файла:\n")
if password_file != 'qwerty99':
print ("Неправильный пароль от файла!")
return
print ('Правильный пароль от файла!')
или завернул бы точно такой же код в исключение
try:
....
except:
и вместо return бросал бы исключения
В общем в любом случае избавился бы от ВЛОЖЕННОСТИ, которая есть у вас - она очень неудобна
Можно попробовать сделать примерно так, хотя тут, конечно, есть еще над чем поработать:
d = [['Иван', "Введите ваше имя:\n", 'Здравствуйте, Иван!', 'Неправильное имя!'],
['wasd666', 'Введите ваш пароль:\n', 'Правильный пароль!', "Неправильный пароль!"],
['Иванов', "Введите вашу фамилию:\n", 'Правильная фамилия!', 'Неправильная фамилия!'],
['ivansky', 'Введите ваш никнейм:\n', 'Правильный никнейм!', "Неправильный никнейм!"],
['13.06.2002.', "Введите дату вашего дня рождения в формате ДД.ММ.ГГГГ.:\n", 'Правильная дата дня рождения!', 'Неправильная дата дня рождения!'],
['qwerty99', "Введите пароль от файла:\n", 'Правильный пароль от файла!', "Неправильный пароль от файла!"]]
flag = 0
for i in d:
if input(i[1])==i[0]: print(i[2])
else:
print(i[3])
if i[0]=='wasd666':
for j in range(2):
print('Осталось попыток: ', 2-j)
if input(i[1])==i[0]:
print(i[2])
break
else: print(i[3])
else: flag=1
if flag: break
else: break
# Сделаем, чтобы имя и пароль спрашивали по 3 раза, а после разъединялся.
break_flag = False # Использование флага - для дальнейшего выхода из двойного цикла.
vvod_name = 0
vvod_passw = 0
#while True:
while vvod_name < 3:
name = input("Введите имя: ")
if name != "Sasha":
print("Неверное имя пользователя!")
vvod_name += 1
if vvod_name == 1:
print("У вас осталось две попытки!")
continue
if vvod_name == 2:
print("У вас осталась одна попытка!")
continue
else:
print("Такого пользователя не существует!")
break
elif name == ("Sasha"):
print("Correct name!")
#while True: # Может я криво сделал, но как то у меня двойной while получился..
while vvod_passw < 3:
passw = input("Привет, Саша! Введи пароль (рыба-меч на en): ")
if passw != "swordfish":
print("Неверный пароль!")
vvod_passw += 1
if vvod_passw == 1:
print("Не угадали! У вас осталось две попытки!")
continue
if vvod_passw == 2:
print("Не угадали! У вас осталась одна попытка!")
continue
else:
print("Password incorrect!")
break
else:
break_flag = True
# Если условие истинно, мы устанавливаем флаг в True и прерываем внутренний цикл с помощью break.
print("Correct password!")
break
if break_flag:
# Затем во внешнем цикле проверяем значение флага, и если оно True, прерываем и внешний цикл.
print("breaking_flag")
break
print("Я только учусь.. :)")