冷月去哪儿

导航

 

题目要求:

        根据现实生活中的猜数字游戏的游戏规则,运用Python语言模拟实现猜数字游戏的的基本功能,请学员们参考真实的猜数字游戏规则和如下的程序运行效果图进行代码编写,以实现“数字猜猜猜”小游戏的基本功能。游戏规则介绍如下:

1、玩家根据提示进行数字区间起始位置和终止位置的输入

2、依据 1 中输入的数字区间,产生该区间内一个随机数,用于进行猜测比对的终值

3、提示用户输入所猜测的数字,与 2 中产生的随机数字进行比对,并将相应的信息写入指定的日志文件(日志文件名称:record.txt;日志文件路径:与.py文件处于同一级目录)

4、依据 3 中的比对结果。若两者不等,打印友好提示,重复 3、4 步骤;若两者相等,则退出该函数,执行下列语句

5、当猜测的值不在指定区间内时,不需要统计次数和记录

6、打印如效果图所示,用以提示游戏结束的信息

 

运行效果图:

(1) 成功运行效果图:

(2) 输入区间起始值和区间终止值相等效果图:

(3)输入区间起始值大于区间终止值效果图:

(4)输入区间起始值和终止值为非数字字符效果图:

任务描述

一、语言和环境

1、实现语言:Python语言

2、版本:Python3.6或Python3.6以上版本

3、环境要求及开发工具:Pycharm

二、程序整体要求

1、 划分功能模块,日志文件用以进行游戏过程中信息记录,主程序用以进行代码编写

2、 函数的定义要清楚易懂,代码结构要层次分明,代码中可添加必要的注释

3、 程序中的函数名、变量名、参数名称要符合命名规范

4、 程序运行效果与提供的页面效果图、结构保持一致,提示中的分隔符(“*”)数量不做统一要求,文字大小、背景色也不做统一要求

5、 将作业项目形成压缩文件并提交

三、思路分析:

由题目要求和运行效果,可分析出项目划分为两大模块:mooc_test.py和record.txt

前者主要完成游戏后台逻辑的控制,并进行如效果图所示的功能点的补充(要求编码时注意函数抽取思想的应用):

1、自定义游戏进入提示函数guide_page(guide_word):

     功能描述: 提示玩家进入游戏,并输出如效果图标题的所示信息, 要求:

        (1)设置参数guide_word,记录要输出的标题文字信息

        (2)运用字符串的格式化函数(format),拼接“*”号和标题文字信息

        (3)符合程序运行效果图中标题的样式进行输出(注:“*”号的数量不作统一限制)

2、自定义数字类型判断函数all_num(n):

     功能描述:判断指定的值是否为数字,要求:

        (1)设置参数n接收用于进行判定的变量的值

        (2)运用isdigit( )方法进行判定并返回其判定结果 

3、自定义数值合法性判定函数num_legal(ls):

     功能描述:判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否大于记录数字区间终止位置的值,要求:

        (1)设置列表类型的参数用于接收指定的序列

        (2)取出序列中的值并进行比较:

                     若两者相等,则退出程序,并提示玩家重新启动程序;

                     若表示数字区间起始位置的值大于数字区间终止位置的值,则退出程序,并提示玩家重新启动程序;

                     反之,则返回值为1

          注意:导入sys模块,sys.exit()即退出程序

4、自定义产生指定区间随机数函数set_final_num(num1,num2):

     功能描述:根据参数值,产生一个位于参数值区间以内的随机数, 要求:

       (1)设置两个参数用于接收用户所输入区间的起始值和终止值,并将其保存至列表中

       (2)利用内置函数filter()及思路分析2中的all_num(n)过滤以确保输入值全部为数字

       (3)依据(2)中过滤后的返回值进行判断,若全部为数字,则调用自定义的等值判断函数,判断输入值是否相等,并根据判断之后的返回值,输出用户产生随机数的区间,并运用random模块,返回产生区间内的随机数;反之则提示玩家所输入的为非数字字符,请重新启动

5、自定义核查数值是否属于指定区间函数check_num_legal(num):

     功能描述:判定所输入的数值是否在指定的区间

     要求:依据输入的数字区间起始值和终止值,利用条件语句判断输入数值是否在指定区间,若不在该区间内,则提示玩家所输入的数字未在指定区间

6、自定义日志写入函数write_record(times,value):

     功能描述:将玩家每一次猜测数字和本次猜测次数两项信息写入日志文件,要求:

     (1)设置参数接收玩家猜测的次数(times)和本次猜测的具体数字(value)

     (2)根据datetime模块获取玩家进行每一次猜测数字输入的时间

     (3)使用with语法操作日志文件,将获取到的参数和时间信息以追加方式写入日志文件

7、自定义main(rand1)函数:

     功能描述:依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字, 要求:

     (1)设置变量temp接收已产生的随机数字,记录猜测数字的次数(默认为0) 

     (2)设置无限循环:                             

                                 1.提示用户输入所猜测数字,并转换为int类型 

                                 2.if判断核查数值函数,如果为真,则输出对不起您输入的数字未在指定区间!!!,跳过本次循环

                                 3.实现用户输入一次猜测数字,次数+1

                                 4.调用日志写入函数,传入猜测的次数和用户猜测的数字

                                 5.当猜测的值不在指定区间内时,不需要统计次数和记录

                                 6.使用if语句判断用户猜测的数字,相等,大于,小于的情况,并输出如效果图所示的提示信息

8、控制程序逻辑执行流程(if __name__ == '__main__':):

     功能描述:依据效果图,调用自定义函数实现对应的功能

     要求:

              (1)调用guide_page(  )输出如效果图所示的标题信息

              (2)设置两个变量(i,j)分别接收用户输入数字区间的起始值和终止值

              (3)调用set_final_num( )函数得到随机数

              (4)调用main( )执行程序流程

注意:根据“数字猜猜猜”游戏的整体思路,控制程序的执行流程,记录玩家每一次游戏的数据信息(日志写入函数的信息格式),效果如下:

 

评分标准是什么?

一、规范【5分】

    1、作业所涉及的所有方法都封装在"mooc_test.py"文件中

    2、代码中写入的日志文件的命名为record.txt

    3、代码结构要层次分明

    4、Python代码规范及添加适量注释

二、程序整体运行效果【8分】

    程序正常运行效果,且满足效果图要求。信息间分隔符“*”号数量不做统一要求

三、自定义星(*)号展示函数【5分】

    根据运行效果设置‘数字猜猜猜’游戏运行启动提示信息

四、自定义核查某数值是否属于指定区间函数【6分】

    设置参数接收用户所输入的数据并判定其是否属于区间起始值和区间终止值之间

五、自定义数值合法性判定函数【9分】

    根据获取的列表类型参数加以判断该参数中的2个值是否相等或区间起始值是否大于终止值

六、自定义数字类型判定函数【6分】

    正确运用内置函数isdigit()判断指定数据是否为python中的数值类型

七、自定义日志写入函数【11分】

    根据每一次所输入的游戏猜测数字、猜数字的具体次数将这两项信息写入指定的日志文件

    注:日志文件名称:record.txt,日志文件路径:与.py文件处于同一目录下

八、自定义产生指定区间随机数函数【20分】

    根据输入的区间起始值和终止值,设置一个随机数以供玩家进行猜测

    具体功能如下:

        (1)利用内置函数filter()过滤以确保输入值为数字

        (2)若过滤的终值全部为数字,则调用自定义函数判断输入值是否合法并运用random模块,产生区间内的随机数

        (3)若过滤的终值不是数字,则提示用户输入的字符为非数字字符,重新启动程序

九、自定义main()函数【20分】

    依据产生的随机数提示玩家进行输入所猜测的具体数字并进行判断。若输入的猜测数字与产生的随机数相等吗,则返回本次游戏共猜测了多少次;反之,则循环输入所猜测的数字,重复以上步骤。

十、控制程序逻辑执行流程【10分】

    根据“数字猜猜猜”游戏的整体思路,控制程序的执行流程,并在游戏开始和结尾进行如效果图所示的友好提示

 

主程序 2020年第一次写

import random
import sys
from datetime import datetime
def guide_page():
    """
    功能描述: 提示玩家进入游戏,并输出如效果图标题的所示信息, 要求:
        (1)设置参数guide_word,记录要输出的标题文字信息
        (2)运用字符串的格式化函数(format),拼接“*”号和标题文字信息
        (3)符合程序运行效果图中标题的样式进行输出(注:“*”号的数量不作统一限制)
    """
    str_ = "*"*15
    content = "欢迎进入数字猜猜猜小游戏"
    str_print = str_ + content + str_
    print (str_print)

def all_num(n):
    """
    功能描述:判断指定的值是否为数字,要求:
        (1)设置参数n接收用于进行判定的变量的值
        (2)运用isdigit( )方法进行判定并返回其判定结果
    """
    return n.isdigit()

def num_legal(ls):
    """
    功能描述:判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否大于记录数字区间终止位置的值,要求:
        (1)设置列表类型的参数用于接收指定的序列
        (2)取出序列中的值并进行比较:
            若两者相等,则退出程序,并提示玩家重新启动程序;
            若表示数字区间起始位置的值大于数字区间终止位置的值,则退出程序,并提示玩家重新启动程序;
            反之,则返回值为1
    """
    if ls[0] == ls[1]:
        print("您输入的区间数字相同!!请重新启动程序")
        sys.exit()
    elif ls[0] > ls[1]:
        print("您输入的区间大小有误!!请重新启动程序")
        sys.exit()
    else:
        return 1

def set_final_num(num1,num2):
    """
    功能描述:根据参数值,产生一个位于参数值区间以内的随机数,要求:
       (1)设置两个参数用于接收用户所输入区间的起始值和终止值,并将其保存至列表中
       (2)利用内置函数filter()及思路分析2中的all_num(n)过滤以确保输入值全部为数字
       (3)依据(2)中过滤后的返回值进行判断,若全部为数字,则调用自定义的等值判断函数,
       判断输入值是否相等,并根据判断之后的返回值,输出用户产生随机数的区间,
       并运用random模块,返回产生区间内的随机数;反之则提示玩家所输入的为非数字字符,请重新启动
    """
    all_numb = [num1, num2]
    list_new = list(filter(all_num,all_numb))
    if len(list_new) == 2:
        list_new2 = list(map(lambda n:int(n),list_new))
        rest = num_legal(list_new2)
        if rest == 1:
            result = random.randint(list_new2[0],list_new2[1])
            return result
        else:
            print("您所输入的为非数字字符!!请重新启动程序。")
            sys.exit()
    else:
        print("您所输入的为非数字字符!!请重新启动程序。")
        sys.exit()


def check_num_legal(num):
    """
    功能描述:判定所输入的数值是否在指定的区间
     要求:依据输入的数字区间起始值和终止值,利用条件语句判断输入数值是否在指定区间,
     若不在该区间内,则提示玩家所输入的数字未在指定区间
     """
    if ls[0] <= num <= ls[1]:
        return 1
    else:
        return "所输入的数字未在指定区间"

def write_record(times,value):
    """
    功能描述:将玩家每一次猜测数字和本次猜测次数两项信息写入日志文件,要求:
     (1)设置参数接收玩家猜测的次数(times)和本次猜测的具体数字(value)
     (2)根据datetime模块获取玩家进行每一次猜测数字输入的时间
     (3)使用with语法操作日志文件,将获取到的参数和时间信息以追加方式写入日志文件"""
    datetime_ = datetime.now()
    date_ = datetime_.date()
    time_ = datetime_.time()
    rest = "{0} {1}: 第{2}次您猜测的数字为:{3}".format(date_, time_, times, value)
    file_name = "record.txt"
    with open(file_name, "a",encoding="utf-8") as f:
        f.write(rest)
        f.write("\n")
    # return

def main(rand1):
    """
    功能描述:依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字,
    要求:
     (1)设置变量temp接收已产生的随机数字,记录猜测数字的次数(默认为0)
     (2)设置无限循环:
          1.提示用户输入所猜测数字,并转换为int类型
          2.if判断核查数值函数,如果为真,则输出对不起您输入的数字未在指定区间!!!,跳过本次循环
          3.实现用户输入一次猜测数字,次数+1
          4.调用日志写入函数,传入猜测的次数和用户猜测的数字
          5.使用if语句判断用户猜测的数字,相等,大于,小于的情况,并输出如效果图所示的提示信息
    """
    temp = rand1
    count = 0
    while True:
        num_guess = input("请输入您猜测的数字:")
        print("************")
        is_num = all_num(num_guess)
        if is_num == True:
            num_guess = int(num_guess)
            num_check = check_num_legal(num_guess)
            if num_check != 1:
                print("对不起您输入的数字未在指定区间!!!")
                continue
            count += 1
            write_record(count,num_guess)
            if num_guess == temp:
                str_win = "恭喜您!只用了{0}次就赢得了游戏".format(count)
                print(str_win)
                break
            elif num_guess < temp:
                str_Lower = "Lower than the answer"
                print(str_Lower)
            elif num_guess > temp:
                str_Highter = "Higher than the answer"
                print(str_Highter)
        else:
            print("对不起您输入的不是一个数字")

if __name__ == "__main__":
    """
    功能描述:依据效果图,调用自定义函数实现对应的功能
     要求:
        (1)调用guide_page(  )输出如效果图所示的标题信息
        (2)设置两个变量(i,j)分别接收用户输入数字区间的起始值和终止值
        (3)调用set_final_num( )函数得到随机数
        (4)调用main( )执行程序流程
    注意:根据“数字猜猜猜”游戏的整体思路,控制程序的执行流程,
    记录玩家每一次游戏的数据信息(日志写入函数的信息格式)
    """
    guide_page()
    i = input("数字区间起始值:")
    j = input("数字区间终止值:")
    num_random = set_final_num(i, j)
    ls = [i, j]
    rst=  num_legal(ls)
    if rst == 1:
        str_rage = "所产生的随机数字区间为:['{0}','{1}']".format(i, j)
        print(str_rage)
        i = int(i)
        j = int(j)
        ls = [i, j]
        main(num_random)
    print("END")

 

主程序 2021年12月重写

from datetime import datetime
import random
import sys

from guessNumberGame import constants


def guide_page():
    """
    功能描述: 提示玩家进入游戏,并输出如效果图标题的所示信息, 要求:
        (1)设置参数guide_word,记录要输出的标题文字信息
        (2)运用字符串的格式化函数(format),拼接“*”号和标题文字信息
        (3)符合程序运行效果图中标题的样式进行输出(注:“*”号的数量不作统一限制)
    """
    str = 20 * '*'
    print(str + constants.GUIDE_WORD + str)

def all_num(n):
    """
    功能描述:判断指定的值是否为数字,要求:
        (1)设置参数n接收用于进行判定的变量的值
        (2)运用isdigit( )方法进行判定并返回其判定结果
    """
    rest = str.isdigit(n)
    return rest

def num_legal(ls):
    """
    功能描述:判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否大于记录数字区间终止位置的值,要求:
        (1)设置列表类型的参数用于接收指定的序列
        (2)取出序列中的值并进行比较:
            若两者相等,则退出程序,并提示玩家重新启动程序;
            若表示数字区间起始位置的值大于数字区间终止位置的值,则退出程序,并提示玩家重新启动程序;
            反之,则返回值为1
    """
    if ls[0] == ls[1]:
        print(constants.EQUAL_AGAIN_WORD)
        sys.exit()
    elif ls[0] > ls[1]:
        print(constants.REVERSE_AGAIN_WORD)
        sys.exit()
    else:
        return 1

def set_final_num(num1,num2):
    """
    功能描述:根据参数值,产生一个位于参数值区间以内的随机数,要求:
       (1)设置两个参数用于接收用户所输入区间的起始值和终止值,并将其保存至列表中
       (2)利用内置函数filter()及思路分析2中的all_num(n)过滤以确保输入值全部为数字
       (3)依据(2)中过滤后的返回值进行判断,若全部为数字,则调用自定义的等值判断函数,
       判断输入值是否相等,并根据判断之后的返回值,输出用户产生随机数的区间,
       并运用random模块,返回产生区间内的随机数;反之则提示玩家所输入的为非数字字符,请重新启动
    """
    list_str = [num1, num2]
    list_1 = list(filter(all_num,list_str))
    if len(list_1) == 2:
        legal_rest = num_legal(list_1)
        if legal_rest == 1:
            num1 = int(num1)
            num2 = int(num2)
            random_num = random.randint(num1,num2)
            print(random_num)
            return random_num
    else:
        print(constants.STR_AG_WORD)
        sys.exit()

def check_num_legal(num):
    """
    功能描述:判定所输入的数值是否在指定的区间
     要求:依据输入的数字区间起始值和终止值,利用条件语句判断输入数值是否在指定区间,
     若不在该区间内,则提示玩家所输入的数字未在指定区间
     """
    if list_input[0] <= num <= list_input[1]:
        return 1
    else:
        return 0

def write_record(times, value):
    """
         功能描述:将玩家每一次猜测数字和本次猜测次数两项信息写入日志文件,要求:
     (1)设置参数接收玩家猜测的次数(times)和本次猜测的具体数字(value)
     (2)根据datetime模块获取玩家进行每一次猜测数字输入的时间
     (3)使用with语法操作日志文件,将获取到的参数和时间信息以追加方式写入日志文件
    :param times:  当前时间
    :param value: 猜测的数字
    """
    file_name = 'record.txt'
    datetimenow_ = datetime.now()
    date_ = datetimenow_.date()
    time_ = datetimenow_.time()
    write_str = '{date}{time}:第{times}次您猜测的数字为:{value}'.format(date = date_, time = time_, times = times, value = value)
    with open(file_name,'a',encoding='utf-8') as f:
        f.write(write_str)
        f.write('\n')

def writ_n_record():
    """每次游戏结束后,在日志中换行"""
    file_name = 'record.txt'
    with open(file_name, 'a', encoding='utf-8') as f:
        f.write('\n')

def main(rand1):
    """
    功能描述:依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字,
    要求:
     (1)设置变量temp接收已产生的随机数字,记录猜测数字的次数(默认为0)
     (2)设置无限循环:
          1.提示用户输入所猜测数字,并转换为int类型
          2.if判断核查数值函数,如果为真,则输出对不起您输入的数字未在指定区间!!!,跳过本次循环
          3.实现用户输入一次猜测数字,次数+1
          4.调用日志写入函数,传入猜测的次数和用户猜测的数字
          5.使用if语句判断用户猜测的数字,相等,大于,小于的情况,并输出如效果图所示的提示信息
    """
    temp = 0
    count = 0
    while(True):
        #第一次猜测时,显示请猜测数字
        if  count <= 0:
            temp = input(constants.GUESS_WORD)
        #大于第一次猜测时,显示请继续猜测数字
        else:
            temp = input(constants.GUESS_AG_WORD)
        #判断猜测的数是否是数值
        if all_num(temp):
            temp = int(temp)
        else:
            print(constants.STR_AG_WORD)
            continue
        if  check_num_legal(temp) == 1:
            count += 1
            times = count
            value = temp
            write_record(times, value)
            if temp > rand1:
                print(30 * '*')
                print(constants.HIGHT_WORD)
                continue
            elif temp < rand1:
                print(30 * '*')
                print(constants.LOWER_WORD)
                continue
            else:
                end_print = '恭喜您!只用了{}次就赢得了游戏'.format(count)
                print(end_print)
                writ_n_record()
            break
        else:
            print(constants.LIMITS_ERR_WORD)
            continue

__name__ = '__main__'
"""
    功能描述:依据效果图,调用自定义函数实现对应的功能
     要求:
        (1)调用guide_page(  )输出如效果图所示的标题信息
        (2)设置两个变量(i,j)分别接收用户输入数字区间的起始值和终止值
        (3)调用set_final_num( )函数得到随机数
        (4)调用main( )执行程序流程
    注意:根据“数字猜猜猜”游戏的整体思路,控制程序的执行流程,
    记录玩家每一次游戏的数据信息(日志写入函数的信息格式)
"""
guide_page()
i = input(constants.NUM1_WORD)
j = input(constants.NUM2_WORD)
rand_num = set_final_num(i, j)
i = int(i)
j = int(j)
list_input = [i, j]
region_str = constants.REGION_WORD + '{}'.format(list_input)
print(region_str)
main(rand_num)
print("END")

constants.py  常量

#文本信息
GUIDE_WORD = '欢迎进入数字猜猜猜小游戏'
EQUAL_AGAIN_WORD = '您输入区间数字相同!!请重新启动程序'
REVERSE_AGAIN_WORD = '您输入区间数字大小有误!!请重新启动程序'
STR_AG_WORD = '您所输入的为非数字字符,请重新启动!'
NUM1_WORD = '数字区间起始值:'
NUM2_WORD = '数字区间终止值:'
REGION_WORD = '所产生的随机数区间为:'
GUESS_WORD = '请输入您猜测的数字:'
GUESS_AG_WORD = '请继续输入您猜测的数字:'
HIGHT_WORD = 'lower than the answer'
LOWER_WORD = 'hight than the answer'
LIMITS_ERR_WORD = '对不起您输入的数字未在指定区间'

 

总结:

1、该程序知识点 模块的调用、datetime模块调用、函数的应用、文件读写、filter函数应用、 if嵌套、循环

2、第二次写比第一次更完善,加入了常量表(但是命名用起来很鸡肋),提示功能和日志功能有了部分优化。但是第二次写没有了第一次的注释和“初心”,需要保持

3、熟练度还不够,经常卡壳,还需要加强知识的熟练程度

 

posted on 2021-12-08 22:31  冷月去哪儿  阅读(711)  评论(0)    收藏  举报