软件工程第二次作业
2026秋软件工程个人作业(二):一箭又一箭
项目内容 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏
学号 102402128
GitHub 仓库 https://github.com/hanyuan6666/huanyuan-arrows
一、项目展示
1.1 项目简介
本次作业完成的是一个使用 Python + Pygame 开发的“一箭又一箭”益智小游戏。
游戏的核心玩法是:
玩家观察棋盘上箭头的方向,判断箭头前方是否存在其他箭头,并按照合理的顺序点击箭头,使所有箭头最终都飞出棋盘。
游戏目前设计了 3 个基础关卡,每个关卡的箭头位置和方向不同。
游戏过程中玩家拥有 3 次失误机会。如果点击了前方存在其他箭头阻挡的箭头,就会产生一次失误。
1.2 开始界面
游戏启动以后首先进入开始界面。
开始界面主要显示:
游戏名称“一箭又一箭”
游戏规则
开始游戏按钮
玩家点击“开始游戏”后进入第一关。

1.3 游戏过程
进入游戏后,可以看到一个 6×6 的棋盘。
棋盘上分布着不同方向的箭头,顶部会显示:
当前关卡
剩余箭头数量
剩余失误次数
重新开始按钮
玩家需要根据箭头方向判断可以先点击哪些箭头。

1.4 通关界面
当玩家成功消除当前关卡的全部箭头以后,游戏会进入通关状态。
如果当前不是最后一关,程序会自动进入下一关。
完成最后一个关卡以后,显示最终通关界面。

1.5 游戏失败
游戏开始时拥有 3 次失误机会。
如果连续点击被其他箭头阻挡的箭头,使失误次数耗尽,游戏进入失败状态。
失败界面会提示玩家重新开始当前关卡。

二、项目介绍
2.1 游戏规则
游戏采用 6×6 棋盘。
每个箭头都有自己的位置和方向,方向分为:
上
下
左
右
玩家点击箭头后,程序会沿着箭头指向的方向检查路径。
如果箭头到棋盘边界之间不存在其他箭头:
箭头可以飞出棋盘。
如果中间存在其他箭头:
箭头无法飞出,并扣除一次失误机会。
游戏初始有 3 次失误机会。
当所有箭头都被消除以后,当前关卡通关。
2.2 游戏界面设计
游戏界面主要分成三个部分。
第一部分:顶部状态栏
显示当前游戏状态:
当前关卡
剩余箭头数量
剩余失误次数
重新开始按钮
这样玩家可以随时了解当前游戏进度。
第二部分:棋盘
棋盘采用 6×6 网格。
箭头根据自己的方向绘制在对应的格子中。
第三部分:反馈效果
当箭头成功移动时,会播放箭头飞出动画。
当箭头被阻挡时,会出现红色闪烁等反馈效果,同时减少一次失误次数。
2.3 项目主要功能
本项目主要实现了以下功能:
游戏开始界面;
6×6 棋盘;
四方向箭头;
鼠标点击箭头;
箭头路径检测;
箭头阻挡判断;
箭头飞出动画;
碰撞反馈;
失误次数限制;
游戏失败界面;
游戏通关界面;
三个游戏关卡;
重新开始功能;
自动进入下一关。
三、实现思路
3.1 项目代码结构
为了避免所有代码都写在一个文件中,我根据功能对程序进行了模块划分。
arrows_game/
│
├── assets/
│
├── main.py
├── game.py
├── level.py
├── arrow.py
├── ui.py
├── test_game.py
└── README.md
各文件作用:
文件 功能
main.py 游戏入口、主循环和状态切换
game.py 游戏核心逻辑
level.py 三个关卡的数据
arrow.py Arrow 类、箭头绘制和动画
ui.py 游戏界面和按钮
test_game.py 测试代码
README.md 项目说明文档
assets/ 项目图片资源
3.2 箭头与方向表示
箭头需要记录自己的位置和方向。
我使用棋盘的行、列坐标表示箭头位置。
方向则使用二维向量表示:
UP = (-1, 0)
DOWN = (1, 0)
LEFT = (0, -1)
RIGHT = (0, 1)
这种方式的好处是四个方向可以使用统一的逻辑进行处理。
例如:
dr, dc = arrow.direction
就可以得到当前箭头对应的行、列变化量。
3.3 Arrow 类
每个箭头都使用 Arrow 类表示。
核心代码如下:
class Arrow:
def init(self, row, col, direction):
self.row = row
self.col = col
self.direction = direction
self.alive = True
其中:
row:箭头所在行;
col:箭头所在列;
direction:箭头方向;
alive:箭头是否还存在。
使用 alive 可以方便地判断箭头是否已经飞出棋盘。
箭头飞出以后,将它设置为:
self.alive = False
程序后续就不会继续绘制这个箭头。
3.4 核心路径检测
整个游戏最重要的算法就是路径检测。
玩家点击一个箭头后,程序需要回答一个问题:
这个箭头前面有没有其他箭头?
我的实现方法是:
获取箭头方向;
根据方向计算下一格;
从下一格开始逐格检查;
检查过程中判断有没有其他存活箭头;
如果发现箭头,则路径被阻挡;
如果一直检查到棋盘边界都没有发现箭头,则路径畅通。
核心代码如下:
def can_arrow_move(arrow, level, rows, cols):
dr, dc = arrow.direction
r = arrow.row + dr
c = arrow.col + dc
while 0 <= r < rows and 0 <= c < cols:
for other in level:
if other.alive and other is not arrow:
if other.row == r and other.col == c:
return False
r += dr
c += dc
return True
这里没有把整个程序代码都放进博客,只展示最关键的路径检测部分。
3.5 路径检测代码分析
首先:
dr, dc = arrow.direction
获取箭头方向对应的行列偏移。
例如:
上:(-1, 0)
下:(1, 0)
左:(0, -1)
右:(0, 1)
然后:
r = arrow.row + dr
c = arrow.col + dc
从箭头的下一格开始检查。
接下来:
while 0 <= r < rows and 0 <= c < cols:
保证检查的位置没有超出棋盘范围。
然后遍历当前关卡中的其他箭头:
for other in level:
判断当前位置是否存在其他仍然存活的箭头。
其中:
other is not arrow
用于排除当前箭头自己。
如果发现阻挡:
return False
如果一直检查到棋盘边界仍然没有发现阻挡:
return True
因此整个函数的含义就是:
True 表示箭头可以飞出,False 表示箭头前方存在阻挡。
3.6 箭头移动流程
玩家点击箭头之后,游戏处理流程如下:
玩家点击箭头
↓
判断箭头是否存在
↓
进行路径检测
↓
┌──┴──┐
↓ ↓
可以移动 被阻挡
↓ ↓
播放动画 碰撞反馈
↓ ↓
箭头消失 失误次数-1
如果失误次数达到 0:
进入失败状态
如果所有箭头都消失:
进入成功状态
3.7 箭头飞出动画
为了让游戏有更明显的操作反馈,我在 arrow.py 中实现了箭头飞出动画。
箭头成功点击以后,并不是直接从屏幕上消失,而是沿着自己的方向逐渐移动到棋盘外。
动画结束以后再将:
alive = False
这样玩家可以清楚地看到箭头飞出的过程。
3.8 碰撞反馈
当玩家点击被阻挡的箭头时,程序不会让箭头移动。
同时会产生碰撞反馈。
例如箭头会出现红色闪烁效果,并且:
剩余失误次数 - 1
这样玩家能够马上知道这次操作失败的原因。
3.9 关卡设计
本项目一共设计了 3 个基础关卡。
关卡数据单独放在:
level.py
中。
这样做的好处是:
游戏逻辑和关卡数据相互独立。
每个关卡都经过实际运行测试,确认存在合理的通关顺序。
四、AIGC 使用过程
本项目开发过程中使用了 AIGC 作为辅助开发工具。
AIGC 主要用于:
分析游戏需求;
辅助设计项目结构;
编写部分基础代码;
分析路径检测算法;
辅助设计关卡;
分析运行过程中出现的问题;
辅助完善 UI;
辅助整理测试和文档。
但是 AI 生成的代码并没有直接全部使用,而是经过了自己的运行、检查、修改和测试。
下面记录 3 次比较具有代表性的 AI 协作过程。
4.1 第一次 AI 协作:设计游戏基本框架
我的需求
最开始需要使用 Python 和 Pygame 完成“一箭又一箭”小游戏,因此首先让 AI 帮助分析游戏应该由哪些模块组成。
AI 提供的内容
AI 根据需求给出了游戏的基本结构,包括:
游戏主循环
箭头对象
游戏逻辑
关卡数据
UI 界面
并建议将不同功能拆分到不同 Python 文件中。
我的实际使用
根据 AI 的建议,我最终将项目拆分成:
main.py
game.py
arrow.py
level.py
ui.py
而不是把所有代码写在 main.py 中。
人工修改
AI 给出的初始结构只是一个基础框架。
我根据实际游戏需求增加了:
3 个关卡;
失误次数;
成功状态;
失败状态;
重新开始;
箭头飞出动画;
碰撞反馈。
最终效果
形成了可以正常运行的游戏基本框架,为后面的功能实现提供了基础。
4.2 第二次 AI 协作:解决路径检测问题
这是本项目中比较重要的一次 AI 协作。
遇到的问题
游戏最核心的功能是:
判断箭头前方有没有其他箭头。
因此需要沿着箭头方向逐格检查。
我让 AI 帮助分析这个问题,并生成路径检测函数。
AI 提供的思路
AI 建议根据箭头方向得到:
dr, dc
然后不断计算:
r += dr
c += dc
直到棋盘边界。
实际运行发现的问题
最初代码在方向和边界处理方面存在问题。
如果没有正确处理边界,就可能检查到棋盘范围之外。
另外,在遍历箭头时,还需要排除当前箭头自身。
我的修改
最终增加了边界判断:
while 0 <= r < rows and 0 <= c < cols:
同时增加:
other is not arrow
避免把当前箭头自己当成阻挡物。
最终效果
修改以后,程序可以正确判断:
前方没有箭头 → 可以飞出;
前方有箭头 → 无法飞出;
靠近边界 → 不发生越界错误。
这是整个游戏能够正常运行的关键。
4.3 第三次 AI 协作:完善游戏反馈和界面
遇到的问题
最初游戏虽然可以实现箭头消除,但是操作反馈比较简单。
例如点击一个被阻挡的箭头以后,玩家不容易直观看出为什么没有移动。
AI 提供的建议
AI 建议增加:
红色碰撞反馈;
箭头飞出动画;
剩余箭头数量;
剩余失误次数;
当前关卡显示;
重新开始按钮;
成功和失败界面。
我的实际修改
我根据实际运行效果对界面进行了调整。
点击可以移动的箭头时:
箭头 → 飞出 → 消失
点击被阻挡的箭头时:
箭头 → 红色闪烁 → 失误次数减少
同时在顶部显示当前关卡、剩余箭头以及剩余失误次数。
最终效果
游戏的操作反馈更加明显,玩家可以比较直观地理解当前操作产生的结果。
4.4 AIGC 使用总结
通过这三次 AI 协作,我发现 AIGC 对开发过程最大的帮助是:
可以快速提供思路和代码基础,让我不用从零开始搜索所有资料。
但是 AIGC 生成的代码仍然需要人工检查。
尤其是路径检测这种具有边界条件的逻辑,AI 给出的代码不一定可以直接运行。
因此实际开发过程采用的是:
需求
↓
AI 辅助
↓
生成代码
↓
自己运行
↓
发现问题
↓
自己分析
↓
修改代码
↓
重新测试
而不是直接复制 AI 生成的代码。
五、测试结果
为了验证游戏功能,我对主要功能进行了实际测试。
编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出并消失 箭头正常飞出并消失 ✅
T02 点击前方有阻挡的箭头 箭头不能飞出,失误次数减少 箭头红色闪烁,失误次数减少 ✅
T03 点击棋盘边缘的箭头 正常飞出,不发生越界错误 箭头正常飞出 ✅
T04 清除当前关卡全部箭头 显示通关并进入下一关 正常进入下一关 ✅
T05 失误次数耗尽 显示失败界面 正常显示失败界面 ✅
T06 点击重新开始 当前关卡重新初始化 可以重新开始当前关卡 ✅
5.1 正常消除测试
选择一个前方没有其他箭头的箭头。
测试结果:
点击箭头
↓
路径畅通
↓
箭头飞出
↓
箭头消失
实际运行正常,测试通过。
5.2 阻挡测试
选择一个前方有其他箭头的箭头。
测试结果:
点击箭头
↓
检测到阻挡
↓
箭头不能飞出
↓
产生红色反馈
↓
失误次数减少
实际运行正常,测试通过。
5.3 边界测试
测试棋盘边缘的箭头。
重点检查路径检测过程中是否发生数组越界。
实际测试中:
箭头可以正常飞出,程序没有发生崩溃。
测试通过。
5.4 通关测试
按照合理的顺序消除当前关卡中的所有箭头。
最后一个箭头消失后:
程序正常进入通关状态。
三个关卡都进行了实际运行测试。
测试通过。
5.5 失败测试
连续点击被阻挡的箭头,使失误次数逐渐减少。
当失误次数耗尽后:
游戏正常显示失败界面。
测试通过。
5.6 重新开始测试
点击重新开始按钮。
实际结果:
当前关卡重新初始化,箭头恢复到初始状态,失误次数恢复。
测试通过。
六、PSP 表格
本次开发按照不同阶段记录预计耗时和实际耗时。
任务 预计耗时(小时) 实际耗时(小时) 差异(小时)
需求分析与游戏设计 1.0 0.8 -0.2
Python 与图形库学习 1.5 1.5 0
游戏界面实现 1.5 1.3 -0.2
路径与碰撞逻辑实现 3.0 2.8 -0.2
关卡设计 1.2 1.1 -0.1
AIGC 辅助开发 1.5 1.4 -0.1
测试与修改 1.5 1.2 -0.3
README 与博客撰写 1.8 1.5 -0.3
合计 14.0 11.6 -1.4

第一次游戏几面中没有重新开始按钮,后续修改main.py加入该按钮
七、心得体会
这次软件工程作业让我完整体验了一次小游戏从设计到实现、测试和文档整理的过程。
在项目开始的时候,我首先需要确定游戏的基本规则,然后使用 Python 和 Pygame 实现游戏界面和交互。
在开发过程中,AIGC 对我的帮助比较明显。
例如在项目结构设计、Python 代码编写、路径检测算法分析以及界面优化方面,AI 可以快速给出一个可以参考的实现方案。
但是在实际开发过程中,我也发现:
AI 生成的代码并不代表一定正确。
这次项目中比较明显的问题就是路径检测。
AI 给出的初始代码虽然整体思路是正确的,但是实际运行以后仍然需要处理:
棋盘边界;
行列方向;
当前箭头自身;
其他箭头是否存活等问题。
这些问题必须通过实际运行程序才能发现。
所以这次作业让我认识到,使用 AIGC 时不能只停留在“复制代码”的阶段。
正确的开发方式应该是:
AI 提供思路
↓
理解代码
↓
自己运行
↓
发现问题
↓
修改代码
↓
测试验证
通过这次项目,我也进一步熟悉了 Python 和 Pygame 的基本使用,包括游戏循环、鼠标事件、对象管理、动画效果和界面绘制。
另外,通过将代码拆分成 main.py、game.py、arrow.py、level.py 和 ui.py 等不同模块,我对模块化开发也有了更加直观的认识。
总体来说,这次作业让我认识到,一个看起来比较简单的小游戏,真正实现起来也需要经过需求分析、设计、编码、调试、测试和文档整理等多个阶段。
八、项目最终结构
arrows_game/
│
├── assets/
│ ├── menu.png
│ ├── game.png
│ └── success.png
│
├── arrow.py
├── game.py
├── level.py
├── main.py
├── test_game.py
├── ui.py
└── README.md
项目 GitHub 地址:
https://github.com/hanyuan6666/huanyuan-arrows
九、总结
本次作业最终完成了一个可以正常运行的“一箭又一箭”小游戏。
项目实现了:
6×6 游戏棋盘;
四方向箭头;
箭头路径检测;
箭头阻挡判断;
箭头飞出动画;
碰撞反馈;
3 次失误限制;
游戏成功和失败状态;
3 个基础关卡;
重新开始功能;
Pygame 游戏界面;
游戏功能测试。
通过本次作业,我对 Python Pygame 游戏开发以及软件工程的完整开发流程有了更加深入的认识,同时也体会到了 AIGC 在软件开发中的辅助作用。
AIGC 可以帮助提高开发效率,但最终程序仍然需要自己理解、修改和测试。
浙公网安备 33010602011771号