软件工程第二次作业:《一箭又一箭》小游戏开发记录
软件工程课程第二次个人作业
《一箭又一箭》:Python + AIGC 小游戏的诞生过程
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 2026 秋软件工程个人作业(第二次) |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏,实现四方向路径检测、碰撞反馈、失误机制和多关卡流程,并上传 GitHub |
| 学号 | 102402109 |
| GitHub 仓库 | https://github.com/Vvvicky005/one-arrow-game |
一、项目展示
《一箭又一箭》是一款使用 Python + Pygame 开发的点击式箭头解谜小游戏。玩家需要观察箭头的方向和相互阻挡关系,按照合适的顺序点击箭头,让所有箭头依次飞出棋盘。
游戏包含开始界面、选关界面、游戏界面、通关界面和失败界面,并加入了背景音乐、飞出动画、碰撞反馈、失误次数、得分和重新开始功能。
1. 开始界面
开始界面采用蓝天、白云、星星和可爱箭头小人风格,包含“开始游戏”“选择关卡”“怎么玩?”三个入口。

2. 选择关卡界面
玩家可以在这里选择要挑战的关卡。

3. 游戏指南界面
游戏指南介绍了基本玩法。

4. 游戏界面
游戏界面顶部显示当前关卡、时间、失误次数,中间是 6×6 棋盘,底部有“重新开始”“提示”“返回主页”三个按钮。

5. 通关界面
清空当前关卡全部箭头后,会显示“关卡完成”、本关用时和当前得分,点击“下一关”进入下一关。

6. 失败界面
失误次数耗尽后进入失败界面,可以重新挑战当前关卡或返回主页。

7. 全部通关界面
完成最后一关后,会显示“全部通关”,展示最终得分和最后一关用时,并提供“再玩一次”和“返回主页”按钮。

8. 动画演示
下面展示游戏中的实际操作与动画效果:

二、项目介绍
1. 游戏规则
- 棋盘中每个箭头占一个格子,方向分为上、下、左、右四种。
- 点击箭头后,程序检查该箭头前进方向上是否有其他箭头。
- 如果前方没有阻挡,箭头飞出棋盘并消失。
- 如果前方有阻挡,箭头不能消失,会晃动、变色,并消耗一次失误。
- 清除当前关卡全部箭头即可通关。
- 失误次数耗尽则本关失败,可以重新开始。
2. 主要功能
- 开始、选关、游戏、通关、失败完整流程
- 5 个可通关关卡
- 鼠标点击箭头
- 四种方向路径检测
- 飞出动画和碰撞反馈
- 失误次数显示
- 重新开始当前关卡
- 背景音乐,空格键静音 / 恢复
- 得分系统
- 通关界面显示本关用时
3. 界面设计
界面采用浅蓝渐变背景,搭配白云、星星、可爱箭头小人,整体风格轻松可爱。棋盘使用圆角格子,箭头用圆形底色 + 方向图标绘制,视觉清晰。
三、开发环境
| 项目 | 环境 |
|---|---|
| 操作系统 | Windows 10 |
| Python | 3.12 |
| 图形库 | Pygame 2.6.1 |
| 开发工具 | VS Code |
| 版本控制 | Git |
| 代码托管 | GitHub |
四、实现思路
1. 程序结构
项目将核心逻辑、界面、关卡和测试分开:
one-arrow-game/
├── main.py 程序入口
├── core/
│ ├── board.py 棋盘规则、路径检测
│ ├── solver.py 关卡求解
│ └── levels.py 关卡数据
├── ui/
│ ├── theme.py 配色、字体、布局
│ ├── render.py 绘制工具
│ ├── animations.py 动画与粒子
│ └── game.py 状态管理与主循环
├── tests/
│ └── test_core.py 核心逻辑测试
├── tools/
│ └── check_levels.py 关卡体检工具
├── assets/
│ ├── bgm.mp3 背景音乐
│ └── screenshots/ 游戏截图
├── .gitignore
└── README.md
核心逻辑不依赖 Pygame,可以单独测试。
2. 箭头和方向表示
每个箭头用一个字典表示:
{
"row": 0,
"col": 0,
"direction": "right",
"active": True,
}
方向对应的行列变化:
DIRECTIONS = {
"up": (-1, 0),
"down": (1, 0),
"left": (0, -1),
"right": (0, 1),
}
3. 路径检测
路径检测是核心。
从箭头位置出发,沿方向一步步前进:
def is_blocked(arrow, arrows, rows, cols):
row = arrow["row"]
col = arrow["col"]
dr, dc = DIRECTIONS[arrow["direction"]]
r = row + dr
c = col + dc
while 0 <= r < rows and 0 <= c < cols:
for other in arrows:
if not other["active"]:
continue
if other is arrow:
continue
if other["row"] == r and other["col"] == c:
return True
r += dr
c += dc
return False
如果循环结束后没有遇到任何箭头,说明可以飞出。
4. 游戏状态管理
用 current_screen 管理不同界面:
start:开始界面level_select:选关game:游戏中help:游戏说明level_clear:通关success:全部通关fail:失败
根据状态决定绘制什么、处理什么事件。
5. 动画和音效
- 飞出动画:箭头沿方向加速离开棋盘
- 碰撞动画:箭头左右晃动并变红
- 粒子效果:飞出和碰撞时生成小圆点
- 背景音乐:用
pygame.mixer.music循环播放,空格键暂停 / 恢复
五、AIGC 使用过程
本项目主要使用 DeepSeek / ChatGPT 辅助开发。下面记录 4 次有代表性的协作过程。
| 子任务 | 使用的 AIGC | 我提出的要求 | AI 提供的内容 | 实际效果 | 我的修改 |
|---|---|---|---|---|---|
| 路径检测 | DeepSeek | 写一个函数,判断箭头沿方向前进到边界之间有没有其他箭头 | 生成四方向检测代码 | 向上判断时越界 | 修改边界条件为 0 <= r < rows |
| 关卡设计 | Kimi | 设计 5 个 6×6 的可通关关卡 | 生成关卡数据 | 第 5 关出现死锁 | 重新设计第 5 关并用 tools/check_levels.py 验证 |
| 碰撞动画 | ChatGPT | 点击被阻挡箭头时,让它晃动并变红 | 晃动代码 | 基本可用 | 调整晃动幅度和持续时间 |
| 背景音乐 | DeepSeek | Pygame 怎么循环播放背景音乐,并支持静音 | pygame.mixer.music 用法 |
音乐正常播放 | 增加空格键切换,并处理中文输入法拦截 M 键的问题 |
通过这些过程,我发现 AI 能快速给出框架和思路,但代码必须自己运行、测试、修改,不能直接复制。
六、测试结果
1. 自动化测试
运行:
python tests/test_core.py
输出:
所有测试通过!
2. 手工测试
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头飞出后消失 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头晃动变红,失误减 1 | 通过 |
| T03 | 点击边缘且朝向棋盘外的箭头 | 正常消失,不越界 | 正常飞出,无报错 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 显示通关界面 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 进入失败界面 | 通过 |
| T06 | 游戏进行中重新开始 | 布局和失误次数恢复 | 恢复初始状态 | 通过 |
3. 关卡检查
运行:
python tools/check_levels.py
输出 5 关全部可解。
七、Git 提交记录
开发过程中按功能阶段进行了多次 Commit:
feat: 完成游戏基本框架
feat: 通关界面显示本关用时
docs: 完善 README 和添加游戏截图
fix: 修正 README 截图路径
docs: 添加动画演示
GitHub 仓库:https://github.com/Vvvicky005/one-arrow-game
八、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 2.0 | 2.0 | 0 |
| Python 与图形库学习 | 3.0 | 3.5 | +0.5 |
| 游戏界面实现 | 3.0 | 4.0 | +1.0 |
| 路径与碰撞逻辑实现 | 2.0 | 1.5 | -0.5 |
| 关卡设计 | 2.0 | 2.5 | +0.5 |
| AIGC 辅助开发 | 3.0 | 4.0 | +1.0 |
| 测试与修改 | 3.0 | 2.5 | -0.5 |
| README 与博客撰写 | 2.0 | 2.0 | 0 |
| 合计 | 20.0 | 22.0 | +2.0 |
九、心得体会
这次作业让我完整经历了一个小游戏从设计、编码、调试到测试的过程。
一开始我以为规则很简单,但真正写起来才发现,路径检测要考虑边界、要考虑已经消失的箭头、还要考虑四个方向。AI 给的代码不能直接用,必须自己运行、测试、修改。
印象最深的是第 5 关出现死锁。玩家玩到一半,所有剩余箭头都互相挡住,谁也飞不出去。后来我写了 tools/check_levels.py,用 BFS 自动判断关卡是否有解,才把这个问题解决。
背景音乐也遇到一个小坑:中文输入法状态下,M 键会被输入法拦截,Pygame 收不到按键事件。后来改成空格键控制静音,问题解决。这个过程让我意识到,开发中很多问题不是代码逻辑问题,而是环境和交互问题。
AIGC 确实能提高效率,它可以快速给出框架、思路和代码片段。但它不是万能的。它生成的关卡可能无解,它写的边界条件可能越界,它给的动画可能效果不好。最终还是要靠自己去运行、去试玩、去判断。
这次作业让我更理解了“模块化”和“测试”的价值。把核心逻辑和界面分开后,逻辑可以单独测试,界面可以放心改。有了自动化测试,改代码时也不怕改坏。
最后看到自己做的开始界面、棋盘、箭头、动画、音乐组合在一起,能正常玩、能通关、能失败、能重开,还是挺有成就感的。
十、素材来源与版权说明
- 本项目只参考“一箭又一箭”类游戏的基础玩法,没有复制原商业游戏的代码、素材、音效或关卡。
- 箭头、云朵、星星、按钮、棋盘等均由 Pygame 图形 API 绘制。
- 背景音乐来自 Pixabay,授权 CC0,可免费使用。
- 项目中未包含密码、Cookie、API Key、Token 等敏感信息。
- 本项目仅用于课程学习,不用于商业用途。

浙公网安备 33010602011771号