关于作业执行到猜数字环节,有个用户输入的问题

来源: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回答

dh1211

2019-08-03

while True:
   guess_num = int(input("请继续输入您猜测的数字:"))  # 提示用户输入所猜测数字,并转换为int类型

这一步有问题,你直接转换成int了,如果不能转会报错,guess_num = input("请继续输入您猜测的数字:"),可以把外层int去掉,然后对guess_num进行是否能转换成数字的判断,即all_num(guess_num)

0

0 学习 · 8160 问题

查看课程