软件工程第二次个人作业
项目:一箭又一箭 Python小游戏开发
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717 |
| 这个作业的目标 | 使用 Python + Pygame,借助AIGC工具完成“一箭又一箭”箭头解谜小游戏,实现箭头路径检测、关卡管理、动画反馈、多界面切换等功能,理解图形界面开发与游戏状态管理。 |
| 学号 | 102401202 |
| GitHub 仓库 | https://github.com/hongyalin/arrow-shoot-game |
一、项目展示
1. 开始界面:游戏主页,展示游戏标题,点击开始游戏进入关卡

2. 游戏界面:显示棋盘网格、方向箭头、关卡号、剩余箭头、剩余失误次数、计时、重新开始按钮、提示按钮

3. 成功界面:清除全部箭头后弹出通关弹窗,展示用时,支持下一关/返回主页

4. 失败界面:失误次数耗尽,弹出失败弹窗,支持重试/返回主页

5.碰撞反馈:当箭头碰到前方阻挡时,会变红向前移动至碰到阻挡后返回

6.提示效果:当点击提示图标时,前方无阻挡的箭头会变黄闪烁。每关最多提示两次。

7.重新开始效果:当点击重新开始时,该关游戏页面会回归最初状态。

8.全部关卡通关页面:

二、项目介绍
1.游戏规则
本项目是点击式箭头解谜小游戏,参考微信小游戏《一箭又一箭》核心玩法,独立实现所有代码与素材。
- 棋盘网格内存在上、下、左、右四个方向的箭头。
- 玩家点击箭头,程序检测箭头前进方向:
- 如果箭头朝向棋盘外的路径上没有其他箭头阻挡,箭头播放飞出动画,然后从棋盘消除。
- 如果路径存在其他箭头阻挡,箭头播放碰撞回弹动画,本次点击消耗1次失误机会。
- 玩家一共有3次失误机会,失误次数耗尽则本关失败。
- 清空本关卡所有箭头,即可通关,进入下一关卡。
- 游戏内置3个可通关关卡,支持随时点击【重新开始】重置当前关卡。
2.界面设计
游戏一共包含3类页面:
- 开始界面:带有美化背景图,游戏标题、游戏操作提示、开始游戏按钮。
- 游戏界面:浅蓝简约风格背景,绘制网格棋盘;顶部显示关卡编号、剩余箭头数量、计时、红心血条(剩余失误次数);右上角【重新开始】按钮;右下角提示锦囊按钮;点击箭头有飞出/碰撞动画反馈。
- 结果界面:分为通关成功界面、失败界面,使用独立背景图,中间弹窗展示文字信息与操作按钮。
3.主要功能
- 鼠标点击箭头交互
- 四方向路径检测与阻挡判断
- 箭头飞出、碰撞回弹动画效果
- 失误次数(红心)显示与消耗
- 3个可通关关卡,关卡自动切换
- 计时功能、剩余箭头计数
- 提示锦囊功能(附加功能)
- 多页面状态管理:
start/play/win_level/win/lose/all_clear - 背景图片加载,美化UI(附加功能)
三、实现思路
1. 数据结构设计
- 方向常量:
UP=0, DOWN=1, LEFT=2, RIGHT=3,搭配方向偏移数组DIR_OFFSET,存储每个方向xy移动增量。 - 箭头类 Arrow:封装箭头坐标
x,y、方向dire;保存动画状态:flying(是否飞出)、block_anim(碰撞回弹动画)、locked(被阻挡锁定)、hint_highlight(提示高亮标记),提供update()更新动画、draw()绘制箭头文字与动画。 - 关卡数据 LEVELS:使用列表存储每一关所有箭头坐标+方向,每一关是一个子列表。
- 游戏状态 state:使用字符串标记游戏当前页面状态,
start主页、play游戏棋盘、win_level单关通关、win全部通关、lose关卡失败。
2. 核心:路径检测算法
关键代码片段
def check_path(self, arrow):
dx, dy = DIR_OFFSET[arrow.dire]
cx, cy = arrow.x, arrow.y
while True:
cx += dx
cy += dy
# 判断是否到达棋盘边界
if cx < 0 or cx >= GRID_COLS or cy <0 or cy >= GRID_ROWS:
return True, 0 # 无阻挡,可以飞出
# 检查路径上是否存在其他箭头
for a in self.arrows:
if a.x == cx and a.y == cy:
# 存在阻挡,返回碰撞距离
return False, math.hypot((cx-arrow.x)*CELL_SIZE, (cy-arrow.y)*CELL_SIZE)
逻辑说明:
-
获取箭头方向对应的 x、y 步长。
-
沿着箭头方向一格一格向前遍历。
-
如果坐标超出棋盘边界:路径畅通,箭头可以飞出。
-
如果遍历到任意其他箭头的坐标:判定被阻挡,返回 False,同时计算碰撞距离用于回弹动画。
3. 游戏状态流转
1.程序启动 → 进入start主页,点击开始游戏,加载第 0 关,切换play状态。
2.在play状态:玩家点击箭头,执行路径检测。
-
可飞出:箭头开启飞出动画,动画结束后从 arrows 列表删除;判断 arrows 列表是否为空,为空进入win_level单关通关。
-
被阻挡:开启碰撞回弹动画,失误次数mistake +=1;判断失误次数是否等于最大值,达到上限进入lose失败页面。
3.通关页面:点击下一关,加载下一关数据;全部 3 关打完,进入最终全部通关页面。
4.失败页面:点击重新开始,重置当前关卡所有数据,回到play状态。
4. 动画与界面绘制
绘制遵循先画背景图,再绘制面板、文字、网格、箭头、按钮的顺序。
-
飞出动画:箭头沿着方向持续偏移,到达边界后移除。
-
碰撞动画:箭头向前移动一小段,再回弹回到原位置,使用缓动函数实现平滑效果。
四、AICG使用过程记录
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 路径检测逻辑 | 豆包 | 生成上下左右 4 个方向的路径检测代码,循环遍历判断前方是否存在箭头 | 基础逻辑正确,但向上检测时存在数组越界风险,边界判断不完善 | 修改边界判断条件,调整循环终止逻辑,增加距离计算用于碰撞动画 |
| 箭头碰撞与飞出动画 | 豆包 | 生成 Arrow 类的动画更新、缓动函数代码,实现箭头移动效果 | 动画可以运行,但是回弹速度过快,动画不够顺滑 | 修改 ease_in_out_sine 缓动函数,调整动画步长,优化动画时长 |
| 界面美化与多页面背景加载 | 豆包 | 编写图片加载代码,提供多状态页面绘制模板 | 图片加载代码写在窗口初始化之前,触发 pygame 报错,缺少异常容错 | 调整图片加载顺序,增加 try-except 捕获图片缺失异常,修改 draw 函数,保证先绘制背景再绘制弹窗面板 |
五、测试结果
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头播放飞出动画,飞出棋盘并消失 | 箭头正常飞出并从列表移除 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头触发碰撞回弹动画,不消失,失误次数 - 1 | 箭头回弹,红心减少一颗 | 通过 |
| T03 | 点击位于边缘、朝向棋盘外的箭头 | 箭头正常飞出,不发生数组越界报错 | 箭头正常飞出,无程序崩溃 | 通过 |
| T04 | 消除本关全部箭头 | 清空所有箭头后,弹出通关弹窗,可进入下一关 | 全部箭头消除后,自动切换通关界面,点击下一关加载新关卡 | 通过 |
| T05 | 失误次数耗尽 | 失误次数等于最大限制,弹出失败界面,支持重新开始 | 红心全部消失,进入失败页面,重试按钮可以重置关卡 | 通过 |
| T06 | 游戏进行中点击重新开始 | 当前关卡箭头布局、失误次数、计时全部恢复初始状态 | 棋盘重置,红心恢复 3 颗,计时清零 | 通过 |
六、PSP表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 2 | 1 | -1 |
| Pygame 图形库学习 | 3 | 4 | +1 |
| 游戏界面实现(页面、按钮、文字) | 4 | 2 | -2 |
| 路径检测与碰撞逻辑实现 | 4 | 5 | +1 |
| 关卡设计与关卡试玩验证 | 2 | 1 | -1 |
| AIGC 素材生成 | 1 | 3 | +2 |
| 测试与 Bug 修改 | 2 | 3 | +1 |
| README 文档与博客撰写 | 2 | 4 | +2 |
| 合计 | 20 | 23 | +3 |
七、心得体会
本次作业使用 Python 和 Pygame 完成 “一箭又一箭” 小游戏,并且借助 AIGC 工具辅助开发。AIGC 在代码模板编写、算法思路参考、美术素材生成、文档撰写方面提供了很大帮助,能够快速搭建项目基础框架,节省大量重复代码编写时间。
但是 AI 生成的代码存在明显缺陷:边界条件考虑不全、代码顺序错误、动画参数不符合预期,不能直接复制粘贴运行。我必须读懂每一段代码,手动调试、修改边界逻辑、修正 bug,测试每一个关卡,才能保证程序稳定运行。
通过本次项目,我理解了游戏状态管理、二维网格坐标、路径遍历检测的原理,学会 Pygame 图形绘制、动画实现、图片资源加载。同时认识到,AI 是辅助开发工具,开发者必须掌握代码逻辑、完成测试验证,对最终代码负责。
在开发过程中,我额外增加了计时、提示锦囊等附加功能,进一步熟悉了界面交互和动画效果开发。本次项目的经验,也让我对小型图形化软件项目的完整开发流程有了完整认知。

浙公网安备 33010602011771号