20244123 实验四 Python综合实践

20244123 2024-2025-4 Python综合实践

课程:《Python程序设计》
班级: 2441
姓名: 邓淑怀
学号:20244123
实验教师:王志强
实验日期:2025年5月24日
必修/选修: 公选课

一、实验要求

本次实验为Python综合应用,可以结合上课所学,从爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等方面入手,熟练运用python基本知识,编写并成功运行程序
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

二、实验分析

(一)思路分析
所学知识中,我对编写文字互动类型的小游戏比较有兴趣,其在编写过程中不必过多依赖大模型修改,并且可以帮助理解和运用例如“import”导入类库和模块、“def”定义函数、“except”异常处理等编译知识。所以最后,我结合自身经历,以电科院为背景,编写了这款“电科院的三天”文字交互游戏,玩家可以根据不同选择触发不同剧情,达成不同成就,并在游戏中录入和读取日记。
(二)技术支持
为了拓展和继续学习python知识,丰富和优化游戏程序运行效果,我查找搜索了以下函数和程序的用法,为设计编辑提供了原理和技术上的支持。
1.time:time模块提供了各种时间相关的功能,包括获取当前时间、延迟执行、时间格式转换等。本次实验中利用time.sleep(秒数)来以指定的秒数暂停程序执行,实现文本上下差序显现和延迟效果,使游戏的输出更加流畅和富有节奏感。
2.os:os模块提供了与操作系统交互的功能,包括文件和目录操作、环境变量管理等。本次实验中利用os模块进行日记和成就文件的操作,在游戏开始时清空前面玩家的日记和成就记录,确保玩家每次开始游戏时都是全新的体验。
3.sys:sys模块提供了与 Python 解释器和环境交互的功能。本次实验中利用sys模块设定加载时的animation,实现动态的加载动画,增强游戏视觉效果。
4.json:json格式用于处理 JavaScript Object Notation数据,常用于数据存储和交换。本次实验中利用json模块读写成就文件,记录和显示玩家获得的成就。在实验时,因为成就文件触发、记录和读取有些复杂,所学的基本文件操作实现效果较差,在大模型的建议下改用格式相对简单、文件体积小、适用于保存游戏中成就、配置等数据的json格式,便于调试和编辑。
5. type:type语句用于定义函数,封装重复的代码逻辑,使程序结构更加清晰。本次实验中利用type语句定义了函数 type_text,用于逐字符打印带颜色的文本,增强游戏交互性和视觉效果。
6.except:except语句用于捕获和处理异常,防止游戏程序因错误而崩溃。本次实验中利用except语句在读取或写入文件时捕获可能发生的异常,当文件不存在或读写错误,提供错误提示。但是后来检查代码时,发现在选项选择时也应该增设异常处理,避免玩家选择1和2之外的数字导致运行出错。
7. ANSI 转义码和color_code:color_code用于存储控制台文本颜色的 ANSI 转义码。本次实验中利用 ANSI 转义码\033[94m:将文本颜色设置为蓝色,用于显示游戏的主要内容和提示信息;用\033[91m:将文本颜色设置为红色,用于显示选择项,使选项更加突出,便于玩家识别;用\033[92m:将文本颜色设置为绿色,用于显示成就解锁信息,使成就信息更加醒目;用\033[93m:将文本颜色设置为黄色,用于显示成就列表标题,使其与普通文本区分开来;用\033[0m:将文本格式重置为默认设置,用于在改变文本颜色后恢复正常显示,避免后续文本继续使用之前设置的颜色。在游戏中通过不同的颜色突出显示不同的文本内容,如选择项、成就提示等,增强游戏的视觉效果和可读性。

三、实验设计

(一)功能设计
本次实验中为游戏程序设计了主函数、游戏开头展示、故事线推进、用户交互、成就系统和日记系统等功能,尽可能优化游戏体验。
1.主函数:主函数作为游戏的入口点,协调游戏的各个部分按顺序执行。在该部分中,游戏会首先确认是否清空日记和成就文件,然后调用display_intro函数显示游戏开头,再依次调用day_1、day_2 和 day_3函数,推进游戏的三天故事,并在游戏结束后,显示成就和日记内容,并清空日记文件,输出感谢信息,结束程序运行。
2.游戏开头展示:开头部分向玩家展示游戏包括游戏标题、背景故事和游戏目标的开头信息。在该部分中,游戏使用type_text函数逐字符打印带颜色的文本,增强视觉效果;使用time.sleep控制文本输出节奏,使玩家有时间阅读每一段内容,不至于程序与体验脱节;最后用show_loading_animation函数显示加载动画,增加游戏沉浸感。
3.故事线推进:使程序按照时间线即三天推进游戏故事,每一天都包含固定情节和多个故事分支。在该部分中,游戏定义了day_1、day_2 和 day_3函数,分别负责每一天故事内容,然后每一天的故事都从早晨开始,包括晨跑、早餐等固定情节,然后根据玩家的选择展开不同的分支,使用type_text函数输出故事情节,使玩家了解当前情境,跟上叙事节奏。
4.用户交互:通过接收玩家输入,并根据输入做出相应的回应,推进游戏进程。在每个需要玩家做决定的地方,调用show_choice_prompt函数显示选择提示,并使用 input 函数获取玩家输入,根据输入值执行不同的故事分支,影响游戏的走向,最后实现不同结局。
5.成就系统:该系统可以记录玩家在游戏中达成的成就,增强游戏的挑战性和趣味性。在该系统中,游戏定义了record_achievement函数,在玩家达成特定条件时记录成就,并使用json模块将成就数据保存到文件中,确保游戏结束后读取成就记录时不会丢失,再调用show_achievements函数显示玩家获得的所有成就。
6.日记系统:该系统允许玩家记录每天的游戏经历,增加游戏的代入感和回忆功能。在该系统中,游戏定义了create_or_append_to_diary函数,用于创建或追加日记内容,在每一天的故事结束时,提示玩家输入日记内容,并将其保存到文件中,最终在游戏结束时,调用'read_diar函数显示玩家的日记内容,让玩家回顾自己的游戏经历。
7.加载动画:该部分实现在游戏的不同阶段显示加载动画,增强游戏的视觉效果和沉浸感。游戏定义了show_loading_animation函数,使用简单的字符序列“animation = ["|", "/", "-", "\"]”模拟加载过程,并在游戏开头和每一天的故事之间调用该函数,使游戏过渡更加流畅。
8.清空系统:该系统会在游戏开始时清空日记文件和成就文件,确保玩家每次开始游戏时都是全新体验。游戏定义了clear_diaryclear_achievements函数,用于清空日记和成就文件内容,并在主函数中调用这些函数,确保游戏开始前文件被清空。
(二)源代码

点击查看代码
import time
import os
import sys
import json

# 初始化日记文件名和成就文件名
diary_filename = "diary.txt"
achievements_filename = "achievements.json"

# 打印带颜色的文本
def type_text(text, color_code, delay=0.02):
    for char in text:
        print(color_code + char + '\033[0m', end='', flush=True)
        time.sleep(delay)
    print()

# 显示加载动画
def show_loading_animation():
    animation = ["|", "/", "-", "\\"]
    for i in range(20):
        sys.stdout.write("\r加载中 " + animation[i % 4])
        sys.stdout.flush()
        time.sleep(0.1)
    print("\r加载完成!" + " " * 20)

# 清除日记内容
def clear_diary():
    try:
        open(diary_filename, "w").close()
        print(f"日记文件 {diary_filename} 已清空。")
    except Exception as e:
        print(f"清空日记时出错:{e}")

# 清除成就记录
def clear_achievements():
    try:
        open(achievements_filename, "w").close()
        print(f"成就文件 {achievements_filename} 已清空。")
    except Exception as e:
        print(f"清空成就时出错:{e}")

# 日记功能:创建或写入日记
def create_or_append_to_diary(text=None):
    if text is None:
        text = input("请输入你今天的日记内容:")
    try:
        with open(diary_filename, "a") as file:
            file.write(time.strftime("%Y-%m-%d %H:%M:%S") + " - " + text + "\n")
        print(f"已将内容添加到日记文件 {diary_filename}")
    except Exception as e:
        print(f"写入日记时出错:{e}")

# 日记功能:读取日记内容
def read_diary():
    try:
        with open(diary_filename, "r") as file:
            text = file.read()
        if text:
            print("日记内容:")
            print(text)
        else:
            print(f"日记文件 {diary_filename} 为空。")
    except FileNotFoundError:
        print(f"日记文件 {diary_filename} 不存在。")
    except Exception as e:
        print(f"读取日记时出错:{e}")

# 成就功能:记录成就
def record_achievement(achievement_name, achievement_description):
    try:
        # 从文件中读取现有成就
        try:
            with open(achievements_filename, "r") as file:
                achievements = json.load(file)
        except (FileNotFoundError, json.JSONDecodeError):
            achievements = {}

        # 如果成就尚未获得,则记录它
        if achievement_name not in achievements:
            achievements[achievement_name] = achievement_description
            with open(achievements_filename, "w") as file:
                json.dump(achievements, file, indent=4)
            type_text(f"成就解锁:{achievement_name} - {achievement_description}", '\033[92m', 0.01)
    except Exception as e:
        print(f"记录成就时出错:{e}")

# 成就功能:显示成就
def show_achievements():
    try:
        with open(achievements_filename, "r") as file:
            achievements = json.load(file)
        if achievements:
            print("已获得的成就:")
            for name, description in achievements.items():
                type_text(f"{name}: {description}", '\033[93m', 0.01)
        else:
            print("你还没有获得任何成就。")
    except FileNotFoundError:
        print(f"成就文件 {achievements_filename} 不存在。")
    except Exception as e:
        print(f"读取成就时出错:{e}")

# 显示游戏开头
def display_intro():
    type_text("欢迎来到电科院的三天生活!", '\033[94m', 0.03)
    time.sleep(1)
    type_text("在这一学期,你将面临许多选择,它们会决定你的一天如何展开,甚至影响你的未来。", '\033[94m', 0.03)
    time.sleep(1)
    type_text("高考结束,你以优异的成绩进入了北京电子科技学院,开始了精彩的大一生活。", '\033[94m', 0.03)
    time.sleep(1)
    type_text("经过一学期的磨砺,你进入了院团委宣传部、院宣讲团以及系内的生活权益部。", '\033[94m', 0.03)
    time.sleep(1)
    type_text("你也参加了各种比赛并取得了一些成就。现在,你将体验三天的校园生活。\n", '\033[94m', 0.03)
    time.sleep(1)
    show_loading_animation()

# 显示选择提示
def show_choice_prompt():
    type_text("请选择一个选项:", '\033[91m', 0.01)

# 第一天的故事线
def day_1():
    type_text("第一天:早晨的 begins", '\033[94m', 0.03)
    time.sleep(1)
    type_text("闹钟响起,你揉了揉惺忪的睡眼,迅速从床上爬起。胡乱洗漱后,你冲向操场。寒冷的空气让你瞬间清醒,尽管身体疲惫,但意志力支撑着你全力奔跑。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("跑到一半,体力不支,呼吸紊乱,但你调整节奏,最终以不错的状态完成晨跑。打完卡,你深吸一口气,感觉一天的状态被完全激活。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("你走进食堂,看到长队,犹豫了一下,但决定今天的早餐必须吃好。你加入队伍,耐心等待。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线1:早餐选择
    type_text("你站在食堂的窗口前,看着丰富的早餐品种,陷入了思考。", '\033[94m', 0.03)
    type_text("(1)尝试新菜品,给自己一个惊喜", '\033[91m', 0.03)
    type_text("(2)选择熟悉的食物,保证营养", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定尝试新菜品,选了一碗热气腾腾的特色粥和两样小菜。味道出奇地好,你吃得津津有味。", '\033[94m', 0.03)
        record_achievement("美食探索家", "尝试了食堂的新菜品")
    else:
        type_text("你选择熟悉的食物,快速解决早餐。吃饱后,你感觉状态良好,精力充沛地走向教室。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线2:课堂参与
    type_text("你坐在教室里,老师开始讲解今天的内容。你看着课本,思考着如何更好地参与课堂。", '\033[94m', 0.03)
    type_text("(1)积极互动,提出创新见解", '\033[91m', 0.03)
    type_text("(2)认真听讲,做好笔记", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("课堂上,老师讲解的内容格外清晰,你积极互动,甚至提出了几个创新性的见解。课后,老师主动和你交流想法,还邀请你参与一个大创项目。", '\033[94m', 0.03)
        record_achievement("学术新星", "在课堂上提出了创新性见解")
    else:
        type_text("课堂上,老师讲解的内容清晰明了,你认真听讲,做好笔记。在小组讨论中,你提出了一个结合实际的建议,获得老师和同学们的一致好评。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线3:午餐和休息
    type_text("上午的课程结束,你感到肚子有些饿了,也开始思考中午的安排。", '\033[94m', 0.03)
    type_text("(1)和朋友一起吃午餐,交流近况", '\033[91m', 0.03)
    type_text("(2)回宿舍休息,为下午的课程养精蓄锐", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你和朋友一起吃午餐,交流了彼此的近况和对课程的感受。你们还讨论了即将到来的社团活动,增进了彼此的了解。", '\033[94m', 0.03)
        record_achievement("社交达人", "与朋友进行了有意义的交流")
    else:
        type_text("你回到宿舍休息,短暂的午睡让你恢复了精力。你为下午的课程做好了充分的准备,感觉状态良好。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线4:下午课程和晚餐
    type_text("下午的课程即将开始,你坐在教室里,思考着如何更好地参与课堂。", '\033[94m', 0.03)
    type_text("(1)主动回答问题,展示知识", '\033[91m', 0.03)
    type_text("(2)认真听讲,吸收知识", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("下午的课程中,你主动回答了几个问题,展示了你的知识和理解。老师对你的表现表示赞赏,同学们也对你投来钦佩的目光。", '\033[94m', 0.03)
        record_achievement("课堂之星", "在课堂上主动回答问题并获得老师表扬")
    else:
        type_text("下午的课程中,你认真听讲,吸收了大量知识。你做了详细的笔记,为后续的复习打下了坚实的基础。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线5:晚课和日记
    type_text("晚课即将开始,你思考着如何更好地准备。", '\033[94m', 0.03)
    type_text("(1)提前预习晚课内容,做好准备", '\033[91m', 0.03)
    type_text("(2)复习当天的课程内容,巩固知识", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你提前预习了晚课内容,对课程的重点有了初步的了解。晚课上,你能够更好地跟上老师的讲解,理解复杂的概念。", '\033[94m', 0.03)
        record_achievement("预习先锋", "提前预习晚课内容并取得良好效果")
    else:
        type_text("你复习了当天的课程内容,巩固了所学的知识。通过复习,你对课程的重点和难点有了更深入的理解。", '\033[94m', 0.03)
    time.sleep(2)

    # 写日记
    type_text("晚课结束后,你回到宿舍,开始写日记。", '\033[94m', 0.03)
    create_or_append_to_diary()

    # 作业完成和宣传部排版工作等任务
    type_text("晚上,你收到宣传部的通知,需要在今晚完成一份重要的排版工作。", '\033[94m', 0.03)
    time.sleep(1)
    type_text("同时,你还有未完成的作业需要提交。", '\033[94m', 0.03)
    time.sleep(1)

    # 支线6:任务优先级选择
    type_text("你看着桌上的作业和宣传部的任务,思考着该如何安排时间。", '\033[94m', 0.03)
    type_text("(1)先完成宣传部的排版工作", '\033[91m', 0.03)
    type_text("(2)先完成作业", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定先完成宣传部的排版工作。经过努力,你按时完成了任务,得到了部长的表扬。", '\033[94m', 0.03)
        record_achievement("团队贡献者", "优先完成宣传部任务并获得表扬")
        # 根据选择影响作业完成情况
        type_text("但由于时间紧迫,你的作业只能匆忙完成,质量不高。", '\033[94m', 0.03)
    else:
        type_text("你决定先完成作业。作业完成得很出色,得到了老师的认可。", '\033[94m', 0.03)
        record_achievement("学术优先", "优先完成作业并获得老师认可")
        # 根据选择影响宣传部任务完成情况
        type_text("但由于时间关系,宣传部的排版工作只能延后完成,部长有些不满。", '\033[94m', 0.03)
    time.sleep(2)

# 第二天的故事线
def day_2():
    type_text("第二天:早晨的 begins", '\033[94m', 0.03)
    time.sleep(1)
    type_text("闹钟再次响起,你已经逐渐适应了早起的节奏。胡乱洗漱后,你冲向操场。寒冷的空气依然刺骨,但你已经能更好地应对这种挑战。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("跑到一半,虽然还是有些体力不支,但你已经能更好地调整呼吸,最终以不错的状态完成晨跑。打完卡,你深吸一口气,感觉自己的身体逐渐适应了这种强度。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("你走进食堂,看着熟悉的长队,已经不再像第一天那样焦虑。你加入队伍,耐心等待。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线1:早餐选择
    type_text("你站在食堂的窗口前,看着丰富的早餐品种,思考着今天的选择。", '\033[94m', 0.03)
    type_text("(1)尝试新菜品,给自己一个惊喜", '\033[91m', 0.03)
    type_text("(2)选择熟悉的食物,保证营养", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定尝试新菜品,选了一碗热气腾腾的特色粥和两样小菜。味道出奇地好,你吃得津津有味。", '\033[94m', 0.03)
    else:
        type_text("你选择熟悉的食物,快速解决早餐。吃饱后,你感觉状态良好,精力充沛地走向教室。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线2:课堂参与
    type_text("你坐在教室里,老师开始讲解今天的内容。你看着课本,思考着如何更好地参与课堂。", '\033[94m', 0.03)
    type_text("(1)积极互动,提出创新见解", '\033[91m', 0.03)
    type_text("(2)认真听讲,做好笔记", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("课堂上,老师讲解的内容格外清晰,你积极互动,甚至提出了几个创新性的见解。课后,老师主动和你交流想法,还邀请你参与一个大创项目。", '\033[94m', 0.03)
    else:
        type_text("课堂上,老师讲解的内容清晰明了,你认真听讲,做好笔记。在小组讨论中,你提出了一个结合实际的建议,获得老师和同学们的一致好评。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线3:午餐和休息及例会准备
    type_text("上午的课程结束,你感到肚子有些饿了,也开始思考中午的安排。你知道下午有一个生活权益部的例会,需要提前准备。", '\033[94m', 0.03)
    type_text("(1)提前准备例会内容", '\033[91m', 0.03)
    type_text("(2)先休息,到时候再说", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定提前准备例会内容。经过仔细思考,你提出了一些有建设性的意见。", '\033[94m', 0.03)
        type_text("例会上,你的建议被大家采纳,部长对你的表现非常满意。", '\033[94m', 0.03)
        record_achievement("团队贡献者", "在例会上提出建设性意见并被采纳")
    else:
        type_text("你选择先休息,例会前匆忙准备。虽然你还是提出了几点建议,但显得有些仓促。", '\033[94m', 0.03)
        type_text("部长没有特别的反应,你的建议没有被采纳。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线4:下午课程和晚餐
    type_text("下午的课程即将开始,你坐在教室里,思考着如何更好地参与课堂。", '\033[94m', 0.03)
    type_text("(1)主动参与小组讨论,分享观点", '\033[91m', 0.03)
    type_text("(2)认真听讲,吸收知识", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("下午的课程中,你主动参与小组讨论,分享了自己的观点。你的见解得到了同学们的认可,促进了讨论的深入进行。", '\033[94m', 0.03)
        record_achievement("团队合作者", "在小组讨论中积极分享观点并促进讨论")
    else:
        type_text("下午的课程中,你认真听讲,吸收了大量知识。你做了详细的笔记,为后续的复习打下了坚实的基础。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线5:晚课和日记
    type_text("晚课即将开始,你思考着如何更好地准备。", '\033[94m', 0.03)
    type_text("(1)提前预习晚课内容,做好准备", '\033[91m', 0.03)
    type_text("(2)复习当天的课程内容,巩固知识", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你提前预习了晚课内容,对课程的重点有了初步的了解。晚课上,你能够更好地跟上老师的讲解,理解复杂的概念。", '\033[94m', 0.03)
    else:
        type_text("你复习了当天的课程内容,巩固了所学的知识。通过复习,你对课程的重点和难点有了更深入的理解。", '\033[94m', 0.03)
    time.sleep(2)

    # 写日记
    type_text("晚课结束后,你回到宿舍,开始写日记。", '\033[94m', 0.03)
    create_or_append_to_diary()

    # 宣讲团宣讲任务
    type_text("晚上,你收到宣讲团的通知,需要在明天的班会上进行宣讲。", '\033[94m', 0.03)
    time.sleep(1)

    # 支线6:宣讲准备
    type_text("你思考着如何准备明天的宣讲,时间已经不早了,需要尽快决定。", '\033[94m', 0.03)
    type_text("(1)今晚开始准备宣讲内容", '\033[91m', 0.03)
    type_text("(2)明天早上再准备", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定今晚开始准备宣讲内容。经过几个小时的努力,你准备了一份精彩的宣讲稿。", '\033[94m', 0.03)
        record_achievement("未雨绸缪", "提前准备宣讲内容")
    else:
        type_text("你决定明天早上再准备。今晚好好休息,养精蓄锐。", '\033[94m', 0.03)
    time.sleep(2)

# 第三天的故事线
def day_3():
    type_text("第三天:早晨的 begins", '\033[94m', 0.03)
    time.sleep(1)
    type_text("闹钟响起,你已经完全适应了早起的节奏。胡乱洗漱后,你冲向操场。寒冷的空气已经不再刺骨,你甚至开始享受这种清晨的锻炼。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("跑到一半,你依然会感到有些体力不支,但现在的你能更好地调整呼吸和节奏,最终以不错的状态完成晨跑。打完卡,你深吸一口气,感觉自己的身体已经完全适应了这种强度。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("你走进食堂,看着熟悉的长队,已经能从容应对。你加入队伍,耐心等待。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线1:早餐选择
    type_text("你站在食堂的窗口前,看着丰富的早餐品种,思考着今天的选择。", '\033[94m', 0.03)
    type_text("(1)尝试新菜品,给自己一个惊喜", '\033[91m', 0.03)
    type_text("(2)选择熟悉的食物,保证营养", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定尝试新菜品,选了一碗热气腾腾的特色粥和两样小菜。味道出奇地好,你吃得津津有味。", '\033[94m', 0.03)
    else:
        type_text("你选择熟悉的食物,快速解决早餐。吃饱后,你感觉状态良好,精力充沛地走向教室。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线2:课堂表现和作业检查
    type_text("你坐在教室里,老师开始讲解今天的内容。你知道今天老师会检查作业,有些紧张。", '\033[94m', 0.03)
    type_text("(1)积极参与课堂讨论,提出创新见解", '\033[91m', 0.03)
    type_text("(2)认真听讲,做好笔记", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("课堂上,老师讲解的内容格外清晰,你积极互动,甚至提出了几个创新性的见解。课后,老师主动和你交流想法,还邀请你参与一个大创项目。", '\033[94m', 0.03)
    else:
        type_text("课堂上,老师讲解的内容清晰明了,你认真听讲,做好笔记。在小组讨论中,你提出了一个结合实际的建议,获得老师和同学们的一致好评。", '\033[94m', 0.03)
    time.sleep(2)

    if choice == "1":
        type_text("上午的课程结束后,老师检查作业。老师对你的作业给予了高度评价,还在班上表扬了你。", '\033[94m', 0.03)
        record_achievement("学术之星", "作业完成出色并获得老师表扬")
    else:
        type_text("上午的课程结束后,老师检查作业。老师对你的作业表示满意,但仍有改进空间。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线3:班会准备
    type_text("午休时,你思考着下午的班会宣讲,有些紧张但也有些期待。", '\033[94m', 0.03)
    type_text("(1)再次复习宣讲内容", '\033[91m', 0.03)
    type_text("(2)放松一下,调整心态", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你决定再次复习宣讲内容。经过仔细检查,你发现了一些可以改进的地方,宣讲稿更加完善。", '\033[94m', 0.03)
    else:
        type_text("你选择放松一下,调整心态。深呼吸几次,你感觉更加自信和平静。", '\033[94m', 0.03)
    time.sleep(2)

    if choice == "1":
        type_text("下午的班会上,你进行宣讲。你的宣讲非常成功,同学们反响热烈,连老师也对你表示了赞赏。", '\033[94m', 0.03)
        record_achievement("宣讲达人", "班会宣讲非常成功并获得老师赞赏")
    else:
        type_text("下午的班会上,你进行宣讲。你的宣讲表现一般,同学们反应平淡。虽然没有出错,但也没有特别出彩的地方。", '\033[94m', 0.03)
    time.sleep(2)

    # 支线4:晚餐和晚课
    type_text("班会结束后,你思考着晚上的安排。晚餐后还有晚课,需要提前做好准备。", '\033[94m', 0.03)
    type_text("(1)提前预习晚课内容,做好准备", '\033[91m', 0.03)
    type_text("(2)复习当天的课程内容,巩固知识", '\033[91m', 0.03)
    show_choice_prompt()
    choice = input("请输入你的选择(1 或 2):")
    if choice == "1":
        type_text("你提前预习了晚课内容,对课程的重点有了初步的了解。晚课上,你能够更好地跟上老师的讲解,理解复杂的概念。", '\033[94m', 0.03)
    else:
        type_text("你复习了当天的课程内容,巩固了所学的知识。通过复习,你对课程的重点和难点有了更深入的理解。", '\033[94m', 0.03)
    time.sleep(2)

    # 写日记
    type_text("晚课结束后,你回到宿舍,开始写日记。", '\033[94m', 0.03)
    create_or_append_to_diary()

    # 支线5:总结和反思
    type_text("你坐在桌前,回顾这三天的校园生活,思考着自己的表现和收获。", '\033[94m', 0.03)
    time.sleep(2)
    type_text("虽然有些地方可以做得更好,但你已经尽力了。你对未来充满了期待,相信自己能够在电科院度过一段美好的时光。", '\033[94m', 0.03)
    time.sleep(2)

# 主函数
def main():
    # 清空日记和成就
    clear_diary()
    clear_achievements()

    # 显示游戏开头
    display_intro()

    # 游戏主线
    day_1()
    show_loading_animation()
    day_2()
    show_loading_animation()
    day_3()

    # 游戏结束
    type_text("\n游戏结束!", '\033[94m', 0.03)
    time.sleep(1)
    type_text("你完成了三天的校园生活。", '\033[94m', 0.03)
    time.sleep(1)

    # 显示成就
    type_text("以下是你的成就:", '\033[93m', 0.03)
    time.sleep(1)
    show_achievements()
    time.sleep(1)

    # 读取日记
    type_text("现在,你可以查看你的日记。", '\033[94m', 0.03)
    time.sleep(1)
    read_diary()
    time.sleep(1)

    # 清空日记,方便下次游玩
    clear_diary()

    type_text("感谢游玩!", '\033[94m', 0.03)

if __name__ == "__main__":
    main()
(三)逐行解释
点击查看代码


















四、运行结果

如果嵌入视频播放不出来,还请老师点击一下连接
https://www.bilibili.com/video/BV1uWjGzVEJr?vd_source=b3f6dabe61d76d05027911fce5ac2fe5

五、实验问题

1.实验中,开始错误使用“"choice = input("\033[91m请输入你的选择(1 或 2):\033[0m")”代码,导致在运行过程中前后的转义码字符会和文本一起出现,在上网查找和学习转义码用法和type封装后,修改为“`type_text("请输入你的选择(1 或 2):\n", '\033[94m')”,成功运行。
2.开始没有设计清空系统,导致运行了几次代码后,发现之前的成就和日记文本会重复出现,最后用clear_achievements和clear_diary两个函数建立清空系统,确保初始化更新。
3.其他方面,对python语法仍然不算非常熟练,容易出现格式、用法上的错误,花费大量检查时间。

六、收获感悟

本次实验作为这学期python程序设计的结课作业,综合考察了对python的深入理解和准确应用。
就这次实验来说,此次设计强化了我的编程技能,加深了我对python程序设计过程的理解,积累了一定经验。同时,我也在探索和学习中新了解和初步掌握了time、sys、os等模块的用法,学会了转义码、封装、文字颜色与延迟的操作,收益良多,受益匪浅。
就这学期课程来讲,Python为我打开了编程世界的大门,领略到编程的魅力与强大。从最初对代码的陌生与困惑,到如今能够比较熟练地熟练运用Python,这一路的学习挑战与惊喜并存,付出和收获相伴。在课程中,我逐渐掌握了Python中变量、数据类型、控制与结构等的基本语法,接触到一些实用和常用的函数与模块,学会建立socket交互系统进行客户端和终端的交流,以及利用基础的requests模块合法爬取网页数据,其丰富多样的强大功能让我切实感受到Python在实际工作中的广泛应用。总体而言,本学期的Python课程学习让我培养了编程思维和解决问题的能力,也感谢王志强老师在授课中的耐心付出和悉心讲解,让我对python充满探索的兴趣,我期待将所学知识应用到更多实际场景中,不断探索Python的更多可能性。
(ps一点点小建议:希望老师以后授课的速度可以再慢一些,有时候真的有点跟不上,然后课前签到的方式可以试试挑战更复杂的 („ಡωಡ„) )

参考资料

  • 《Python程序设计》
posted @ 2025-05-25 22:54  20244123邓淑怀  阅读(77)  评论(0)    收藏  举报