软件工程第二次作业
博客素材("一箭又一箭"小游戏)
一、
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成"一箭又一箭"小游戏 |
| 学号 | 102401334 |
| GitHub 仓库 | https://github.com/joe-wang-max/arrow-by-arrow |
二、项目展示
-
开始界面:
![start]()
-
游戏界面:
![image]()
-
通关界面:
![image]()
GIF 录制

三、项目介绍
本项目是一款点击式箭头解谜小游戏,参考微信小游戏《一箭又一箭》的核心玩法,使用 Python + Pygame 开发。
游戏规则: 棋盘上有若干带方向的箭头(上、下、左、右)。点击箭头时,程序检查其前进方向(同一行或同一列)到棋盘边界之间是否还有其他箭头:没有阻挡则箭头飞出并消除;有阻挡则箭头晃动变红提示碰撞,并消耗一次失误机会。清空当前关卡全部箭头即可进入下一关,失误次数耗尽则本关失败。
主要功能:
- 开始界面、游戏界面、通关/失败结果界面;
- 四个方向箭头的路径检测与阻挡判断;
- 箭头飞出动画、碰撞晃动变红反馈;
- 失误次数统计与显示;
- 3 个可通关关卡、关卡切换、重新开始。
四、实现思路
1. 箭头和方向的表示
方向用二维向量 (dx, dy) 表示,屏幕坐标 y 向下:
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)
关卡数据里方向用字符串 "up"/"down"/"left"/"right"(可读性好),加载时通过 settings.DIRECTIONS 字典映射成向量。
2. 关卡的表示
每个关卡是一个字典,箭头列表里每个元素是 (x, y, direction):
{
"name": "第 1 关",
"rows": 5, "cols": 5,
"max_mistakes": 3,
"arrows": [(0, 0, "right"), (3, 0, "up"), (4, 3, "right")],
}
棋盘用二维列表 grid[y][x] 存储,每个格子是 None 或方向向量。
3. 路径检测(核心)
判断箭头能否飞出的关键代码:
def can_escape(self, x, y):
direction = self.arrow_at(x, y)
if direction is None:
return False
dx, dy = direction
cx, cy = x + dx, y + dy
while 0 <= cx < self.cols and 0 <= cy < self.rows:
if self.grid[cy][cx] is not None: # 途中遇到其他箭头 -> 被阻挡
return False
cx += dx
cy += dy
return True # 走到边界都没遇到 -> 可飞出
思路:从箭头位置沿方向逐格前进到边界,途中只要遇到非空格就返回"被阻挡";能走完则返回"可飞出"。
关键点:用 while 循环 + 边界条件 0 <= cx < cols and 0 <= cy < rows,从根源上避免了数组越界(箭头位于边缘且朝外时,第一次判断就退出循环)。这也是作业 T03 专门要测的边界情况。
五、AIGC 使用过程
本次开发全程使用 Claude Code 辅助,以下是 5 次有代表性的协作记录:
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 需求分析与结构设计 | Claude Code | 分析作业要求,将项目拆分为 settings.py(配置)、game.py(核心逻辑)、levels.py(关卡数据)、main.py(界面渲染)四个模块 | 结构清晰,各模块职责单一,便于后续扩展和讲解 | 无,直接采用 |
| 路径检测 | Claude Code | 生成 can_escape 方法,用 while 循环沿方向逐格检查 |
四个方向判断正确,边界处理安全 | 审查后确认用 while 循环 + 边界判断(而非数组索引),从源头避免越界 |
| 碰撞反馈与飞出动画 | Claude Code | 生成飞出动画(箭头沿方向滑出棋盘)和碰撞反馈(箭头变红 + sin 函数晃动) | 动画流畅、反馈明显 | 调整动画时长与晃动幅度参数 |
| 关卡设计 | Claude Code | 设计 3 个关卡的箭头布局 | 初版部分关卡存在循环依赖(死锁),无法通关 | 编写 DFS 求解器验证可通关性,发现死锁后重新设计,最终 3 关全部可通关 |
| 自动化测试 | Claude Code | 生成 T01–T06 测试脚本,覆盖四方向边界情况 | 13 项断言全部通过 | 无,测试结果与预期一致 |
说明:以上记录均来自真实开发过程,AI 生成代码后由本人运行、测试和审查确认。

六、测试结果
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头飞出并消失 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,剩余失误次数减 1 | 箭头不消失,剩余失误减 1 | 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 四个方向均正常消失、无越界 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 触发通关(剩余箭头为 0) | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 触发失败(失误数达到上限) | 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 布局和失误次数均恢复 | 通过 |
测试脚本见仓库 test_game.py,运行 python test_game.py 可复现,共 13 项断言全部通过。

七、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1 | 2 | 1 |
| Python 与图形库学习 | 2 | 2 | 0 |
| 游戏界面实现 | 2 | 1 | 1 |
| 路径与碰撞逻辑实现 | 2 | 1 | 1 |
| 关卡设计 | 1 | 1 | 0 |
| AIGC 辅助开发 | 2 | 1 | 1 |
| 测试与修改 | 1 | 1 | 0 |
| README 与博客撰写 | 2 | 1 | 1 |
| 合计 | 13 | 10 | 3 |
八、附加功能
- 计时与星级评价:
九、心得体会
- AI 带来的帮助:Claude Code 能快速生成代码框架、路径检测逻辑、动画和测试用例,大幅缩短了从需求到可运行程序的时间;遇到问题(如关卡死锁)时也能协助定位和修正。
- 出现的问题:AI 生成的关卡布局一度存在循环依赖导致无法通关,说明 AI 的输出不能直接信任,必须实际运行验证;路径检测的越界风险也需要人工审查才能避免。
- 自己的收获:通过审查和修改 AI 代码,理解了路径检测的 while 循环边界判断思路、状态机的设计,以及"关卡可通关性"需要专门验证这一容易被忽略的工程问题。



浙公网安备 33010602011771号