软件工程第二次个人作业——利用 AIGC 完成「一箭又一箭」小游戏
作业信息
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成「一箭又一箭」小游戏 |
| 学号 | 052404147 |
| GitHub 仓库 | https://github.com/QG-LHZ/arrow-puzzle |
1. 项目展示
游戏运行截图如下(更多见仓库 images/ 目录):
-
开始界面与关卡选择:
![start]()
![select]()
-
游戏界面与提示高亮:
![hint]()
-
碰撞反馈与通关界面:
![win]()
-
失败界面:
![lose]()
-
演示动画(一次碰撞 + 完整通关第 1 关):
![demo]()
2. 项目介绍
2.1 游戏规则
棋盘上有若干带方向的箭头(上 ↑、下 ↓、左 ←、右 →)。点击某个箭头后,程序检查它前进方向上(同一行或同一列)到棋盘边界之间是否还有其他箭头:
- 前方无阻挡 → 箭头飞出棋盘并消失;
- 前方有阻挡 → 箭头不消失,给出晃动、变红和文字提示,并消耗 1 次失误机会。
清空当前关卡全部箭头即进入下一关;失误次数(3 次)耗尽则本关失败,可重新开始。
2.2 界面设计
采用深色主题,界面分为:
- 开始界面:标题、规则说明、「开始游戏」和「选择关卡」按钮;
- 关卡选择界面:列出全部关卡;
- 游戏界面:顶部显示关卡、剩余箭头、用时和失误爱心,中间是棋盘,底部是「撤销 / 提示 / 自动通关 / 重新开始」四个按钮;
- 通关 / 失败界面:通关界面显示星级评价和用时。
2.3 主要功能
在完成作业基础要求后,我增加了多项扩展功能:
- 5 个难度递增、均可通关的关卡,支持关卡选择;
- 飞出动画与碰撞晃动反馈;
- 撤销上一步、提示下一步、一键自动通关;
- 计时与通关星级评价、重新开始;
- 17 项自动化测试。
2.4 关卡难度设计
关卡按箭头数量和阻挡关系逐步增加复杂度,从教学性质的 4 个箭头递增到 22 个箭头:
| 关卡 | 箭头数量 | 棋盘大小 | 设计定位 |
|---|---|---|---|
| 第 1 关 | 4 | 4×4 | 教学关,熟悉规则 |
| 第 2 关 | 8 | 5×5 | 两条独立的箭头链 |
| 第 3 关 | 10 | 5×5 | 三条链交错,需要观察顺序 |
| 第 4 关 | 16 | 5×5 | 环形框架,阻挡关系明显增多 |
| 第 5 关 | 22 | 6×6 | 大框架加中间竖列,最终挑战 |
所有关卡在加入游戏前都通过回溯求解器 find_order 验证,确保至少存在一种完整的消除顺序;同时我对每一关进行了人工试玩,确认交互和动画表现正常。
3. 开发环境
| 项目 | 环境 |
|---|---|
| 操作系统 | Windows 11 |
| Python | 3.13 |
| 图形界面库 | Pygame 2.6.1 |
| 开发工具 | PyCharm |
| 版本控制 | Git + GitHub |
| 测试方式 | 自编写断言脚本(test_game.py) |
4. 实现思路
4.1 箭头与方向的表示
方向统一用一个 (行偏移, 列偏移) 元组表示,天然地和网格坐标对应:
UP = (-1, 0) # 向上:行号减 1
DOWN = (1, 0) # 向下:行号加 1
LEFT = (0, -1) # 向左:列号减 1
RIGHT = (0, 1) # 向右:列号加 1
4.2 关卡的表示
每个关卡用一个字符串二维列表表示,字符 ^ v < > 对应四个方向,. 表示空格。这样关卡可读性高、便于手工设计和修改。例如第 1 关:
LEVELS = [[
">..^",
"....",
"....",
"v.<.",
]]
解析时把字符串转换成 (r, c) -> 方向或空 的二维列表。
4.3 路径检测(核心算法)
路径检测是本游戏最核心的一段。判断某箭头能否飞出,就是看它面朝方向、到棋盘边界之间有没有别的箭头:
def is_path_clear(board, r, c, rows, cols):
dr, dc = board[r][c] # 取出该箭头的方向
cr, cc = r + dr, c + dc # 从相邻格开始探测
while 0 <= cr < rows and 0 <= cc < cols: # 还在棋盘内
if board[cr][cc] is not None: # 遇到任意一个箭头
return False # 被阻挡
cr += dr
cc += dc
return True # 走到棋盘外都没遇到,前方畅通
关键点:
while的循环条件0 <= cr < rows and 0 <= cc < cols天然处理了边界,走到棋盘外循环自动结束,返回True——这就覆盖了「位于边缘且朝棋盘外」的越界情况;- 阻挡条件只看「同一行或同一列」逐格前进,无论这个箭头本身朝哪个方向,只要占着格子就算阻挡,与作业要求一致。
4.4 动画与反馈
- 飞出:点击可消除的箭头后先把它从棋盘移除,再记录一条「飞出」动画,用
进度²的加速插值让箭头沿方向滑出棋盘; - 碰撞:用垂直方向的「衰减正弦」做晃动,同时变红并显示「碰撞!路径被阻挡」。
4.5 扩展功能
- 撤销:用操作历史栈记录每一步,还原消除的箭头 / 还回扣除的失误;
- 提示:扫描棋盘返回一个当前可安全消除的箭头并高亮;
- 自动通关:复用回溯求解器
find_order,从当前棋盘搜索完整消除顺序后逐步演示; - 计时与星级:通关时按剩余失误次数评定 1~3 星,并显示用时。
5. AIGC 使用过程
以下记录基于本次使用 Trae 的真实开发过程整理。开发过程中,我通过多轮对话逐步完善游戏功能,AI 生成的代码经过我的测试、修改和整合后进入项目。
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 路径检测 | Trae | 生成四个方向的路径检测代码,并用 (行偏移, 列偏移) 表示方向 |
逻辑正确,通过 T01~T03 | 补充了「边缘箭头朝棋盘外」的测试用例,复核边界条件 |
| 关卡设计 | Trae | 生成关卡数组,并写了一个回溯求解器 find_order 验证可解性 |
5 个关卡全部验证可通关,难度递增 | 试玩并调整布局,让难度与箭头数递增 |
| 碰撞与飞出动画 | Trae | 实现飞出「加速插值」动画和碰撞「衰减正弦晃动 + 变红」反馈 | 基本可用,视觉反馈明显 | 调整晃动幅度和动画时长,让反馈更自然 |
| 测试与扩展功能 | Trae | 生成 T01~T06 自动化测试,并实现撤销、提示、自动通关、计时星级 | 17 项测试全部通过 | 修复测试中一处越界笔误,确认撤销 / 提示逻辑与界面交互一致 |
6. 测试结果
采用自动化测试(python test_game.py)为主,手工试玩为辅。

自动化测试运行结果:
[PASS] T01 点击前方无阻挡的箭头
[PASS] T02 点击前方有阻挡的箭头
[PASS] T03 边缘朝向棋盘外不越界
[PASS] T04 消除全部箭头后通关
[PASS] T05 失误次数耗尽后失败
[PASS] T06 重新开始恢复状态
[PASS] 撤销还原已消除的箭头
[PASS] 撤销还原被扣除的失误
[PASS] 提示返回可消除的箭头
[PASS] 部分棋盘仍可求解
[PASS] 关卡 1 存在通关顺序
[PASS] 关卡 2 存在通关顺序
[PASS] 关卡 3 存在通关顺序
[PASS] 关卡 4 存在通关顺序
[PASS] 关卡 5 存在通关顺序
[PASS] 渲染冒烟测试(最后一关完整通关)
[PASS] 自动通关冒烟测试
共 17 通过,0 失败
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头消失,剩余数减 1 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头保留,失误 3→2 | 通过 |
| T03 | 点击边缘且朝向棋盘外的箭头 | 正常消失,不越界 | 上/左/右三个方向均正常消失 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 通关标志置位,场景切换 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 失误归零后置失败标志 | 通过 |
| T06 | 游戏进行中重新开始 | 布局和失误次数恢复 | 布局与失误次数均复原 | 通过 |
| 附加 | 撤销 / 提示 / 自动通关 | 各自功能正确 | 17 项自动化测试全部通过 | 通过 |
7. Git 提交记录
开发过程中,我按照功能实现的阶段进行了多次提交,而不是在截止前一次性上传整个项目。每完成一个相对独立、可验证的功能,先运行或测试确认当前版本可用后再提交。

本项目共 7 次 Commit:
dd4efe1 merge: 合并远程初始提交
ba022af docs: 游戏截图与演示素材
05432c5 test: 自动化测试用例
9dc085d feat: 图形界面与交互实现
4c5160e feat: 基础游戏逻辑与关卡数据
2a57f98 docs: 项目说明与忽略规则
dee5bb2 Initial commit
提交过程基本对应了项目从「项目说明 → 核心逻辑 → 图形界面 → 自动化测试 → 展示素材」的开发顺序。通过 Git 的版本管理,可以清楚地看到每个阶段完成的主要工作,也方便在出现问题时回看不同版本之间的代码变化。
GitHub 仓库地址:https://github.com/QG-LHZ/arrow-puzzle
8. PSP 表格
预估耗时基于我对各任务难度的初步判断,实际耗时为开发过程中的真实记录。
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1 | 0.5 | -0.5 |
| Python 与图形库学习 | 2 | 1 | -1 |
| 游戏界面实现 | 3 | 4 | +1 |
| 路径与碰撞逻辑实现 | 2 | 1.5 | -0.5 |
| 关卡设计 | 1.5 | 1 | -0.5 |
| AIGC 辅助开发 | 2 | 3 | +1 |
| 测试与修改 | 2 | 2 | 0 |
| README 与博客撰写 | 2 | 1.5 | -0.5 |
| 合计 | 15.5 | 14.5 | -1 |
9. 心得体会
- AI 带来的帮助:把「箭头 + 方向」抽象成
(行偏移, 列偏移)、用回溯求解器自动验证关卡可解,是我自己容易忽略的角度;AIGC 让我把精力放在规则理解和测试上,而不是重复的界面代码。在界面上,AI 帮我快速搭出了 Pygame 的场景切换和动画框架,省去了大量查文档的时间。 - 出现的问题:AI 生成的代码在边界条件和细节上仍有疏漏,例如测试里的越界笔误、方法重命名后的调用不匹配,需要逐条运行测试才能发现;AI 给的关卡有时不一定能通关,必须用求解器或试玩验证。此外,AI 生成的动画参数(如晃动幅度、飞出速度)需要反复调整才有较好的手感。
- 自己的收获:理解了二维网格坐标、方向向量和路径探测的关系;体会到「先写自动化测试、再不断回归」对小型项目同样重要;也认识到 AI 生成的代码必须自己理解、测试并负责。最大的收获是学会了如何给 AI 提清晰的需求——描述越具体,生成的代码越接近可用状态。
10. 素材来源与版权说明
- 本项目只参考「一箭又一箭」类游戏的基础玩法,没有复制原商业游戏的代码、素材、音效或关卡;
- 棋盘、箭头、爱心、星星等所有图形均通过 Pygame 绘图 API 在代码中绘制,未使用任何第三方图片素材;
- 界面文字使用 Windows 系统中文字体渲染;
- 仓库中不包含密码、Cookie、API Key、Token 等敏感信息;
- 本项目仅用于课程学习和软件开发实践,不用于商业用途。





