2026 秋软件工程个人作业(第二次):利用 AIGC 完成"一箭又一箭"小游戏
2026 秋软件工程个人作业(第二次):利用 AIGC 完成"一箭又一箭"小游戏
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 2026-01软件工程与软件工程实践 |
| 这个作业要求在哪里 | 作业要求链接 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成"一箭又一箭"小游戏 |
| 学号 | 102401415 |
| GitHub 仓库 | https://github.com/Lin-fzu/ArrowGame |
一、项目展示
1.1 开始界面
游戏启动后进入开始界面,展示游戏名称、规则说明和开始按钮。

1.2 游戏界面
游戏界面顶部显示关卡名称,左上角显示剩余箭头数量,右上角显示剩余失误次数,中央为游戏棋盘,底部提供重新开始和返回菜单按钮。


1.3 通关界面
清除当前关卡全部箭头后,显示通关结果,可选择进入下一关或重玩本关。

1.4 失败界面
失误次数耗尽时,显示失败结果,可选择重新开始或返回菜单。

二、项目介绍
2.1 游戏规则
"一箭又一箭"是一款点击式箭头解谜游戏。棋盘中包含上、下、左、右四种方向的箭头,玩家需要观察箭头的方向和相互阻挡关系,按照合适的顺序点击箭头,使所有箭头依次飞出棋盘。
- 点击箭头后,程序检查其前进方向上的路径
- 前方无阻挡:箭头飞出棋盘并被消除
- 前方有阻挡:箭头不能消除,触发碰撞反馈(前冲后返回 + 变红),并消耗一次失误机会
- 清除本关全部箭头即可进入下一关
- 失误次数耗尽时,本关失败,可重新开始
2.2 主要功能
| 功能 | 说明 |
|---|---|
| 图形化界面 | 基于 Pygame 开发,包含开始、游戏、通关、失败四种界面 |
| 四方向箭头 | 支持上、下、左、右四种箭头,用三角形绘制 |
| 鼠标点击操作 | 点击箭头尝试飞出,点击按钮进行操作 |
| 路径检测 | 正确判断箭头前进方向上是否存在其他箭头 |
| 飞出动画 | 箭头沿方向加速移出棋盘 |
| 碰撞反馈 | 箭头前冲后返回,同时变为红色警示 |
| 失误计数 | 显示剩余失误次数,耗尽则失败 |
| 三个关卡 | 3×3、4×4、5×5 三个难度递增的关卡 |
| 关卡切换 | 通关后自动进入下一关 |
| 重新开始 | 恢复当前关卡到初始状态 |
| 键盘快捷键 | R 键重开、ESC 键返回菜单 |
2.3 关卡设计
| 关卡 | 名称 | 棋盘大小 | 箭头数量 | 失误上限 |
|---|---|---|---|---|
| 1 | 初窥门径 | 3×3 | 4 | 3 |
| 2 | 渐入佳境 | 4×4 | 6 | 3 |
| 3 | 运筹帷幄 | 5×5 | 8 | 4 |
每个关卡均经过贪心算法验证,存在合理的通关顺序。
三、实现思路
3.1 数据结构设计
箭头方向表示:使用字符 U/D/L/R 分别表示上、下、左、右四种方向,关卡数据以二维字符数组存储,. 表示空格。
# 关卡数据示例
LEVELS = [
{
"name": "第一关 · 初窥门径",
"grid": [
["R", ".", "U"],
[".", ".", "."],
["D", ".", "L"],
],
"max_mistakes": 3,
},
]
Arrow 类:每个箭头对象包含以下属性:
row,col:在棋盘中的行列位置direction:箭头方向(U/D/L/R)alive:是否存活(未被消除)anim_state:动画状态(idle/flying/crashing)anim_progress:动画进度(0.0 ~ 1.0)
3.2 路径检测算法
路径检测是游戏的核心逻辑。对于一个箭头,从其位置出发,沿方向向量逐格检查,直到到达棋盘边界:
def check_path_clear(self, arrow):
dx, dy = DIR_VECTORS[arrow.direction]
r, c = arrow.row, arrow.col
rows = len(self.initial_grid)
cols = len(self.initial_grid[0])
nr, nc = r + dy, c + dx
while 0 <= nr < rows and 0 <= nc < cols:
if self.get_arrow_at(nr, nc) is not None:
return False # 遇到阻挡
nr += dy
nc += dx
return True # 路径畅通
算法说明:
- 时间复杂度 O(n),n 为棋盘边长
- 只检查同一行或同一列上箭头与边界之间的格子
- 遇到第一个存活箭头即返回 False(有阻挡)
- 到达边界仍未遇到箭头则返回 True(畅通)
3.3 动画系统
飞出动画:箭头沿方向向量移动,位移随动画进度递增,最终移出棋盘后将 alive 设为 False。
碰撞动画:箭头先沿方向前冲一段距离(进度 0~0.5),然后返回原位(进度 0.5~1.0),同时颜色变为红色。动画结束后恢复 idle 状态。
3.4 游戏状态管理
使用状态机管理游戏流程:
menu:开始界面playing:游戏进行中level_complete:关卡通关game_over:游戏失败all_complete:全部通关
状态切换由用户操作和游戏逻辑触发,例如消除全部箭头后切换到 level_complete,失误耗尽后切换到 game_over。
四、AIGC 使用过程
本次开发使用 豆包 (Doubao) 作为 AIGC 辅助工具,以下记录 4 次具有代表性的使用过程。
4.1 第一次:需求分析与代码结构设计
| 项目 | 内容 |
|---|---|
| 子任务 | 游戏整体架构设计 |
| 借助何种 AIGC 技术 | 豆包 (Doubao) |
| 提出的要求 | 分析"一箭又一箭"游戏需求,设计 Python + Pygame 的代码结构,包括类划分、核心方法和数据结构 |
| AI 实现或提供了什么 | 设计了 Arrow 类(箭头属性和动画)、ArrowGame 类(游戏主控制器),规划了路径检测、状态管理、界面绘制等模块,给出了关卡数据的二维数组表示方案 |
| 效果如何 | 整体架构清晰合理,类划分符合面向对象设计原则,数据结构选择恰当,为后续编码提供了明确的框架 |
| 人工修改 | 基本采用 AI 设计的结构,仅将字体初始化从 SysFont 改为直接加载字体文件(因兼容性问题,见第三次记录),并增加了键盘快捷键功能 |
4.2 第二次:路径检测算法实现
| 项目 | 内容 |
|---|---|
| 子任务 | 四方向路径检测与碰撞判断 |
| 借助何种 AIGC 技术 | 豆包 (Doubao) |
| 提出的要求 | 实现箭头前进方向的路径检测算法,要求正确处理四个方向、边界条件,以及有阻挡和无阻挡两种情况 |
| AI 实现或提供了什么 | 生成了 check_path_clear 方法,使用方向向量 DIR_VECTORS 统一处理四个方向,从箭头位置出发沿方向逐格检查,遇到其他箭头返回 False,到达边界返回 True |
| 效果如何 | 算法逻辑正确,四个方向统一处理避免了重复代码,边界条件处理得当,经测试 T01-T03 全部通过 |
| 人工修改 | 未做实质性修改,仅调整了变量命名以保持代码风格一致 |
4.3 第三次:Bug 修复 - Pygame 字体兼容性问题
| 项目 | 内容 |
|---|---|
| 子任务 | 修复游戏启动崩溃问题 |
| 借助何种 AIGC 技术 | 豆包 (Doubao) |
| 提出的要求 | 运行游戏时 pygame.font.SysFont("microsoftyahei", 48) 报错 TypeError: expected str, bytes or os.PathLike object, not int,分析原因并提供修复方案 |
| AI 实现或提供了什么 | 分析出这是 pygame 2.6.1 在 Python 3.13 上的已知兼容性问题(initsysfonts_win32 函数处理注册表字体时类型错误),建议改用 pygame.font.Font(font_path, size) 直接加载字体文件,并提供了微软雅黑字体的系统路径 |
| 效果如何 | 修复后游戏正常启动,中文字体渲染正确,所有界面文字显示正常 |
| 人工修改 | 采用 AI 建议的方案,将 4 处 SysFont 调用替换为 Font("C:/Windows/Fonts/msyh.ttc", size),并添加了注释说明原因 |
4.4 第四次:自动化测试用例编写
| 项目 | 内容 |
|---|---|
| 子任务 | 编写 T01-T06 自动化测试 |
| 借助何种 AIGC 技术 | 豆包 (Doubao) |
| 提出的要求 | 根据作业要求的 T01-T06 测试项,编写自动化测试脚本,使用 dummy 视频驱动避免弹窗,验证箭头消除、失误计数、边界处理、关卡通关、游戏失败、重新开始等功能 |
| AI 实现或提供了什么 | 生成了完整的 test_game.py 测试脚本,包含 7 个测试函数,使用 SDL_VIDEODRIVER=dummy 环境变量实现无窗口测试,通过模拟动画更新验证箭头消除,使用贪心算法验证所有关卡可通关 |
| 效果如何 | 7/7 测试全部通过,覆盖了作业要求的所有测试项,额外验证了三个关卡的可通关性 |
| 人工修改 | 未做修改,测试脚本直接运行通过 |
五、测试结果
5.1 测试环境
- 操作系统:Windows 11
- Python 版本:3.13.13
- Pygame 版本:2.6.1
- 测试方式:自动化测试脚本(dummy 视频驱动)+ 手工试玩验证
5.2 测试结果汇总
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头飞出动画播放后消失,存活数减 1 | ✅ 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头播放碰撞动画后保持,失误数从 0 变为 1 | ✅ 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 边缘朝外箭头路径检测返回 True,正常飞出,无越界异常 | ✅ 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 全部箭头消除后状态切换为 level_complete,显示通关界面 | ✅ 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 失误达到上限后状态切换为 game_over,显示失败界面,可重新开始 | ✅ 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 重新开始后箭头数恢复为初始值,失误数归零 | ✅ 通过 |
5.3 额外测试
| 测试内容 | 结果 |
|---|---|
| 关卡 1 可通关性验证 | ✅ 4 步通关 |
| 关卡 2 可通关性验证 | ✅ 6 步通关 |
| 关卡 3 可通关性验证 | ✅ 8 步通关 |
| 键盘快捷键(R/ESC) | ✅ 功能正常 |
| 界面切换流畅性 | ✅ 无卡顿 |
5.4 测试运行输出
============================================================
测试总结
============================================================
[PASS] T01 箭头消除
[PASS] T02 失误计数
[PASS] T03 边界处理
[PASS] T04 关卡通关
[PASS] T05 游戏失败
[PASS] T06 重新开始
[PASS] 关卡可通关验证
总计: 7/7 通过
所有测试通过!
六、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 0.5 | 0.5 | 0 |
| Python 与图形库学习 | 0.5 | 0.3 | -0.2 |
| 游戏界面实现 | 1.5 | 1.5 | 0 |
| 路径与碰撞逻辑实现 | 1.0 | 0.8 | -0.2 |
| 关卡设计 | 0.5 | 0.5 | 0 |
| AIGC 辅助开发 | 1.0 | 1.2 | +0.2 |
| 测试与修改 | 1.0 | 1.0 | 0 |
| README 与博客撰写 | 1.5 | 1.8 | +0.3 |
| 合计 | 7.5 | 7.6 | +0.1 |
差异分析:
- Python 与图形库学习比预估少,因为已有 Pygame 基础
- 路径与碰撞逻辑实现比预估快,AIGC 生成的代码质量较高
- AIGC 辅助开发和博客撰写比预估略多,主要花在调试字体兼容性问题和完善博客内容上
七、心得体会
7.1 AIGC 带来的帮助
-
架构设计效率提升:AIGC 能够快速分析需求并给出合理的代码结构设计,避免了从零开始摸索的时间成本。Arrow 类和 ArrowGame 类的划分在开发初期就确定了,后续编码非常顺畅。
-
核心算法快速实现:路径检测算法虽然不复杂,但 AIGC 生成的代码使用方向向量统一处理四个方向,比我最初设想的四个 if 分支更简洁优雅。
-
Bug 定位与修复:遇到 Pygame 字体兼容性问题时,AIGC 迅速定位到是 pygame 2.6.1 + Python 3.13 的已知问题,并给出了直接加载字体文件的解决方案,节省了大量搜索和试错时间。
-
测试用例自动生成:AIGC 生成的测试脚本覆盖了所有要求的测试项,还额外使用 dummy 视频驱动实现了无窗口测试,以及贪心算法验证关卡可通关性,测试质量超出预期。
7.2 出现的问题
-
Pygame 字体兼容性问题:
pygame.font.SysFont在 Python 3.13 下崩溃,这是 pygame 2.6.1 的已知 bug。通过改用pygame.font.Font直接加载字体文件解决。 -
Git 环境缺失:系统未安装 Git,需要通过 winget 安装。安装后首次推送时凭据管理器弹出浏览器授权,整体流程顺利。
-
关卡设计需验证可通关性:最初设计的几个关卡布局存在死锁(两个箭头互相阻挡),通过编写贪心算法验证才发现并调整。这让我意识到关卡设计不能只靠直觉,需要算法验证。
7.3 收获与总结
-
AIGC 是工具不是替代品:AIGC 能够大幅提升开发效率,但生成的代码仍需要人工审查和测试。例如字体兼容性问题就是在实际运行中发现的,AIGC 最初生成的代码也使用了 SysFont。
-
测试驱动开发的价值:编写自动化测试脚本不仅验证了功能正确性,还在关卡设计阶段帮助发现了死锁问题。测试不再是可选的"额外工作",而是开发流程的必要组成部分。
-
版本控制的重要性:按照作业要求进行多次有意义的 Commit,而不是一次性上传全部代码,让开发过程更有条理,也便于回溯和问题定位。
-
小游戏开发的完整流程:从需求分析、架构设计、编码实现、测试验证到文档撰写,完整经历了一个小型软件项目的开发流程,对软件工程的实践有了更深入的理解。
八、附录
8.1 项目结构
ArrowGame/
├── main.py # 游戏主程序(界面、逻辑、动画)
├── levels.py # 关卡数据
├── test_game.py # 自动化测试脚本
├── capture_screenshots.py # 截图生成脚本
├── README.md # 项目说明文档
├── .gitignore # Git 忽略文件
├── assets/ # 资源文件目录
└── screenshots/ # 游戏截图
├── 01_menu.png
├── 02_game_level1.png
├── 03_game_level3.png
├── 04_level_complete.png
└── 05_game_over.png
8.2 运行方法
# 安装依赖
pip install pygame
# 运行游戏
python main.py
# 运行测试
python test_game.py
8.3 GitHub 提交记录
| Commit | 说明 |
|---|---|
| 417f77e | feat: 初始化项目结构,添加三个关卡数据 |
| 275ae4b | feat: 实现游戏核心逻辑和图形界面 |
| 633c44d | feat: 添加键盘快捷键支持 |
| 281dee8 | test: 添加自动化测试脚本,覆盖全部测试项 |
| ca1509a | docs: 添加游戏截图和自动截图脚本 |
| d33882e | docs: 完善 README 项目文档 |

浙公网安备 33010602011771号