Отображение количества оставшихся попыток для неверного пароля, принять, если пользователь вводит правильный пароль - PullRequest
1 голос
/ 16 июня 2020

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

Подробности:

Язык - Python

Версия - 3.8. 3

Редактор - VS Code

Я пытаюсь написать программу, которая принимает ввод от пользователя и проверяет, является ли это действительным паролем. Если да, отображается «Правильно» и программа закрывается, если неверно, отображается количество оставшихся попыток, всего 3, и снова запрашивается ввод.

Я только что набрал ПОКА l oop в моем руководстве и использовал его для создания программы.

msg = input("What's the secret password: ")

# Password attempt is 3 times, starts at 2, then 1 and ends when counter is 0
num = 2  

# bananas is the correct password
while msg != "bananas":  
    if num == 0:
        print("Too many wrong attempts. You are locked out!")  # exhausted all 3 attempts, should print given message.

    else:
        print(f"Wrong Password! You have {num} chances left")  # password incorrect, display attempts left
        msg = input("What's the secret password: ")
        num = num - 1

print("Correct") 

Проблема

Если я запустил его и введу правильный пароль сразу или через 1-2 неудачные попытки, он работает, как ожидалось. Но если я введу неправильный ввод все 3 раза, это перейдет в l oop отображения сообщения

Слишком много неправильных попыток. Вы заблокированы!

И печатает навсегда. Я не могу понять, где выйти из l oop, чтобы он отображал сообщение только один раз и выходил из программы.

Пожалуйста, помогите с решением проблемы.

2 неверных пароля, 1 правильный в 3-й попытке

все 3 неверные попытки

Ответы [ 3 ]

2 голосов
/ 16 июня 2020

Попробуйте эту структуру:

num = 3
while input("What's the secret password: ") != "bananas" and num-1 != 0:
    num -= 1
    print(f"Wrong Password! You have {num} chance" + ['_', ' ', 's '][num] + "left")
print("Correct") if num else print("Too many wrong attempts. You are locked out!")

Входные данные можно напрямую использовать в условии while - если у вас осталось ноль попыток или вы получили правильный пароль, while l oop прерывается и if num: ( num больше нуля - Истина) отображается соответствующее сообщение.

И как функция:

def pswd_entry(num=3):
    while input("What's the secret password: ") != "bananas" and num-1 != 0:
        num -= 1
        print(f"Wrong Password! You have {num} chance" + ['_', ' ', 's '][num] + 
    "left")
    print("Correct") if num else print("Too many wrong attempts. You are locked 
    out!")

Примечание: pswd_entry(num=3) имеет необязательный аргумент num, который по умолчанию будет 3, если оставлено пустым.

Разъяснение

Наше количество попыток:

num = 3

The While L oop

Первое условие: input("What's the secret password: ") != "bananas"

input() будет ждать, пока пользователь не введет значение, и если это значение не «бананы», то while l oop не сломается.

Второе условие: num-1 != 0

Это проверит, что количество попыток (минус одна) не (!=) равно 0.

Если условие 1 and условие 2 выполнено, будет выполняться while l oop .

Одна попытка вычитается num -=1 (то же, что и num = num -1), а затем записывается предупреждение о количестве оставшихся шансов.

+['_', ' ', 's '][num] выбирает, будет ли 's' добавляется к шанс / с - например, если остался 1 шанс (т.е. num = 1), просто ' ' (пробел) добавляется к 'chance'

Если num = 2:

['_', ' ', 's '][2] - ([0 element, 1 element, 2 element][select 2 element]) = 's' добавляется к chance -> chances

while input("What's the secret password: ") != "bananas" and num-1 != 0:
    num -= 1
    print(f"Wrong Password! You have {num} chance" + ['_', ' ', 's '][num] + "left")

Наконец - Оператор печати

print("Correct") if num else print("Too many wrong attempts. You are locked out!")

if num будет делать print("Correct"), если значение num !=0 - если здесь проверьте, что num имеет значение и не равно нулю (False) - в противном случае будет выведено сообщение о блокировке (из else).

1 голос
/ 16 июня 2020

Вот код, чтобы не дублировать операторы ввода

password, times = 'bananas', 3
while True:
    times -= 1
    msg = input("What's the secret password: ")
    if msg == password:
        print("Correct")
        break
    elif times > 0:
        print(f"Wrong Password! You have {times} chances left")
    else:
        print("Too many wrong attempts. You are locked out!")
        break

Функция хороша для разделения вашей работы на мелкие части. вы можете найти разницу между этим и выше.

def login(password, times=3):
    while True:
        times -= 1
        msg = input("What's the secret password: ")
        if msg == password:
            print("Correct")
            return True
        elif times > 0:
            print(f"Wrong Password! You have {times} chances left")
        else:
            print("Too many wrong attempts. You are locked out!")
            return False

result = login('bananas')
if result:
    print('Login sucessful !')
else:
    print('Login failed !')
0 голосов
/ 16 июня 2020

Поместив это в функцию, вы можете использовать return после печати для выхода из программы.

def main():
    msg = input("What's the secret password: ")

    # Password attempt is 3 times, starts at 2, then 1 and ends when counter is 0
    num = 2  

    # bananas is the correct password
    while msg != "bananas":  
        if num == 0:
            print("Too many wrong attempts. You are locked out!")  # exhausted all 3 attempts, should print given message.
            return
        else:
            print(f"Wrong Password! You have {num} chances left")  # password incorrect, display attempts left
            msg = input("What's the secret password: ")
            num = num - 1

    print("Correct")


main()
...