软件工程第二次作业

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 开始界面

游戏启动以后首先进入开始界面。

开始界面主要显示:

游戏名称“一箭又一箭”
游戏规则
开始游戏按钮

玩家点击“开始游戏”后进入第一关。
image

1.3 游戏过程

进入游戏后,可以看到一个 6×6 的棋盘。

棋盘上分布着不同方向的箭头,顶部会显示:

当前关卡
剩余箭头数量
剩余失误次数
重新开始按钮

玩家需要根据箭头方向判断可以先点击哪些箭头。
image

1.4 通关界面

当玩家成功消除当前关卡的全部箭头以后,游戏会进入通关状态。

如果当前不是最后一关,程序会自动进入下一关。

完成最后一个关卡以后,显示最终通关界面。
image

1.5 游戏失败

游戏开始时拥有 3 次失误机会。

如果连续点击被其他箭头阻挡的箭头,使失误次数耗尽,游戏进入失败状态。

失败界面会提示玩家重新开始当前关卡。
image

二、项目介绍
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

77e1b2b4-3aa4-46a6-9d5f-1f97cea2c59f
第一次游戏几面中没有重新开始按钮,后续修改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 可以帮助提高开发效率,但最终程序仍然需要自己理解、修改和测试。

posted on 2026-09-20 20:31  寒渊666  阅读(10)  评论(0)    收藏  举报