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

#python #isinstance #guess.js

#python #isinstance #guess.js

Вопрос:

Я хочу, чтобы эта игра с угадыванием чисел могла перехватывать все возможные исключения или ошибки, которые вводит пользователь. Я успешно предотвратил использование строк при угадывании числа, но я хочу, чтобы консоль отображала пользовательское сообщение при вводе числа с плавающей точкой, в котором говорится что-то вроде «Разрешены только целые числа от 1 до 20». Я понимаю, что мое исключение сработало бы для обнаружения такого рода ошибок, но в целях обучения я хочу специально обрабатывать, если пользователь вводит значение с плавающей точкой вместо int. Из того, что я смог найти в Интернете, функция 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()
  

Комментарии:

1. user_answer = int(...) вызовет ошибку, если вы введете значение с плавающей точкой.

Ответ №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