软工第二次作业:利用aigc开发小游戏
《一箭又一箭》小游戏开发随笔
一、基础信息
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成「一箭又一箭」小游戏 |
| 学号 | 102302113 |
| GitHub 仓库 | https://github.com/shiluooo/shiluooo |
二、项目展示
开始界面

选关界面

游戏过程

失误扣血

通关界面

最终关卡通关

失败界面

三、项目介绍
游戏规则
核心玩法参考微信小游戏《一箭又一箭》:棋盘上分布着方向为「上/下/左/右」的箭头,玩家点击箭头后,程序检查其前进方向上是否有其他箭头阻挡:
- 无阻挡 → 箭头飞出棋盘并消除
- 有阻挡 → 箭头不动,红色晃动提示,消耗 1 次失误机会
- 清空全部箭头 → 通关
- 失误 3 次耗尽 → 失败
界面设计
游戏包含 4 种状态界面:
- 开始界面:标题、规则说明、「开始游戏」「选择关卡」两个按钮
- 选关界面:2×3 网格展示 6 个关卡,已通关关卡带 ✓ 标记,可自由选择游玩
- 游戏界面:顶部 HUD 显示「当前关卡 / 剩余箭头 / 失误次数(心形)」,中部棋盘带交替色格子,底部「重新开始」「返回选关」按钮
- 结果界面:半透明蒙层 + 「通关/失败」文字 + 对应操作按钮
实现特色(附加功能)
- ✅ 关卡难度递增:关卡 1-4 为入门/中等,关卡 5(6×6 12 箭头)、关卡 6(7×7 16 箭头)为高难度
- ✅ 选关系统:通关任意关卡后会记录通关状态,可自由选择已解锁关卡重玩
- ✅ 通关即时弹窗:最后一个箭头触发飞出后立即弹窗,无需等待动画结束
- ✅ 自动关卡生成器:保证所有关卡可通关(见实现思路)
四、实现思路
1. 核心数据结构
- 关卡表示:用二维字符数组存储,
U/D/L/R对应四个方向,.表示空格 - 箭头实体:
Arrow类存储row, col, direction, state(idle / flying / collide / disappeared四种状态) - 方向向量:
DIRS = {'U': (0, -1), 'D': (0, 1), 'L': (-1, 0), 'R': (1, 0)}
2. 路径检测(核心算法)
点击查看代码
python
def check_path_blocked(self, arrow):
dx, dy = DIRS[arrow.direction]
r, c = arrow.row, arrow.col
# 从下一格开始往边界方向逐格检查
while True:
r += dy
c += dx
# 走到棋盘外 → 路径畅通
if r < 0 or r >= self.board_rows or c < 0 or c >= self.board_cols:
return False
# 遇到 idle 状态的箭头 → 被阻挡
if self.get_arrow_at(r, c) is not None:
return True
关键坑点:
get_arrow_at必须只认state == 'idle'的箭头。刚触发flying的箭头已经「离开格子」,不能再算阻挡——这个 bug出现过,修复逻辑见下文 AIGC 协作部分。
3. 关卡生成与可通关性验证
手动写关卡很容易出现「相向箭头卡死」(比如 L 和 R 对着放,谁都出不去)。我用 贪心放置 + BFS 求解 双重保证可通关:
- 贪心放置:每个新箭头放置时,必须保证其朝边界方向路径畅通(无其他箭头)
- BFS 求解验证:生成后模拟消除——反复找当前可飞出的箭头消除,直到全部消除(通过)或卡住(放弃重来)
4. 状态机管理
start → select → playing → win → (下一关 / 返回选关)
lose → (重新开始 / 返回选关)
playing 中 → 底部按钮可随时返回选关
五、AIGC 使用过程
本次开发全程使用 Trae(字节跳动旗下 Coding Agent,使用内置模型seed code) 辅助,共进行了 3 次核心协作:
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 路径检测初版 + 初始关卡 | Trae | 生成四方向路径检测循环 + 6 个手动关卡数组 | 通关验证器跑出来全部卡住——手动关卡存在相向箭头(比如 L/R 对着放),形成死锁 | 放弃手动关卡,转而让 AI 写自动生成器 |
| 关卡自动生成器 | Trae | 生成「贪心放置 + BFS 求解验证」的关卡生成器,核心是「每个新箭头朝边界路径必须畅通」,生成后用 BFS 模拟可通关性 | 迭代约 3000 次成功生成 6 关,关卡 5/6 难度拉满(12/16 箭头) | 调整关卡规格(关卡 5 目标 12 箭头、关卡 6 目标 16 箭头),增加迭代次数到 5000 |
| 两个运行时 bug 修复 | Trae | ① 定位 pygame.font.SysFont 在 Pygame 2.6.1 存在兼容性 bug(中文显示为方块);② 定位 get_arrow_at 把 flying 状态的箭头当作阻挡,导致刚飞出的箭头挡住后方 | 两个 bug 定位均准确,修复代码直接可用 | ① 改为直接加载 msyh.ttc(微软雅黑);② 把 state != 'disappeared' 改为 state == 'idle';另:AI 最初生成的 get_arrow_at 判断条件写错,必须自己做单元测试验证 |
六、测试结果
按照作业要求设计了 6 项测试,其中 T01-T04 为游戏核心逻辑,T05-T06 为流程验证:
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头沿方向飞出棋盘并消失 | 箭头平滑飞出,移出屏幕后标记为 disappeared | ✅ 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头变红色 + 高频晃动衰减,失误次数 -1 | ✅ 通过 |
| T03 | 点击边缘朝外的箭头(如第一行的 ↑) | 箭头正常消失,无越界错误 | 沿方向飞出,边界检查正常,无崩溃 | ✅ 通过 |
| T04 | 消除本关全部箭头 | 显示通关弹窗 | 最后一个箭头触发 fly 后立即弹窗,无需等待动画 | ✅ 通过 |
| T05 | 失误次数耗尽(连续 3 次点有阻挡的箭头) | 显示失败弹窗 | 第 3 次点击后立即弹出失败界面 | ✅ 通过 |
| T06 | 游戏进行中点击「重新开始」 | 箭头布局 + 失误次数恢复初始状态 | 全部箭头重置为初始位置、方向,失误次数恢复为 3 | ✅ 通过 |
七、PSP 表格
PSP(Personal Software Process)是个人软件过程度量表,用于记录预估与实际消耗的时间差异。
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1.0 | 0.5 | -0.5 |
| Python 与 Pygame 学习 | 1.5 | 0.5 | -1.0 |
| 游戏界面实现 | 2.0 | 1.5 | -0.5 |
| 路径与碰撞逻辑实现 | 1.0 | 1.0 | 0.0 |
| 关卡设计 | 2.0 | 2.0 | 0.0 |
| AIGC 辅助开发 | 1.0 | 2.0 | +1.0 |
| 测试与修改 | 2.0 | 2.5 | +0.5 |
| README 与博客撰写 | 2.0 | 1.0 | -1.0 |
| 合计 | 12.5 | 11.0 | -1.5 |
差异分析
- 节省时间的部分:AIGC 帮着快速生成样板代码,尤其是界面绘制、状态机框架,比自己手写节省了约 2 小时;Python/Pygame 之前有一定基础,学习成本比预估低
- 多花时间的部分:关卡生成器踩了「手动关卡卡死」的坑,不得不写自动生成器 + BFS 验证,反而比预估多花了 1 小时;还有运行时 bug 排查(SysFont 兼容性、flying 阻挡),多花了 0.5 小时
八、心得体会
1. AIGC 带来的帮助
- 提速 60%+:核心逻辑(路径检测、状态机、界面框架)AI 可以直接生成,节省了大量样板代码时间
- 启发思路:关卡自动生成器是 AI 帮我想的方向,我本来打算手动写 6 关,结果 AI 给出了「贪心 + 验证」的方案,直接解决了「手动关卡容易死锁」的问题
- 快速定位 bug:两个运行时 bug(SysFont 崩溃、flying 阻挡)AI 定位都非常快,给出的修复代码几乎可以直接用
2. 踩过的坑与教训
- 不能完全信任 AI 生成的逻辑:AI 生成的初始关卡全部卡死,就是因为没做可通关性验证——必须用单元测试/自动化工具验证 AI 生成的内容
- 必须自己测核心边界:state 判断条件是我人工排查才发现的 bug,AI 容易忽略「正在飞出的箭头是否还占格子」这种边界逻辑
- 第三方库版本兼容性:Pygame 2.6.1 的 SysFont 有 bug,这种版本特定问题只能自己跑起来才会发现
3. 个人收获
- 真正理解了状态机在游戏中的应用——idle / flying / collide / disappeared 四种状态的流转,是解决路径检测 bug 的核心
- 学会了用 BFS 验证关卡可通关性 的思路,这是做解谜游戏关卡的通用方法
- 掌握了「AIGC 辅助开发」的正确姿势:让 AI 写代码 → 自己做验证 → 发现问题让 AI 修 → 自己再测,而不是把需求甩给 AI 就不管了

浙公网安备 33010602011771号