Очистить эту программу - PullRequest
       4

Очистить эту программу

0 голосов
/ 01 октября 2018

Я наконец-то все заработал!Но по какой-то причине программа выводит предыдущее сообщение об ошибке (слишком высокое или слишком низкое или введите значения между ...) вместе с сообщением об ошибке значения, если пользователь вводит что-то, что пытается поймать попытка.Кто-нибудь может объяснить, почему?Любое сокращение / очистка также приветствуется.Извините за любые ошибки.Спасибо!

'''
This is a guessing game that finds a random number, and then
Tells the user if their guess is too low or too high.  It will also give
Error messages for any numbers outside of the accepted range, and will also
Give errors for anything not an integer.
At the end (if the user guesses correctly) it will ask if the
User would like to play again or quit.
'''

import random


def start_here():
    print("Welcome to the guessing game!")
    play_game()


def play_game():

    random_number = random.randrange(1, 100)
    correct = False
    user_guess = True

    while not correct:

        try:
            user_guess = int(input("Enter your guess: "))
        except ValueError:
            print("Please only use integers")

        if user_guess > 100 or user_guess < 1:
            print("Please only enter numbers between 1 and 100!")

        elif user_guess > random_number:
            print("Too high, try again. ")

        elif user_guess < random_number:
            print("Too low, try again! ")

        elif user_guess == random_number:
            break

    if user_guess == random_number:
        replay = (input("Great!  You guessed it! would you like to play again? y or n"))
        if replay == "y":
            start_here()
        else:
            print("See ya later!")


start_here()

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Имейте в виду, что код после блока try-Кроме того, выполняется независимо от того, было сгенерировано исключение или нет.Если вызывается блок исключений, вы хотите, чтобы ваш код пропускал остальные операторы в цикле while и continue на следующей итерации цикла, где пользователю снова предлагается ввести данные.Это может быть достигнуто с помощью ключевого слова continue в блоке except следующим образом:

try:
     user_guess = int(input("Enter your guess: "))
except ValueError:
     print("Please only use integers")
     continue

Оператор continue предписывает интерпретатору пропустить оставшиеся операторы в текущей итерации цикла.Затем поток управления может повторно войти в цикл или выйти, в зависимости от условия цикла.

Теперь, когда ваш код работает так, как он предназначен, вот как вы можете сделать его более кратким:

Во-первых, в Python есть удобная функция, которая позволяет вам писать условия типа not 1 <= user_guess <= 100.Эти условия гораздо быстрее читаются, и вы можете заменить это в своем коде.

Во-вторых, функция start_here() является избыточной.Вместо этого вы можете легко заменить play_game() несколькими модификациями, например:

import random

def play_game():
    print("Welcome to the guessing game!")  #Modification here
    random_number = random.randrange(1, 100)
    correct = False
    user_guess = True

    while not correct:

        try:
            user_guess = int(input("Enter your guess: "))
        except ValueError:
            print("Please only use integers")
            continue #Modification here

        if not 1<=user_guess<=100: #Modification here
            print("Please only enter numbers between 1 and 100!")

        elif user_guess > random_number:
            print("Too high, try again. ")

        elif user_guess < random_number:
            print("Too low, try again! ")

        elif user_guess == random_number:
            break

    if user_guess == random_number:
        replay = (input("Great!  You guessed it! would you like to play again? y or n"))
        if replay == "y":
            play_game()  #Modification here
        else:
            print("See ya later!")


play_game()  #Modification here

, или полностью заменить функцию play_game() циклом while, например:

import random

replay = 'y'  #Modification here

while replay == 'y': #Modification here
    print("Welcome to the guessing game!")
    random_number = random.randrange(1, 100)
    correct = False
    user_guess = True

    while not correct:

        try:
            user_guess = int(input("Enter your guess: "))
        except ValueError:
            print("Please only use integers")
            continue

        if not 1<=user_guess<=100 :
            print("Please only enter numbers between 1 and 100!")

        elif user_guess > random_number:
            print("Too high, try again. ")

        elif user_guess < random_number:
            print("Too low, try again! ")

        elif user_guess == random_number:
            break

    if user_guess == random_number: #Modification here
        replay = input("Great!  You guessed it! would you like to play again? y or n")


print("See ya later!") #Modification here
0 голосов
/ 01 октября 2018

Здесь:

while not correct:

    try:
        user_guess = int(input("Enter your guess: "))
    except ValueError:
        print("Please only use integers")

    if user_guess > 100 or user_guess < 1:
       # etc

Если пользовательский ввод не является допустимым int, вы выводите сообщение об ошибке, но продолжаете проверять значение по случайному числу.Вместо этого вы должны пропустить оставшуюся часть цикла или извлечь часть, получающую пользовательский ввод в свой собственный цикл.Как правило, одна функция должна выполнять только одно, а затем вы используете другую функцию для управления потоком всей программы:

def get_num():
    while True:
        try:
            user_guess = int(input("Enter your guess: ").strip())
        except ValueError:
            print("Please only use integers")
            continue

        if user_guess > 100 or user_guess < 1:
            print("Please only enter numbers between 1 and 100!")
            continue

        return user_guess

def again():
    replay = input("would you like to play again? y or n"))
    return replay.strip().lower() == "y"

def play_game():
    random_number = random.randrange(1, 100)
    while True:
        user_guess = get_num()
        if user_guess > random_number:
            print("Too high, try again. ")
        elif user_guess < random_number:
            print("Too low, try again! ")
        else:
            # if it's neither too high nor too low then it's equal...
            break

    # no need to test again, we can only get here when the user
    # found the number
    print("Great!  You guessed it!")

def main():
    print("Welcome to the guessing game!")
    while True:
        play_game()
        if not again():
            break


if __name__ == "__main__":
    main()
...