20242219 《Python程序设计》实验1报告

20242219 2025-2026-2 《Python程序设计》实验1报告

课程:《Python程序设计》
班级: 2422
姓名: 陈儒俊
学号:20242219
实验教师:王志强
实验日期:2026年3月23日
必修/选修: 公选课

1.实验内容

1.熟悉Python开发环境;
介绍Python开发环境的各项功能。
2.练习Python运行、调试技能;
编写书中的程序,并进行调试分析,要有过程(运行需要截图、调试需要截图)。
3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;
编写一个猜数字的游戏。
4.利用LLM生成猜数字的游戏。
运行并给出相应的截图。
对比你写的Python程序,分析LLM生成代码的优点,至少写3个。
5. 掌握git技能
需要把编写的代码托管到Gitee上,给出托管过程和结果,并在此放上链接(Markdown格式)

2. 实验过程及结果

2.1 熟悉Python开发环境

工具:PyCharm
运行环境:Windows/Linux
核心功能:代码编辑(语法高亮、自动补全)、可视化调试、项目管理、Git集成、插件扩展

2.2 Python运行与调试技能练习

以猜数字游戏代码为例,完成多工具调试:

  1. 调试:在循环入口行设置断点,通过“Step Over”(F8)逐行执行,实时查看usernumberlowhigh等变量值,同时可以查看rabot的值
  2. 调试结果
    屏幕截图 2026-03-23 211946

2.3 猜数字游戏程序编写

完整代码

import random

print("欢迎来到比赛猜数字游戏!你能赢我吗?")
print("\n游戏规则:")
print("1. 你需要输入一个数字范围,然后选择一个幸运数字(在范围内)")
print("2. 你和我(机器人)轮流猜测对方的数字")
print("3. 每次猜测后,对方会告诉你是大了、小了还是猜对了")
print("4. 谁先猜对对方的数字谁获胜")
print("5. 如果输入无效或不守规矩,会受到惩罚(猜测次数+1)")
print("\n准备好开始挑战了吗?")

while True:
    try:
        level = int(input("输入这次比赛猜的范围: "))
        if level < 0:
            print("范围不能为负数,请重新输入!")
            continue
        break
    except ValueError:
        print("请输入有效的数字!")

# 优化:增加幸运数字输入校验
while True:
    try:
        user = int(input(f"我想好了我的幸运数字,请输入你的幸运数字(0~{level}): "))
        if 0 <= user <= level:
            break
        else:
            print(f"数字超出范围(0~{level}),请重新输入!")
    except ValueError:
        print("请输入有效的数字!")

robot = random.randint(0, level)  

usernumber = 0  # 用户猜测次数
robotnumber = 0  # 机器人猜测次数
user_won = False  # 用户获胜标记
robot_won = False  # 机器人获胜标记
low = 0  # 机器人猜测下限
high = level  # 机器人猜测上限

print("\n游戏比赛开始了!")

while not user_won and not robot_won:
    # 用户猜测回合
    print("\n你的回合,我的数字是什么?")
    try:
        userguess = int(input("请输入你的猜测: "))
        usernumber += 1
        
        if userguess > robot:
            print("没猜对小老弟,大了!")
        elif userguess < robot:
            print("没猜对小老弟,小了!")
        else:
            print("不错嘛,猜对了!")
            user_won = True
    except ValueError:
        print("怎么回事小老弟,不守规矩,得给你点惩罚,你的猜测次数+1!!!")
        usernumber += 1
    
    # 机器人猜测回合(用户未获胜时执行)
    if not user_won:
        print("\n哈哈,到我了!")
        robot_guess = (low + high) // 2
        print(f"我猜你的数字是:{robot_guess} 对不对,小老弟?")
        
        # 优化:增加输入选项校验
        while True:
            usernum = input("如果大了,输入1,如果小了,输入2,如果对了,输入3: ")
            if usernum in ["1", "2", "3"]:
                break
            else:
                print("输入无效!请输入1、2或3!")
        
        robotnumber += 1
        
        if usernum == "1":
            if robot_guess > user:
                high = robot_guess - 1
            else:
                print("小老弟,不守规矩,得给你点惩罚,你的猜测次数+1!!!")
                usernumber += 1
        elif usernum == "2":
            if robot_guess < user:
                low = robot_guess + 1
            else:
                print("小老弟,不守规矩,得给你点惩罚,你的猜测次数+1!!!")
                usernumber += 1
        elif usernum == "3":
            if robot_guess == user:
                print("我猜的数字对了!")
                robot_won = True
            else:
                # 修复:删除重复提示
                print("小老弟,不守规矩,得给你点惩罚,你的猜测次数+1!!!")
                usernumber += 1

# 游戏结束,显示结果
print("\n游戏结束!")
print(f"你的猜测次数: {usernumber}")
print(f"机器人的猜测次数: {robotnumber}")

if user_won and robot_won:
    print("平局!再接再厉!")
elif user_won:
    print("不错嘛,恭喜你赢了!")
elif robot_won:
    print("我赢了,你还得练,再来一局吧!")

运行结果示例

image

2.4 LLM生成猜数字游戏代码(豆包生成)

豆包生成的猜数字游戏代码

"""
猜数字游戏 - 豆包LLM生成版本
功能:支持自定义数字范围,人机双向猜数,带友好提示和异常处理
遵循PEP8编码规范,模块化设计,便于扩展和维护
"""
import random

def init_game():
    """初始化游戏参数,获取用户设定的数字范围和幸运数字"""
    print("🎮 欢迎来到智能猜数字游戏(豆包版)🎮")
    # 获取合法的数字范围
    while True:
        try:
            max_num = int(input("\n请设定猜数字的最大范围(正整数):"))
            if max_num <= 0:
                print("❌ 范围必须是正整数,请重新输入!")
                continue
            break
        except ValueError:
            print("❌ 输入无效!请输入有效的整数!")
    
    # 获取用户的幸运数字
    while True:
        try:
            user_secret = int(input(f"请输入你的幸运数字(1~{max_num}):"))
            if 1 <= user_secret <= max_num:
                break
            else:
                print(f"❌ 数字超出范围!请输入1~{max_num}之间的数字!")
        except ValueError:
            print("❌ 输入无效!请输入有效的整数!")
    
    # 生成机器人的幸运数字
    robot_secret = random.randint(1, max_num)
    print(f"\n✅ 游戏初始化完成!机器人已生成1~{max_num}之间的幸运数字,开始对战!")
    return max_num, user_secret, robot_secret

def user_guess_round(robot_secret):
    """用户猜测回合,返回是否猜对、用户猜测次数"""
    guess_count = 0
    while True:
        try:
            user_guess = int(input("\n🔍 你的回合:猜猜机器人的幸运数字是多少?"))
            guess_count += 1
            
            if user_guess > robot_secret:
                print("⬇️ 猜大了!再往小了猜猜~")
            elif user_guess < robot_secret:
                print("⬆️ 猜小了!再往大了猜猜~")
            else:
                print(f"🎉 恭喜你!猜对了!你一共猜了{guess_count}次!")
                return True, guess_count
        except ValueError:
            print("❌ 输入错误!请输入有效的整数,本次不计入次数~")
            continue

def robot_guess_round(user_secret, max_num):
    """机器人猜测回合,使用二分法优化猜测效率,返回是否猜对、机器人猜测次数"""
    guess_count = 0
    low, high = 1, max_num
    while low <= high:
        guess_count += 1
        robot_guess = (low + high) // 2
        print(f"\n🤖 机器人的回合:我猜你的幸运数字是 {robot_guess}!")
        
        # 获取用户反馈并校验
        while True:
            feedback = input("请反馈(大了输1/小了输2/猜对了输3):")
            if feedback not in ["1", "2", "3"]:
                print("❌ 反馈无效!请输入1、2或3!")
                continue
            break
        
        if feedback == "1":
            high = robot_guess - 1
        elif feedback == "2":
            low = robot_guess + 1
        else:
            if robot_guess == user_secret:
                print(f"🤖 机器人猜对了!一共猜了{guess_count}次!")
                return True, guess_count
            else:
                print("❌ 你反馈错误!机器人本次猜测不计入次数~")
                guess_count -= 1
    print("🤖 机器人无法猜出你的数字,你赢了!")
    return False, guess_count

def main():
    """游戏主函数"""
    max_num, user_secret, robot_secret = init_game()
    user_win, user_count = False, 0
    robot_win, robot_count = False, 0
    
    # 游戏主循环
    while not user_win and not robot_win:
        # 用户猜测
        user_win, user_count = user_guess_round(robot_secret)
        if user_win:
            break
        # 机器人猜测
        robot_win, robot_count = robot_guess_round(user_secret, max_num)
    
    # 游戏结果展示
    print("\n🏆 游戏结束 🏆")
    print(f"你的猜测次数:{user_count}")
    print(f"机器人的猜测次数:{robot_count}")
    if user_win:
        print("🥳 你获得了胜利!")
    else:
        print("😜 机器人获得了胜利!")

if __name__ == "__main__":
    main()

豆包生成代码的优点分析

  1. 模块化与结构化更强:将游戏拆分为init_game()user_guess_round()robot_guess_round()main()等函数,每个函数仅负责单一功能,代码复用性和扩展性远高于自研的线性代码(比如新增“多轮游戏”功能只需修改main函数);
  2. 用户体验与容错性更优:豆包生成的代码对所有输入(范围、猜测值、反馈)都做了严格校验,且无效输入不计入次数(而非自研代码的“惩罚机制”),提示信息增加了可视化符号(🎮、❌、🎉),更符合用户使用习惯;
  3. 逻辑优化更合理:机器人猜测环节优化了二分法逻辑,增加“反馈错误校验”,避免用户恶意反馈导致逻辑混乱,相比自研代码的简单二分法更健壮;
  4. 编码规范与可读性更高:代码完全遵循PEP8规范,包含清晰的文档字符串和功能注释,变量命名(如user_secretrobot_guess)语义化更强,自研代码的usernumberusernum等命名易混淆。

2.5 Git技能与Gitee托管

托管过程

  1. 环境配置(Windows+OpenEuler):
    • 安装Git:Windows直接安装,OpenEuler执行yum install git -y
    • 配置用户信息:git config --global user.name "XXX"git config --global user.email "xxx@xxx.com"
  2. 本地操作
    mkdir code && cd code  # 创建并进入文件夹
    git init  # 初始化仓库
    git add guess_number.py doubao_guess_number.py  # 添加自研+豆包生成的代码文件
    git commit -m "实验一:猜数字游戏(自研+豆包LLM生成)"  # 提交代码
    
  3. Gitee关联与推送
    • 在Gitee创建仓库code
    • 关联远程仓库:git remote add origin https://gitee.com/Mr-Men_door/code
    • 推送代码:git push -u origin master
  4. 服务器验证:OpenEuler执行git clone https://gitee.com/Mr-Men_door/code,克隆后运行代码验证正常。

托管结果

Gitee仓库链接:https://gitee.com/Mr-Men_door/code

3. 实验过程中遇到的问题和解决过程

  • 问题1:自研代码中用户输入非数字时直接崩溃,无异常处理;
    问题1解决方案:添加try-except捕获ValueError,并对数字范围/幸运数字增加循环校验,确保输入合法;
  • 问题2:机器人猜测逻辑中low变量通过locals()判断,调试时出现未定义警告;
    问题2解决方案:提前初始化low=0high=level,删除locals()判断,简化逻辑;
  • 问题3:Git推送代码时出现“Authentication failed”错误;
    问题3解决方案:改用Gitee个人访问令牌(Settings->私人令牌)作为密码,或配置SSH密钥登录,重新推送成功;
  • 问题4:OpenEuler服务器VIM编辑代码时中文乱码;
    问题4解决方案:在~/.vimrc中添加set fileencodings=utf-8,gbkset encoding=utf-8,重启VIM后正常显示。

其他(感悟、思考等)

  1. 对比自研和豆包生成的代码,发现结构化、规范化编程的重要性——豆包能快速生成高质量、高可用性的代码,但其核心逻辑(如二分法猜数)仍基于基础编程知识,自研过程是理解底层逻辑的关键,二者结合才能真正提升编程能力;
  2. Git版本控制是编程必备技能,不仅能备份代码,还能实现多环境同步,避免代码丢失,也为后续协作开发打下基础;
  3. 实验中遇到的异常处理、字符编码、Git认证等问题,让我认识到编程不仅是写功能,还要考虑鲁棒性、环境适配等细节,实践是掌握编程的核心。

参考资料

posted @ 2026-03-23 21:03  这是昵称。。。  阅读(19)  评论(2)    收藏  举报