软工第二次作业

利用 AIGC 完成 "一箭又一箭" 小游戏

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717
这个作业的目标 使用 Python 和 AIGC 完成 "一箭又一箭" 小游戏
学号 102401331
GitHub 仓库 https://github.com/Lameeloo/arrow-game

1. 项目展示

游戏包含完整的开始界面、游戏界面、通关界面与失败界面:

image

image

image

点击被阻挡的箭头时,箭头会晃动、变红闪烁并显示 "被阻挡!" 提示,同时消耗一次失误:

image

通关与失败界面:

image

image

第一关完整通关演示(GIF,含一次碰撞演示):

image

以上截图由项目内置脚本

tools/make_screenshots.py

离屏渲染生成,游戏画面为 Pygame 原生绘制,无第三方素材。

2. 项目介绍

2.1 游戏规则

  • 棋盘中分布着上、下、左、右四种方向的箭头;

  • 鼠标点击某个箭头后,程序检查其前进方向上、到棋盘边界之间是否存在其他箭头:

    • 无阻挡:箭头沿方向加速飞出棋盘并被消除;

    • 有阻挡:箭头不能消除,出现晃动 + 变红 + 文字提示的碰撞反馈,并消耗 1 次失误;

  • 清除本关全部箭头即通关,自动进入下一关;失误次数耗尽则本关失败;

  • 每关可随时 "重新开始",恢复初始布局与失误次数。

2.2 界面设计

界面 内容
开始界面 游戏标题、规则说明、示例小棋盘、"开始游戏" 按钮
游戏界面 当前关卡、剩余箭头数量、剩余失误次数(红心)、"主页 / 重新开始" 按钮、棋盘
通关界面 "恭喜通关!"+ 进入下一关 / 返回主页
失败界面 "挑战失败"+ 重新开始 / 返回主页

游戏过程中按 Esc 可随时返回开始界面。悬停箭头时有金色高亮框,点击反馈即时。

2.3 主要功能

  • 四方向路径检测与边界处理;

  • 飞出动画(加速 + 淡出)与碰撞反馈(衰减晃动 + 变红闪烁 + 文字提示);

  • 失误次数管理、通关 / 失败状态机与关卡切换;

  • 3 个可通关关卡(每个关卡均经求解器验证存在合法消除顺序);

  • 重新开始功能;自动化测试(T01~T06)。

3. 实现思路

3.1 箭头、方向与关卡如何表示

  • 方向用整数常量表示:0=上,1=下,2=左,3=右,每个方向对应一个坐标增量 DIR_STEP;

  • 箭头是一个 Arrow 对象,记录 (row, col, direction) 三元组;

  • 棋盘 Board 同时维护箭头集合 arrows 和二维网格 grid,可在 O (1) 时间内查询任意格子是否被占用;

  • 关卡用字典描述:棋盘行数、列数、箭头列表、失误上限,数据与逻辑分离,便于后续增删关卡。

UP, DOWN, LEFT, RIGHT = 0, 1, 2, 3

DIR\_STEP = {UP: (-1, 0), DOWN: (1, 0), LEFT: (0, -1), RIGHT: (0, 1)}

\# 关卡示例(节选):每个箭头是一个 (row, col, direction)

{

    "name": "第一关", "rows": 4, "cols": 4, "mistakes": 5,

    "arrows": \[(0, 2, 3), (1, 0, 0), (1, 3, 1), (2, 1, 2), (3, 0, 3), (3, 2, 0)],

}

3.2 路径检测(核心算法)

以箭头所在格为起点,沿其方向逐格前进,只要在到达棋盘边界之前遇到任何一个箭头,就判定为 "被阻挡";走完边界仍无箭头则畅通。四个方向共用同一套循环,天然处理了 "边缘箭头朝外" 的情况(循环体一次都不执行,直接返回畅通,不会越界)。

def is\_blocked(self, arrow):

    dr, dc = DIR\_STEP\[arrow.direction]

    row, col = arrow.row + dr, arrow.col + dc

    while self.in\_bounds(row, col):        # 逐格前进直到边界

        if self.grid\[row]\[col] is not None:

            return True                    # 前方有箭头 → 被阻挡

        row += dr

        col += dc

    return False                           # 到边界都畅通

3.3 关卡可解性验证

由于 "消除一个箭头只会清空路径、绝不会新增阻挡",所以能消就消的贪心策略不会破坏可解性:若贪心能把棋盘消空,则该关可解;若某时刻无箭头可消却仍有剩余,则该关必然死局。程序内置 find_solution(),在测试与截图脚本中用它验证每个关卡、并自动模拟通关。

4. AIGC 使用过程

本次开发使用 deepseek 作为主要 AIGC 编程助手,覆盖需求分析、代码编写、关卡设计与调试全流程。以下选取 4 次有代表性的协作过程:

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何 人工修改
路径检测 deepseek(对话式代码生成) 生成 is_blocked 四方向逐格遍历代码,并说明 "格子坐标增量 + 边界循环" 的统一写法 一次通过四个方向的单元测试;边缘朝外箭头(T03)也能正确处理,未出现越界 人工补充 "中间隔着空格仍算阻挡" 的测试用例(如 → · ↓),并增加 path_cells() 供飞出动画复用路径信息
关卡设计 deepseek(生成关卡数组) 生成 3 关的初始布局数据,并在测试脚本中加入贪心求解器校验可解性 求解器发现第二关存在 → 与 ← 同行互指、第三关存在两组同行 / 同列互指的死局布局,均不可解 人工重排两关布局:把互指箭头改为朝外方向,形成 "先消挡路箭头、再消被挡箭头" 的依赖链;修复后三关全部通过可解性校验(对应 git 提交 fix:)
碰撞反馈动画 deepseek(补全动画代码) 补全箭头晃动(衰减正弦震荡)、变红闪烁、飞出加速淡出等动画类代码 基本可用,反馈清晰 人工调整晃动幅度与动画时长;离屏渲染截图时发现结果弹窗 "返回主页" 按钮超出白色面板底部,调整面板尺寸与按钮位置后重新截图验证
测试用例 deepseek(生成测试框架) 生成 unittest 测试骨架,覆盖 T01~T06 六项作业用例的断言结构 框架可直接运行 人工补充四方向阻挡 / 畅通、边缘越界、关卡可解性与 "四方向齐全" 等边界用例;其中 T06 因关卡修改导致断言失效,人工同步更新测试数据

过程中的关键收获:AI 能快速产出 "看起来正确" 的代码,但可解性这类全局性质,必须靠求解器 / 测试来自动验证—— 第二、三关的 "互指死局" 正是被脚本揪出来的,这也说明 "AI 生成代码 + 自动化校验 + 人工修正" 是可靠的工作流。

5. 测试结果

开发过程中同时进行了自动化测试(python tests.py,11 个用例全部通过)与手工试玩验证(无头渲染模拟点击 + 实际窗口冒烟运行)。对照作业要求测试用例如下:

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头移除、飞出动画播放、数量减 1 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头保留、晃动变红提示 "被阻挡!"、失误 -1 通过
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误 四方向边缘箭头均正常消除,无异常 通过
T04 消除本关全部箭头 显示通关并进入下一关 弹出 "恭喜通关!",点击可进入下一关 通过
T05 失误次数耗尽 显示失败并允许重新开始 弹出 "挑战失败",重新开始后状态恢复 通过
T06 游戏进行中重新开始 箭头布局和失误次数恢复 布局与失误次数均恢复初始值 通过

额外自动化用例:四方向阻挡 / 畅通判断、同一行列隔空格阻挡、关卡全部可解、每关四方向箭头齐全(共 11 项,全部通过)。

6. PSP 表格

任务 预估耗时(小时) 实际耗时(小时) 差异(小时)
需求分析与游戏设计 1.0 1.0 0.0
Python 与图形库学习 1.5 1.0 -0.5
游戏界面实现 2.0 2.5 +0.5
路径与碰撞逻辑实现 1.5 1.5 0.0
关卡设计 1.0 1.5 +0.5
AIGC 辅助开发 1.0 1.0 0.0
测试与修改 1.5 2.0 +0.5
README 与博客撰写 1.5 2.0 +0.5
合计 11.0 12.5 +1.5

表中实际耗时为本人开发记录,请以个人实际情况为准核对。

7. 心得体会

  1. AI 是高效助手,但不是免检产品。AI 在生成 "标准套路代码"(路径遍历、动画补间、测试骨架)上又快又准,省去了大量查资料时间;但它设计的关卡布局存在隐蔽的全局性问题—— 同行 / 同列互指箭头形成的死局,凭肉眼很难发现,最终靠求解器脚本自动暴露。这提醒我:AI 产出必须配合同样的自动化校验,才能放心进入项目。

  2. 把 "能验证" 变成第一原则。本次把游戏逻辑与 pygame 界面分离(game_logic.py 不依赖任何图形库),11 个纯逻辑测试在几毫秒内跑完,改代码、改关卡都能立刻得到反馈;截图与演示 GIF 也用离屏渲染脚本自动生成,开发效率明显提高。

  3. 遇到问题先复现再修。第二关 "不可解" 的报错一开始让我困惑,用脚本逐步打印消除顺序后发现是 "同行互指" 这一结构性陷阱,而不是算法错误。找准根因后,修关卡、改测试、重新验证一气呵成,也让我真正理解了这类点选解谜游戏的设计约束。

  4. 收获:完整走了一遍 "需求分析 → 结构设计 → AI 辅助编码 → 自动化测试 → 人工修正 → 文档交付" 的软件实践流程,也第一次认真体会了 AIGC 工具在编程中的正确使用姿势 —— 用它提速,而不是替我做判断。

posted @ 2026-09-19 14:55  林明亮  阅读(22)  评论(0)    收藏  举报