软件工程第二次作业
Python 作业:基于 Pygame 的“一箭又一箭”小游戏开发记录
0. 作业基本信息
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏,掌握 Pygame 开发及 Git 工作流 |
| 学号 | 102402131 |
| GitHub 仓库 | https://github.com/mth102402131/arrow-game-python |
1. 项目展示
本项目是一个基于 Python pygame 库开发的益智解谜游戏。玩家需要通过逻辑判断,按正确顺序点击箭头,使其飞出棋盘。
1.1 开始界面
游戏启动后显示主菜单,包含游戏标题和开始按钮。

1.2 游戏过程
玩家在网格棋盘上操作。绿色/蓝色箭头表示可操作对象。
- 成功操作:箭头沿指向飞出屏幕。
- 失败操作:箭头抖动,剩余失误次数减少。
![image]()
1.3 通关与失败
- 通关:消除所有箭头后,进入下一关。
- 失败:失误次数耗尽后,显示失败界面,支持立即重试当前关卡(无需返回主页)。
![image]()
演示视频/GIF:
2. 项目介绍
2.1 游戏规则
- 目标:消除棋盘上所有的箭头。
- 操作:鼠标左键点击箭头。
- 判定:
- 如果箭头指向的方向直到棋盘边缘都没有其他箭头阻挡,则消除成功,箭头飞出。
- 如果前方有其他箭头阻挡,则消除失败,箭头抖动,且玩家失去一次失误机会。
- 胜负:
- 所有箭头消除 -> 通关。
- 失误次数(默认 3 次)耗尽 -> 失败。
2.2 界面设计
- 顶部 UI 栏:显示当前关卡数、剩余失误次数、剩余箭头数量、重置按钮。
- 游戏区域:8xN 的网格棋盘,背景为浅蓝色,网格线清晰。
- 配色:使用高对比度颜色(蓝、红、绿)区分状态,确保视觉清晰。
2.3 主要功能与特色
- 即时反馈:点击无效时有明显的红色抖动动画。
- 友好重试:失败后直接重置当前关卡,减少重复操作,提升体验。
- 多关卡支持:内置 3 个难度递增的关卡,数据结构易于扩展。
3. 实现思路
3.1 数据结构
- 箭头 (Arrow):使用类
Arrow封装,属性包括row,col(坐标),direction(0-3 代表上下左右),active(是否存活)。 - 关卡 (Levels):使用列表嵌套元组存储,例如
[(2, 2, LEFT), ...],方便快速加载。
3.2 核心逻辑:路径检测 (check_path)
这是游戏最关键的算法。当玩家点击一个箭头时,需要判断其前方是否有阻挡。
算法流程:
- 获取当前箭头的方向向量
(dr, dc)。 - 从当前位置
(r, c)开始,沿向量步进:(r+dr, c+dc),(r+2dr, c+2dc)... - 在每一步检查:该坐标是否存在其他
active状态的箭头?- 若存在 -> 返回
False(有阻挡)。 - 若超出棋盘边界 -> 返回
True(无阻挡)。
- 若存在 -> 返回
4. AIGC 使用过程
在本次开发中,我利用 AI 助手辅助完成了代码结构设计、Bug 修复和功能迭代。以下是 3 次具有代表性的协作过程:
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 项目框架搭建与需求分析 | Qwen | 提供基于 pygame 的标准 Game Loop 结构,定义 Arrow 类与 Game 管理类,给出状态机(START / PLAYING / GAME_OVER)设计建议 |
快速确立 MVC 模式雏形,跳过 pygame API 摸索阶段,可直接进入业务逻辑开发 | 根据实际关卡需求微调了类的属性字段与状态命名 |
| 核心逻辑 Bug 修复(路径检测) | Qwen | 指出 check_path 循环终止条件问题,引入"步进向量"概念,增加棋盘边界显式检查,并建议使用 while steps < MAX_STEPS 防止死循环 |
修复了边缘箭头点击时的 IndexError 越界 Bug,路径检测准确率提升至 100% |
结合实际网格尺寸调整了 MAX_STEPS 阈值并补充了单元测试用例 |
| 用户体验优化(失败重试机制) | Qwen | 给出 handle_click 函数修改方案,将 self.state = "START" 改为 self.load_level(self.current_level_idx),并建议同步更新 UI 文字 |
实现无缝重试本关功能,避免失败后强制返回主菜单,大幅提升游戏流畅度 | 进一步扩展为"重试本关 / 下一关 / 选关"多按钮布局,并美化了提示文案 |
5.测试结果
编号 测试内容 预期结果 实际结果 结论
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头播放飞行动画后消失 Pass
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头红色抖动,UI 计数 -1 Pass
T03 点击位于边缘且朝向外的箭头 正常消失,无报错 正常消失,控制台无 Error Pass
T04 消除本关全部箭头 显示通关并进入下一关 显示"关卡通过",可点下一关 Pass
T05 失误次数耗尽 显示失败并允许重新开始 显示"挑战失败",点击可重置本关 Pass
T06 游戏进行中点击重置 箭头布局和失误次数恢复 所有箭头复位,计数回满 Pass
6. PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1.0 | 1.5 | +0.5 |
| Python 与图形库学习 | 2.0 | 3.0 | +1.0 |
| 游戏界面实现 | 2.0 | 2.5 | +0.5 |
| 路径与碰撞逻辑实现 | 3.0 | 4.0 | +1.0 |
| 关卡设计 | 1.0 | 1.0 | 0 |
| AIGC 辅助开发 | 1.5 | 2.0 | +0.5 |
| 测试与修改 | 1.5 | 2.0 | +0.5 |
| README 与博客撰写 | 1.0 | 1.5 | +0.5 |
| 合计 | 13.0 | 17.5 | +4.5 |
7.1 AI 带来的帮助
这次作业让我深刻体会到了 AIGC 作为“结对编程”伙伴的强大。
加速起步:AI 生成的 Pygame 模板代码让我跳过了繁琐的初始化配置,直接进入业务逻辑开发。
逻辑查漏:在编写路径检测算法时,我自己很难考虑到所有边界情况(如数组越界),AI 敏锐地指出了潜在风险并给出了防御性编程的建议。
即时反馈:遇到报错时,直接把错误日志丢给 AI,它能迅速定位问题(比如这次 Git 推送失败的身份配置问题),节省了大量查 StackOverflow 的时间。
7.2 出现的问题与解决
Git 身份配置:第一次提交时遇到了 Author identity unknown 错误。通过 AI 指导,学会了使用 git config 配置全局用户信息,并理解了 Commit 的意义。
坐标系混淆:Pygame 的 Y 轴向下增长,这与数学坐标系不同,导致初期箭头方向判断出错。通过打印调试和 AI 解释,理清了 row 和 y 的对应关系。




浙公网安备 33010602011771号