Как мне правильно использовать isinstance() в моей игре по угадыванию случайных чисел или нужна другая функция?

Я хочу, чтобы эта игра с угадыванием чисел могла обнаруживать все возможные исключения или ошибки, которые вводит пользователь. Я успешно предотвратил использование строк при угадывании числа, но я хочу, чтобы консоль отображала пользовательское сообщение при вводе числа с плавающей запятой, говорящее что-то вроде строк Разрешены только целые числа от 1 до 20. Я понимаю, что мое исключение будет работать, чтобы поймать такую ​​​​ошибку, но в учебных целях я хочу специально обрабатывать, если пользователь вводит число с плавающей запятой вместо целого числа. Судя по тому, что я смог найти в Интернете, функция isinstance() оказалась именно тем, что я искал. Я попытался применить его таким образом, который казался логичным, но когда я пытаюсь запустить код и ввести число с плавающей запятой при угадывании случайного числа, он просто возвращается к моему обобщенному исключению. Я новичок в Python, поэтому, если кто-то достаточно хорош, чтобы помочь, я также был бы признателен за любую критику моего кода. Я пытался сделать это без особой помощи из Интернета. Хотя по большей части это работает, я не могу избавиться от ощущения своей неэффективности. Я самоучка, если это поможет моему делу, лол. Вот мой исходный код, спасибо:

import random
import sys


def getRandNum():
    num = random.randint(1,20)
    return num

def getGuess(stored_num, name, gameOn = True):
    while True:
        try:
            user_answer = int(input("Hello " + name + " I'm thinking of a number between 1-20. Can you guess what number I'm thinking of"))
            while gameOn:
                if user_answer >= 21 or user_answer <=0:
                    print("That is not a number between 1-20. Try again.")
                    user_answer = int(input())
                elif isinstance(user_answer, int) != True:
                    print("Only enter whole numbers. No decimals u cheater!")
                    user_answer = int(input())
                elif user_answer > stored_num:
                    print("That guess is too high. Try again " + name + " !")
                    user_answer = int(input())
                elif user_answer < stored_num:
                    print("That guess is too low. Try again " + name + " !")
                    user_answer = int(input())
                elif user_answer == stored_num:
                    print("You are correct! You win " + name + " !")
                    break
        except ValueError:
            print("That was not a number, try again")

def startGame():
    print("Whats Your name partner?")
    name = input()
    stored_num = getRandNum()
    getGuess(stored_num, name)


def startProgram():
    startGame()


startProgram()


while True:
    answer = input("Would you like to play again?  Type Y to continue.")
    if answer.lower() == "y":
        startProgram()
    else:
        break

quit()

person IguanaStudios    schedule 24.09.2020    source источник
comment
user_answer = int(...) вызовет ошибку, если вы введете число с плавающей запятой.   -  person Thierry Lathuille    schedule 24.09.2020


Ответы (1)


Единственное, что должно быть в операторе try, — это код, проверяющий, можно ли преобразовать ввод в оператор int. Вы можете начать с функции, единственная задача которой состоит в том, чтобы запрашивать у пользователя число до тех пор, пока int(response) действительно не завершится успешно без каких-либо исключений.

def get_guess():
    while True:
        response = input("> ")
        try:
            return int(response)
        except ValueError:
            print("That was not a number, try again")

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

# The former getGuess
def play_game(stored_num, name):

    print(f"Hello {name}, I'm thinking of a number between 1-20.")
    print("Can you guess what number I'm thinking of?")

    while True:
        user_answer = get_guess()
        
        if user_answer >= 21 or user_answer <=0:
            print("That is not a number between 1-20. Try again.")
        elif user_answer > stored_num:
            print(f"That guess is too high. Try again {name}!")
        elif user_answer < stored_num:
            print(f"That guess is too low. Try again {name}!")
        else:  # Equality is the only possibility left
            print("You are correct! You win {name}!")
            break
person chepner    schedule 24.09.2020