我正在尝试为我的猜谜游戏添加一个尝试/除了来自用户的非数字条目。我不太确定如何用我的代码实现它,但我确实尝试过,但出现错误:
<块引用>ValueError: 以 10 为基数的 int() 的无效文字:'v'
我不确定如何重新排列我的代码以使其与 try/except 一起工作。
def guessing_game(secret_number: int, user_guess: int):
num_tries: int = 0
user_name: str = input("Please enter your name: ")
print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
secret_number: int = randint(1, 19)
user_guess: int = int(input("Guess what it is: "))
try:
while num_tries != 5:
if user_guess > secret_number:
user_guess = int(input("Your guess is too high. Try again: "))
elif user_guess < secret_number:
user_guess = int(input("Your guess is too low. Try again: "))
else:
print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
break
num_tries += 1
if user_guess != secret_number and num_tries == 5:
print(f"Sorry.The number I was thinking of was {secret_number}")
except ValueError:
print("Error, value must be numerical")
guessing_game(2, 8)
答案 0 :(得分:0)
您可能正在寻找这样的东西。无需在此处将所有内容都包装在一个函数中(无论如何您都没有使用传入的两个参数)。
外部 for
循环处理在所有尝试都用完后停止游戏; Python 的(非常独特)for
/else
结构处理输掉比赛。
只要用户提供无效输入,内部 while
循环就会循环;您可以在其中添加 if not (1 <= user_guess <= 19): raise ValueError()
以验证用户是否愚蠢并输入例如-1
或 69
。
为简化起见,只剩下一个 input()
,游戏循环会为它修改 prompt
。
from random import randint
user_name: str = input("Please enter your name: ")
print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
secret_number: int = randint(1, 19)
prompt = "Guess what it is: "
for num_tries in range(5):
while True:
try:
user_guess: int = int(input(prompt))
break # out of the while
except ValueError:
print("Error, value must be numerical")
if user_guess > secret_number:
prompt = "Your guess is too high. Try again: "
elif user_guess < secret_number:
prompt = "Your guess is too low. Try again: "
else:
print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
break
else: # for loop was not `break`ed out of
print(f"Sorry. The number I was thinking of was {secret_number}")
答案 1 :(得分:0)
您没有正确捕获异常,因为输入转换在 try
块之外。
当用户尝试输入文字字符串时,该行:
user_guess: int = int(input("Guess what it is: "))
引发 ValueError
因为该字符串不是 int-castable 并且指令不在 try 中,这意味着默认 traceback
处理异常。
只需将该行移动到 try 块内
try:
user_guess: int = int(input("Guess what it is: "))
话虽如此,您需要更好地组织您的代码。首先,您的函数应该只是在用户输入和密码之间进行匹配。然后您将创建循环并为每个用户输入调用该函数:
def guessing_game(secret_number: int, user_guess: int):
if user_guess > secret_number:
print("Your guess is too high.")
elif user_guess < secret_number:
user_guess = print("Your guess is too low.")
else:
print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
return True
user_name = input("Please enter your name: ") # String casting is redundant here.
print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
secret_number = randint(1, 19) # Why not (1,20) though?
# Here is the loop. It keeps prompting the user to enter a number and if the
# input represents a valid integer the function is called to compair them.
num_tries = 0
while True:
if num_tries == 5:
print(f"Sorry.The number I was thinking of was {secret_number}")
break
try:
user_guess = int(input("Guess what it is: "))
if guessing_game(secret_number, user_guess) == True:
break
except ValueError:
print("Error, value must be numerical")
num_tries += 1