软件工程第二次个人作业——星愿:一箭又一箭

软件工程第二次个人作业:星愿:一箭又一箭

一、作业信息

项目 内容
这个作业属于哪个课程 2026 年软件工程与软件工程实践
这个作业要求在哪里 第二次个人作业:利用 AIGC 完成小游戏
这个作业的目标 使用 Python 和 AIGC 完成“星愿:一箭又一箭”小游戏
学号 102402134
GitHub 仓库 https://github.com/wlangleah-maker/2026-software-engineering-assignment
截止时间 2026-09-22 23:59:59

二、项目展示

本项目使用 Python 标准库 Tkinter 实现,无需下载额外的图形库。程序包含开始界面、游戏界面、单关评分界面、最终通关界面和失败界面。

开始界面

53ddfdb7af0a7dc68bdd698c20343241_0

游戏过程

004c5ab03b0f03d7947f27f22e506099_0

1da27f8e924a697c0ca165218edec9ad_0

碰撞反馈

05a5853b0668ceff927eba8be484e440_0

单关评分

ab46ee06c33e309bc0b0795cb934bede_0

9e712f600a8b12caf82a877223edaa5c_0

最终通关画面

78de6bf3bbd55763b989345c184ba64d_0

失败界面

ce6467326723a3badd115d33dc2ad675_0

五个关卡已实际试玩,关卡切换、评分、最终通关和失败重试功能均运行正常。

三、项目介绍

“一箭又一箭”是一款点击式箭头解谜游戏。棋盘中的箭头具有上、下、左、右四种方向。点击箭头时,程序检查箭头前进方向上是否还有其他箭头:

  • 路径畅通:播放飞出动画,随后从棋盘中移除;
  • 路径被阻挡:箭头变红并晃动,失误机会减 1;
  • 清空全部箭头:本关通关并进入下一关;
  • 失误机会耗尽:显示失败界面,可以重新开始;
  • 游戏进行中也可以随时重新开始当前关卡。

项目共设计了 5 个难度递增的关卡。除了人工试玩外,还编写了深度优先搜索求解器和自动化测试,验证每个关卡至少存在一种通关顺序。

四、实现思路

4.1 数据表示

每个箭头使用不可变数据类 Arrow 表示:

@dataclass(frozen=True)
class Arrow:
    id: str
    row: int
    col: int
    direction: str

rowcol 表示箭头在网格中的位置,directionupdownleftright。每个关卡由一个箭头列表构成,界面和游戏规则不依赖固定关卡,可以方便地增加新关卡。

4.2 路径检测

基础版箭头只占一个网格,因此只需检查同一行或同一列:

if direction == "up":
    检查同列且 row 更小的箭头
elif direction == "down":
    检查同列且 row 更大的箭头
elif direction == "left":
    检查同行且 col 更小的箭头
elif direction == "right":
    检查同行且 col 更大的箭头

实现中没有直接访问 board[row - 1][col],而是遍历仍然存在的箭头并比较坐标,因此位于棋盘边缘的箭头不会产生负索引或数组越界问题。

4.3 游戏状态

GameModel 保存当前剩余箭头和失误次数。界面只负责显示、点击和动画,路径判断、扣除失误、胜负状态等规则放在独立模块中。这样既降低界面代码复杂度,也便于单元测试。

4.4 动画反馈

成功点击时,箭头根据方向向量逐帧移动,直到飞出棋盘,再从模型中删除。碰撞时使用正弦函数产生逐渐衰减的往复位移,同时把箭头临时显示为红色。动画期间暂时禁止新的点击,避免一次操作被重复处理。

五、AIGC 使用过程

以下记录来自本次项目的实际协作过程。

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何及人工修改
路径检测 ChatGPT 根据箭头的行、列和方向生成四个方向的检测思路与代码 初始讨论中发现向上判断可能出现负索引或越界,因此人工改为遍历现存箭头并比较坐标。修改后边缘箭头不会越界,四方向判断通过自动化测试。
关卡设计 Codex 生成 5 个关卡数组,并提供可解性验证思路 初始布局存在循环阻挡、无法通关的风险。人工调整箭头位置和方向,并增加 DFS 求解器验证。最终 5 关均能自动求得完整消除顺序。
碰撞动画与界面美化 Codex 根据已有动画状态补全流星晃动和飞出动画,并协助制作半透明棋盘、五角星流星及星空界面 初始动画基本可用,之后根据实际试玩调整为 18 帧、每帧约 22 毫秒,并多次修改流星造型和背景。最终动画速度自然,碰撞、飞出和界面切换均正常。
自动化测试 ChatGPT/Codex 根据 T01—T06 要求整理单元测试,并增加关卡可解性测试 人工检查测试断言与实际规则一致,测试覆盖成功消除、阻挡扣分、边界、通关、失败、重开和关卡可解性。

AI 提升了代码框架搭建和测试用例整理的速度,但生成结果仍需要实际运行、阅读和修改。尤其是边界条件和关卡可解性,不能只根据代码表面判断。

六、测试结果

测试方式为自动化单元测试与手工界面测试相结合。

编号 测试内容 操作步骤 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 启动第一关,点击任意朝棋盘外的箭头 箭头飞出棋盘并消失 自动化逻辑测试通过;界面执行飞出动画后箭头消失 通过
T02 点击前方有阻挡的箭头 在第二关先点击被同行箭头阻挡的箭头 箭头不消失,产生碰撞反馈,失误次数减 1 箭头红色晃动并保留,失误机会减 1 通过
T03 点击边缘且朝向棋盘外的箭头 分别测试上、下、左、右边缘箭头 正常飞出并消失,不发生越界 四个方向均通过边界单元测试,未发生异常 通过
T04 消除本关全部箭头 按可行顺序清空关卡 显示通关并进入下一关 显示通关弹层,点击后进入下一关 通过
T05 失误次数耗尽 连续 3 次点击被阻挡箭头 显示失败并允许重新开始 显示失败弹层,可重新载入当前关卡 通过
T06 游戏进行中重新开始 先消除箭头并产生一次失误,再点击重新开始 箭头布局和失误次数恢复 模型恢复初始箭头集合和 3 次机会 通过
T07 关卡可解性 对 5 个关卡运行 DFS 求解器 每关返回覆盖全部箭头的消除顺序 5 个关卡均找到完整解 通过

运行测试命令:

python -m unittest -v test_game.py

七、PSP 表格

以下为本次开发的合理记录初稿。提交者应根据自己的真实用时复核并修改,不能把不真实的数据直接提交。

任务 预估耗时(小时) 实际耗时(小时) 差异(小时)
需求分析与游戏设计 1.0 0.8 -0.2
Python 与图形库学习 1.5 0.8 -0.7
游戏界面实现 3.0 3.2 +0.2
路径与碰撞逻辑实现 2.5 2.8 +0.3
关卡设计 1.5 1.8 +0.3
AIGC 辅助开发 1.5 1.5 0.0
测试与修改 2.0 2.2 +0.2
README 与博客撰写 2.0 2.9 +0.9
合计 15.0 16.0 +1.0

实际耗时共 16.0 小时,比预估多 1.0 小时,主要原因是界面美化、素材调整和博客整理所需时间比预想更多。

八、心得体会

本次作业让我体验了 AIGC 参与小型软件项目的完整过程。AI 能够快速提供结构设计、函数框架和测试思路,减少查找语法和重复编码所需的时间,但 AI 生成的内容不一定天然正确。例如,边界遍历可能出现负索引,随机生成的关卡也可能因为循环阻挡而无法通关。如果不进行实际测试,很容易把隐藏问题带入最终项目。

我将界面与核心规则分开,使路径检测可以脱离图形界面单独测试;同时编写 DFS 求解器验证关卡是否可通关。这个过程让我进一步理解了二维坐标、方向判断、状态管理、事件循环和动画的实现方式,也认识到“能运行”不等于“正确”。使用 AIGC 时,开发者仍然需要明确需求、阅读关键代码、构造边界测试并对最终结果负责。

posted @ 2026-09-20 17:32  Langleah  阅读(8)  评论(0)    收藏  举报