关于作业执行到猜数字环节,有个用户输入的问题
来源:3-2 项目作业
Kaito_
2019-08-02 21:22:37
import sys import random import datetime def guide_page(guide_word): """ 设置参数guide_word,记录要输出的标题文字信息 :param guide_word: 接收实参 :return: str """ print("{0}{1}{0}".format("*" * 25, guide_word)) # 运用字符串的格式化函数(format),拼接“*”号和标题文字信息 def all_num(n): """ 设置参数n接收用于进行判定的变量的值 :param n:int/str/float :return:bool """ return n.isdigit() # 运用isdigit( )方法进行判定并返回其判定结果 def num_legal(ls): """ 设置列表类型的参数用于接收指定的序列 :param ls:接收变量i,j数值生成序列 :return: """ if int(ls[0]) == int(ls[1]): # 取出序列中的值并进行比较,若两者相等,则退出程序,并提示玩家重新启动程序; print("您输入的区间数字相同,请重新启动程序!") sys.exit() elif int(ls[0]) > int(ls[1]): # 取出序列中的值并进行比较,若表示数字区间起始位置的值大于数字区间终止位置的值,则退出程序,并提示玩家重新启动程序; print("您输入的数字区间大小有误,请重新启动程序!") sys.exit() else: return 1 def set_final_num(num1, num2): """ 根据参数值,产生一个位于参数值区间以内的随机数 :param num1: :param num2: :return: """ num_ls = [num1, num2] # 设置两个参数用于接收用户所输入区间的起始值和终止值,并将其保存至列表中 final_ls = list(filter(all_num, num_ls)) # 利用内置函数filter()及思路分析2中的all_num(n)过滤以确保输入值全部为数字 if len(final_ls) == 2: # 依据结果过滤后的返回值进行判断 result = num_legal(final_ls) if result == 1: print("所产生的随机数字区间为:{} - {}".format(num1, num2)) return random.randint(int(num1), int(num2)) else: print("您所输入的为非数字字符,请重新启动程序!") sys.exit() def check_num_legal(num): """ 判定所输入的数值是否在指定的区间 :param num: :return: """ # guess_num = all_num(num) if int(num) < int(i) or int(num) > int(j): print("对不起!您输入的数字未在指定区间") sys.exit() def write_record(times, value): """ 将玩家每一次猜测数字和本次猜测次数两项信息写入日志文件 :param times: 猜测的次数 :param value: 猜测的数字 :return: """ file_name = "record.txt" record = "{}:第{}次您猜测的数字为:{}\n".format(datetime.datetime.now(), times, value) with open(file_name, "a", encoding="utf-8") as r: r.write(record) def main(rand1): """ 依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字 :param rand1: :return: """ temp = 0 while True: guess_num = int(input("请继续输入您猜测的数字:")) # 提示用户输入所猜测数字,并转换为int类型 if check_num_legal(guess_num) != 0: # if判断核查数值函数 if rand1 == guess_num: temp += 1 # 次数+1 write_record(temp, guess_num) # 调用日志写入函数 print("*" * 20 + "\n" + "恭喜您!只用了{}次就赢得了游戏".format(temp)) return elif rand1 > guess_num: temp += 1 write_record(temp, guess_num) print("*" * 20 + "\n" + "Lower than the answer\n" + "*" * 20) elif rand1 < guess_num: temp += 1 write_record(temp, guess_num) print("*" * 20 + "\n" + "Higher than the answer\n" + "*" * 20) else: exit() if __name__ == "__main__": guide_page(guide_word="欢迎进入数字猜猜猜小游戏") i = input("数字区间起始值:") j = input("数字区间终止值:") fin_num = set_final_num(i, j) main(fin_num)
按照思路基本实现了要求,现在有个问题,当执行到猜数字环节,程序运行到
guess_num = int(input("请继续输入您猜测的数字:"))
的时候,如果这里输入一个非数字,就会报错,尝试用前面定义的all_num判断后再转换数据类型依旧会报错。
想问下怎么改一下可以在这里进行一次数据类型判断,然后不报错执行程序。
谢谢老师!
1回答
while True:
guess_num = int(input("请继续输入您猜测的数字:")) # 提示用户输入所猜测数字,并转换为int类型
这一步有问题,你直接转换成int了,如果不能转会报错,guess_num = input("请继续输入您猜测的数字:"),可以把外层int去掉,然后对guess_num进行是否能转换成数字的判断,即all_num(guess_num)
相似问题
回答 1
回答 1