2026 秋软件工程个人作业(第二次):利用 AIGC 完成"一箭又一箭"小游戏
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 2026-01软件工程与软件工程实践 |
| 这个作业要求在哪里 | 作业要求链接 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成"一箭又一箭"小游戏 |
| 学号 | 102401415 |
| GitHub 仓库 | https://github.com/Lin-fzu/ArrowGame |
一、项目展示
1.1 开始界面
1.1 开始界面
游戏启动后进入开始界面,展示游戏名称、规则说明和开始按钮。
1.2 游戏界面
游戏界面顶部显示关卡名称,左上角显示剩余箭头数量,右上角显示剩余失误次数,中央为游戏棋盘,底部提供重新开始和返回菜单按钮。
1.3 通关界面
清除当前关卡全部箭头后,显示通关结果,可选择进入下一关或重玩本关。
1.4 失败界面
失误次数耗尽时,显示失败结果,可选择重新开始或返回菜单。
二、项目介绍
2.1 游戏规则
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 数据结构设计
3.1 数据结构设计
箭头方向表示:使用字符 表示空格。 Arrow 类 :每个箭头对象包含以下属性: 路径检测是游戏的核心逻辑。对于一个箭头,从其位置出发,沿方向向量逐格检查,直到到达棋盘边界: 算法说明 : 飞出动画:箭头沿方向向量移动,位移随动画进度递增,最终移出棋盘后将 设为 False。 碰撞动画 :箭头先沿方向前冲一段距离(进度 0~0.5),然后返回原位(进度 0.5~1.0),同时颜色变为红色。动画结束后恢复 idle 状态。 使用状态机管理游戏流程: 状态切换由用户操作和游戏逻辑触发,例如消除全部箭头后切换到 。 本次开发使用 豆包 (Doubao) 作为 AIGC 辅助工具,以下记录 4 次具有代表性的使用过程。 差异分析 : 架构设计效率提升 :AIGC 能够快速分析需求并给出合理的代码结构设计,避免了从零开始摸索的时间成本。Arrow 类和 ArrowGame 类的划分在开发初期就确定了,后续编码非常顺畅。 核心算法快速实现 :路径检测算法虽然不复杂,但 AIGC 生成的代码使用方向向量统一处理四个方向,比我最初设想的四个 if 分支更简洁优雅。 Bug 定位与修复 :遇到 Pygame 字体兼容性问题时,AIGC 迅速定位到是 pygame 2.6.1 + Python 3.13 的已知问题,并给出了直接加载字体文件的解决方案,节省了大量搜索和试错时间。 测试用例自动生成 :AIGC 生成的测试脚本覆盖了所有要求的测试项,还额外使用 dummy 视频驱动实现了无窗口测试,以及贪心算法验证关卡可通关性,测试质量超出预期。 Pygame 字体兼容性问题: 直接加载字体文件解决。 Git 环境缺失 :系统未安装 Git,需要通过 winget 安装。安装后首次推送时凭据管理器弹出浏览器授权,整体流程顺利。 关卡设计需验证可通关性 :最初设计的几个关卡布局存在死锁(两个箭头互相阻挡),通过编写贪心算法验证才发现并调整。这让我意识到关卡设计不能只靠直觉,需要算法验证。 AIGC 是工具不是替代品 :AIGC 能够大幅提升开发效率,但生成的代码仍需要人工审查和测试。例如字体兼容性问题就是在实际运行中发现的,AIGC 最初生成的代码也使用了 SysFont。 测试驱动开发的价值 :编写自动化测试脚本不仅验证了功能正确性,还在关卡设计阶段帮助发现了死锁问题。测试不再是可选的"额外工作",而是开发流程的必要组成部分。 版本控制的重要性 :按照作业要求进行多次有意义的 Commit,而不是一次性上传全部代码,让开发过程更有条理,也便于回溯和问题定位。 小游戏开发的完整流程 :从需求分析、架构设计、编码实现、测试验证到文档撰写,完整经历了一个小型软件项目的开发流程,对软件工程的实践有了更深入的理解。U/D/L/R 分别表示上、下、左、右四种方向,关卡数据以二维字符数组存储,.# 关卡数据示例
LEVELS = [{"name": "第一关 · 初窥门径","grid": [["R", ".", "U"],[".", ".", "."],["D", ".", "L"],],"max_mistakes": 3,},
]
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.colrows = len(self.initial_grid)cols = len(self.initial_grid[0])nr, nc = r + dy, c + dxwhile 0 <= nr < rows and 0 <= nc < cols:if self.get_arrow_at(nr, nc) is not None:return False # 遇到阻挡nr += dync += dxreturn True # 路径畅通
3.3 动画系统
alive3.4 游戏状态管理
menu:开始界面playing:游戏进行中level_complete:关卡通关game_over:游戏失败all_complete:全部通关level_complete,失误耗尽后切换到 game_over四、AIGC 使用过程
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 测试环境
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
七、心得体会
7.1 AIGC 带来的帮助
7.2 出现的问题
pygame.font.SysFont 在 Python 3.13 下崩溃,这是 pygame 2.6.1 的已知 bug。通过改用 pygame.font.Font7.3 收获与总结
八、附录
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 项目文档