Хотя цикл превышает максимальное количество попыток (3) при запросе ответа - PullRequest
0 голосов
/ 17 февраля 2019

В моей программе предполагается задать пользователю вопрос и дать ему 3 шанса угадать правильный ответ.Но мой цикл while дает пользователю 4-й шанс ответить на вопрос и обойти переменную max_attempts.

print('Quiz program!\n')
answer = input('What is the capital of Wisconsin? ')
attempt = 1
max_attempts = 4

while answer != 'Madison':
    attempt += 1
    print('You got it wrong, please try again.\n')
    answer = input('What is the capital of Wisconsin? ')
    if attempt == max_attempts:
        print('You used the maximum number of attempts, sorry. The correct answer is "Madison"')
        break
else:
    print(f"Correct! Thanks for playing. It took you {attempt} attempt(s).")

Ответы [ 6 ]

0 голосов
/ 18 февраля 2019

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

0 голосов
/ 17 февраля 2019

Проблема с вашим состоянием.Это должно быть

attempt < max_attempts:

Я также попытался реализовать его более читабельно

def main():
    introduction()
    attempt=1
    while attemptValid(attempt) and answerIsWrong(askQuestion(), attempt):
        attempt += 1

def attemptValid(attempt):
    max_attempts=4
    if attempt < max_attempts:
        return 1
    print('You used the maximum number of attempts, sorry. The correct answer is "Madison"')
    return 0

def answerIsWrong(answer, attempt):
    if answer != 'Madison':
        return 1
    print(f"Correct! Thanks for playing. It took you {attempt} attempt(s).")
    return 0

def introduction():
    print('Quiz program!\n')

def askQuestion():
    return input('What is the capital of Wisconsin? ')

main()
0 голосов
/ 17 февраля 2019

Конечно, изменив переменную max_attempts на 2, 3, 4, 5, вы в конечном итоге найдете правильное число, которое даст вам правильное поведение.Но я считаю, что более важно знать, как думать об этой проблеме.Я бы предложил думать с точки зрения инвариантов цикла: создайте условие, которое всегда является истинным в цикле, и применяйте его при написании цикла.В этом случае давайте сделаем равными значение attempt и количество вызовов input() и посмотрим, верен ли ваш цикл:

print('Quiz program!\n')
answer = input('What is the capital of Wisconsin? ')
attempt = 1
max_attempts = 4

Итак, ваш attempt установлен равным 1 послеinput().Эта часть в порядке, и удовлетворяет инвариант (даже до цикла).Затем цикл:

while answer != 'Madison':
    attempt += 1
    print('You got it wrong, please try again.\n')
    answer = input('What is the capital of Wisconsin? ')
    if attempt == max_attempts:
        print('You used the maximum number of attempts, sorry. The correct answer is "Madison"')
        break

Вы увеличиваете attempt, затем печатаете, затем вызываете input().Я поставлю строку attempt сразу после вызова input(), чтобы она соответствовала приведенному выше коду, но в любом случае, прямо перед оператором if, мы по-прежнему имеем значение attempt, равное числу раз, которое мы вызывали input().Вот почему у вас такое поведение.

Теперь о том, как изменить ваш код: теперь вы знаете, что такое «инвариант» в цикле.Вы должны решить (1), когда делать проверку attempt == max_attempts и (2) какое правильное значение max_attempts проверить.Ответ других людей уже дал вам решение.

0 голосов
/ 17 февраля 2019

Все приведенные выше ответы верны, просто добавив немного другой вариант.

print('Quiz program!\n')
attempt = 1
max_attempts = 4

while attempt < max_attempts:
   attempt += 1

   answer = input('What is the capital of Wisconsin? ')
   if answer == 'Madison':
      print("Correct!")
      break
   else:
      print('You got it wrong, please try again.\n')

print("Thanks for playing. It took you %s attempt(s)." %(attempt-1))
0 голосов
/ 17 февраля 2019

Вы должны проверить, равна ли попытка счетчика attempt в начале цикла, до max_attempts, прежде чем снова увеличивать счетчик, и вместо этого следует установить max_attempt в 3:

print('Quiz program!\n')
answer = input('What is the capital of Wisconsin? ')
attempt = 1
max_attempts = 3

while answer != 'Madison':
    if attempt == max_attempts:
        print('You used the maximum number of attempts, sorry. The correct answer is "Madison"')
        break
    attempt += 1
    print('You got it wrong, please try again.\n')
    answer = input('What is the capital of Wisconsin? ')
else:
    print(f"Correct! Thanks for playing. It took you {attempt} attempt(s).")
0 голосов
/ 17 февраля 2019

У вас есть max_attempts = 4 - измените это на 3.

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