软工第二次作业
利用 AIGC 完成 "一箭又一箭" 小游戏
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成 "一箭又一箭" 小游戏 |
| 学号 | 102401331 |
| GitHub 仓库 | https://github.com/Lameeloo/arrow-game |
1. 项目展示
游戏包含完整的开始界面、游戏界面、通关界面与失败界面:



点击被阻挡的箭头时,箭头会晃动、变红闪烁并显示 "被阻挡!" 提示,同时消耗一次失误:

通关与失败界面:


第一关完整通关演示(GIF,含一次碰撞演示):

以上截图由项目内置脚本
tools/make_screenshots.py离屏渲染生成,游戏画面为 Pygame 原生绘制,无第三方素材。
2. 项目介绍
2.1 游戏规则
-
棋盘中分布着上、下、左、右四种方向的箭头;
-
鼠标点击某个箭头后,程序检查其前进方向上、到棋盘边界之间是否存在其他箭头:
-
无阻挡:箭头沿方向加速飞出棋盘并被消除;
-
有阻挡:箭头不能消除,出现晃动 + 变红 + 文字提示的碰撞反馈,并消耗 1 次失误;
-
-
清除本关全部箭头即通关,自动进入下一关;失误次数耗尽则本关失败;
-
每关可随时 "重新开始",恢复初始布局与失误次数。
2.2 界面设计
| 界面 | 内容 |
|---|---|
| 开始界面 | 游戏标题、规则说明、示例小棋盘、"开始游戏" 按钮 |
| 游戏界面 | 当前关卡、剩余箭头数量、剩余失误次数(红心)、"主页 / 重新开始" 按钮、棋盘 |
| 通关界面 | "恭喜通关!"+ 进入下一关 / 返回主页 |
| 失败界面 | "挑战失败"+ 重新开始 / 返回主页 |
游戏过程中按 Esc 可随时返回开始界面。悬停箭头时有金色高亮框,点击反馈即时。
2.3 主要功能
-
四方向路径检测与边界处理;
-
飞出动画(加速 + 淡出)与碰撞反馈(衰减晃动 + 变红闪烁 + 文字提示);
-
失误次数管理、通关 / 失败状态机与关卡切换;
-
3 个可通关关卡(每个关卡均经求解器验证存在合法消除顺序);
-
重新开始功能;自动化测试(T01~T06)。
3. 实现思路
3.1 箭头、方向与关卡如何表示
-
方向用整数常量表示:
0=上,1=下,2=左,3=右,每个方向对应一个坐标增量DIR_STEP; -
箭头是一个
Arrow对象,记录(row, col, direction)三元组; -
棋盘
Board同时维护箭头集合arrows和二维网格grid,可在 O (1) 时间内查询任意格子是否被占用; -
关卡用字典描述:棋盘行数、列数、箭头列表、失误上限,数据与逻辑分离,便于后续增删关卡。
UP, DOWN, LEFT, RIGHT = 0, 1, 2, 3
DIR\_STEP = {UP: (-1, 0), DOWN: (1, 0), LEFT: (0, -1), RIGHT: (0, 1)}
\# 关卡示例(节选):每个箭头是一个 (row, col, direction)
{
  "name": "第一关", "rows": 4, "cols": 4, "mistakes": 5,
  "arrows": \[(0, 2, 3), (1, 0, 0), (1, 3, 1), (2, 1, 2), (3, 0, 3), (3, 2, 0)],
}
3.2 路径检测(核心算法)
以箭头所在格为起点,沿其方向逐格前进,只要在到达棋盘边界之前遇到任何一个箭头,就判定为 "被阻挡";走完边界仍无箭头则畅通。四个方向共用同一套循环,天然处理了 "边缘箭头朝外" 的情况(循环体一次都不执行,直接返回畅通,不会越界)。
def is\_blocked(self, arrow):
  dr, dc = DIR\_STEP\[arrow.direction]
  row, col = arrow.row + dr, arrow.col + dc
  while self.in\_bounds(row, col): # 逐格前进直到边界
  if self.grid\[row]\[col] is not None:
  return True # 前方有箭头 → 被阻挡
  row += dr
  col += dc
  return False # 到边界都畅通
3.3 关卡可解性验证
由于 "消除一个箭头只会清空路径、绝不会新增阻挡",所以能消就消的贪心策略不会破坏可解性:若贪心能把棋盘消空,则该关可解;若某时刻无箭头可消却仍有剩余,则该关必然死局。程序内置 find_solution(),在测试与截图脚本中用它验证每个关卡、并自动模拟通关。
4. AIGC 使用过程
本次开发使用 deepseek 作为主要 AIGC 编程助手,覆盖需求分析、代码编写、关卡设计与调试全流程。以下选取 4 次有代表性的协作过程:
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 路径检测 | deepseek(对话式代码生成) | 生成 is_blocked 四方向逐格遍历代码,并说明 "格子坐标增量 + 边界循环" 的统一写法 |
一次通过四个方向的单元测试;边缘朝外箭头(T03)也能正确处理,未出现越界 | 人工补充 "中间隔着空格仍算阻挡" 的测试用例(如 → · ↓),并增加 path_cells() 供飞出动画复用路径信息 |
| 关卡设计 | deepseek(生成关卡数组) | 生成 3 关的初始布局数据,并在测试脚本中加入贪心求解器校验可解性 | 求解器发现第二关存在 → 与 ← 同行互指、第三关存在两组同行 / 同列互指的死局布局,均不可解 |
人工重排两关布局:把互指箭头改为朝外方向,形成 "先消挡路箭头、再消被挡箭头" 的依赖链;修复后三关全部通过可解性校验(对应 git 提交 fix:) |
| 碰撞反馈动画 | deepseek(补全动画代码) | 补全箭头晃动(衰减正弦震荡)、变红闪烁、飞出加速淡出等动画类代码 | 基本可用,反馈清晰 | 人工调整晃动幅度与动画时长;离屏渲染截图时发现结果弹窗 "返回主页" 按钮超出白色面板底部,调整面板尺寸与按钮位置后重新截图验证 |
| 测试用例 | deepseek(生成测试框架) | 生成 unittest 测试骨架,覆盖 T01~T06 六项作业用例的断言结构 | 框架可直接运行 | 人工补充四方向阻挡 / 畅通、边缘越界、关卡可解性与 "四方向齐全" 等边界用例;其中 T06 因关卡修改导致断言失效,人工同步更新测试数据 |
过程中的关键收获:AI 能快速产出 "看起来正确" 的代码,但可解性这类全局性质,必须靠求解器 / 测试来自动验证—— 第二、三关的 "互指死局" 正是被脚本揪出来的,这也说明 "AI 生成代码 + 自动化校验 + 人工修正" 是可靠的工作流。
5. 测试结果
开发过程中同时进行了自动化测试(python tests.py,11 个用例全部通过)与手工试玩验证(无头渲染模拟点击 + 实际窗口冒烟运行)。对照作业要求测试用例如下:
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头移除、飞出动画播放、数量减 1 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头保留、晃动变红提示 "被阻挡!"、失误 -1 | 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 四方向边缘箭头均正常消除,无异常 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 弹出 "恭喜通关!",点击可进入下一关 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 弹出 "挑战失败",重新开始后状态恢复 | 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 布局与失误次数均恢复初始值 | 通过 |
额外自动化用例:四方向阻挡 / 畅通判断、同一行列隔空格阻挡、关卡全部可解、每关四方向箭头齐全(共 11 项,全部通过)。
6. PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1.0 | 1.0 | 0.0 |
| Python 与图形库学习 | 1.5 | 1.0 | -0.5 |
| 游戏界面实现 | 2.0 | 2.5 | +0.5 |
| 路径与碰撞逻辑实现 | 1.5 | 1.5 | 0.0 |
| 关卡设计 | 1.0 | 1.5 | +0.5 |
| AIGC 辅助开发 | 1.0 | 1.0 | 0.0 |
| 测试与修改 | 1.5 | 2.0 | +0.5 |
| README 与博客撰写 | 1.5 | 2.0 | +0.5 |
| 合计 | 11.0 | 12.5 | +1.5 |
表中实际耗时为本人开发记录,请以个人实际情况为准核对。
7. 心得体会
-
AI 是高效助手,但不是免检产品。AI 在生成 "标准套路代码"(路径遍历、动画补间、测试骨架)上又快又准,省去了大量查资料时间;但它设计的关卡布局存在隐蔽的全局性问题—— 同行 / 同列互指箭头形成的死局,凭肉眼很难发现,最终靠求解器脚本自动暴露。这提醒我:AI 产出必须配合同样的自动化校验,才能放心进入项目。
-
把 "能验证" 变成第一原则。本次把游戏逻辑与 pygame 界面分离(
game_logic.py不依赖任何图形库),11 个纯逻辑测试在几毫秒内跑完,改代码、改关卡都能立刻得到反馈;截图与演示 GIF 也用离屏渲染脚本自动生成,开发效率明显提高。 -
遇到问题先复现再修。第二关 "不可解" 的报错一开始让我困惑,用脚本逐步打印消除顺序后发现是 "同行互指" 这一结构性陷阱,而不是算法错误。找准根因后,修关卡、改测试、重新验证一气呵成,也让我真正理解了这类点选解谜游戏的设计约束。
-
收获:完整走了一遍 "需求分析 → 结构设计 → AI 辅助编码 → 自动化测试 → 人工修正 → 文档交付" 的软件实践流程,也第一次认真体会了 AIGC 工具在编程中的正确使用姿势 —— 用它提速,而不是替我做判断。
浙公网安备 33010602011771号