软工第二次作业
一、 作业信息
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 软件工程 |
| 这个作业要求在哪里 | 第二次作业 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏 |
| 学号 | 102401212 |
| GitHub 仓库 | https://github.com/sl666slsl/game1 |
二、 项目展示





项目简介:
基于 Python 和 Pygame 开发的休闲解谜小游戏。玩家需要点击箭头使其飞出棋盘,前方有阻挡则失误+1。包含开始界面、游戏界面、通关界面和失败界面,支持 3 个不同难度的关卡。
游戏操作说明:
- 鼠标左键点击箭头:若前方无阻挡,箭头飞出并消失;若有阻挡,失误+1,箭头抖动。
- 右上角“重新开始”按钮:重置当前关卡。
- 失误达到 3 次或通关全部关卡后,点击屏幕可重新开始。
三、 实现思路
1. 数据表示
游戏棋盘使用一个 GRID_ROWS x GRID_COLS 的二维列表 board 表示。每个格子存储箭头方向('up', 'down', 'left', 'right')或 None(空格)。
2. 核心逻辑:路径检测
路径检测函数 check_path(board, row, col, direction) 是游戏的核心。它根据箭头方向遍历同一行或同一列,判断前方是否有其他箭头阻挡。重点是要处理边界情况,避免数组越界(IndexError)。
3. 游戏状态管理
使用 state 变量管理游戏状态(STATE_START, STATE_PLAYING, STATE_WIN, STATE_LOSE)。通关后切换到 STATE_WIN,点击屏幕触发 next_level() 进入下一关。
4. 动画反馈
- 飞出动画:点击后从棋盘移除箭头,并将其加入
flying_arrows列表,每一帧更新位置,模拟飞出效果。 - 碰撞动画:被阻挡时,触发
shake_timer,箭头变红并随机抖动几帧,提供视觉反馈。
四、 AIGC 使用过程(3 次代表性协作)
在本次开发过程中,我借助了 AIGC 工具(ChatGPT / DeepSeek)辅助开发,以下是 3 次具有代表性的协作记录:
协作 1:路径检测逻辑
- 我的提问:“请用 Python 写一个函数,判断二维网格中某个箭头前方是否有其他箭头阻挡,需要处理边界情况。”
- AI 实现:AI 给出了一个遍历同行/同列的代码框架。
- 实际效果:代码逻辑基本正确,但在边缘格子(如最右列朝右的箭头)会报
IndexError数组越界错误。 - 人工修改:我手动修改了循环边界,增加了
if row < 0 or row >= GRID_ROWS: break等判断,确保边缘箭头能正常飞出,修复了 T03 测试用例的 Bug。
协作 2:关卡设计与死局修复
- 我的提问:“帮我生成 3 个‘一箭又一箭’的关卡数据,确保每个关卡都有解。”
- AI 实现:AI 生成了包含多个箭头坐标和方向的列表。
- 实际效果:前两关正常,但第三关出现了死局(某些箭头互相阻挡,导致无法全部消除)。
- 人工修改:我手动推演了第三关的解法,调整了部分箭头的方向,重新设计了一组能确保通关的关卡数据,并编写了一个简单的“关卡求解器”验证了所有关卡都有解。
协作 3:解决 GitHub 推送网络问题
- 我的提问:“git push 时报错
Connection reset和Repository not found,如何解决?” - AI 实现:AI 分析了可能是网络被墙或用户名拼写错误导致的。
- 实际效果:在 AI 的指导下,我排查了用户名(发现
sl666slsl末尾是字母l而不是数字1),并改用 SSH 协议推送。 - 人工修改:我生成了 SSH 密钥,添加到 GitHub,修改远程地址为
git@github.com:sl666slsl/game1.git,最终成功推送代码。这次经历让我学会了如何排查 Git 网络问题。
五、 测试结果
对程序进行了 T01-T06 的测试,结果如下:
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头飞出并消失 | ✅ 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头变红抖动,失误+1 | ✅ 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 正常飞出,无报错 | ✅ 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 显示通关,点击后进入下一关 | ✅ 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 显示“游戏失败”,可重开 | ✅ 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 重置为初始状态 | ✅ 通过 |
六、 PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1 | 1.5 | +0.5 |
| Python 与图形库学习 | 2 | 2 | 0 |
| 游戏界面实现 | 2 | 3 | +1 |
| 路径与碰撞逻辑实现 | 3 | 4 | +1 |
| 关卡设计 | 1 | 1.5 | +0.5 |
| AIGC 辅助开发 | 1 | 2 | +1 |
| 测试与修改 | 1 | 1.5 | +0.5 |
| README 与博客撰写 | 2 | 2 | 0 |
| 合计 | 13 | 17.5 | +4.5 |
七、 心得体会
这次作业是我第一次完整地使用 Python 和 Pygame 开发一个图形化小游戏。在这个过程中,AIGC 工具(如 ChatGPT)给了我很大的帮助,特别是在快速生成代码框架和提供实现思路上。
AI 带来的帮助:
- 快速生成了 Pygame 的基础游戏循环和路径检测代码,节省了大量查文档的时间。
- 在遇到逻辑 Bug(如边缘越界)时,AI 能帮我快速定位问题原因。
遇到的问题与收获:
- AI 代码不能全信:AI 生成的路径检测代码在边缘条件下会报错,需要我手动修改循环边界;生成的第三关数据存在“死局”,需要我手动调整关卡设计。这让我深刻体会到,AI 是助手,而不是替代者,最终需要对代码负责的是程序员自己。
- 网络与 Git 问题:在推送代码到 GitHub 时,我遇到了
Connection reset和Repository not found等报错。通过排查,我发现是网络限制和用户名拼写错误(sl666slsl末尾是字母l而非数字1)导致的。最终通过生成 SSH 密钥并改用 SSH 协议推送成功。这次经历让我学会了 Git 的进阶用法和网络问题排查技巧,收获非常大。
通过这次作业,我不仅掌握了 Pygame 的基本用法,更学会了如何与 AI 协作、如何调试代码、如何解决工程中的实际问题。这些经验对我今后的软件开发学习非常有帮助。
浙公网安备 33010602011771号