2026年秋软件工程第二次作业

项目
内容
这个作业属于哪个课程 <课程链接>软件工程实践
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业的目标
使用 Python 和 AIGC 完成 “一箭又一箭” 小游戏
学号 102402155

  1. 项目展示
    开始界面:深色背景 + 游戏标题 + 「开始游戏」按钮。
    游戏过程:顶部信息栏显示当前关卡、剩余箭头数、剩余失误数,并配有「提示」「重新开始」按钮;棋盘上分布着四个方向的黄色箭头,点击可飞出或产生碰撞抖动。
    通关界面:显示「通关!」,可进入下一关或返回菜单。
    失败界面:显示「失败!」,可重新开始或返回菜单。
    开始界面
    游戏界面(关卡 1)
    通关界面
    失败界面

01_menu

02_playing_lv1

03_playing_lv3

04_win

05_lose

  1. 项目介绍
    游戏规则:棋盘上分布带方向的箭头(上、下、左、右)。点击箭头后,程序检查其前进方向的路径:若箭头与棋盘边界之间没有其他箭头,则箭头飞出并消除;若路径上有其他箭头,则不能被消除,并给出碰撞反馈且消耗一次失误。清空本关全部箭头即通关并进入下一关;失误次数耗尽则本关失败,可重新开始。
    界面设计:程序包含开始界面、游戏界面、通关 / 失败界面。游戏界面顶部显示当前关卡、剩余箭头数量、剩余失误次数,并提供「重新开始」「提示」按钮。
    主要功能:
    四方向箭头的绘制与鼠标点击选择;
    前进方向路径检测(同行 / 同列判断是否被阻挡);
    前方无阻挡时箭头飞出并消除(带飞行动画);
    前方有阻挡时给出碰撞反馈(抖动 + 变红 + 文字提示)并扣除一次失误;
    失误次数显示与耗尽判定;
    4 个可正常通关的关卡(经求解器验证存在合理通关顺序);
    清空全部箭头显示通关并进入下一关;失误耗尽显示失败;
    重新开始恢复本关初始状态。
    附加功能(本项目的特色):
    「提示」按钮:用可解性求解器高亮一个当前可飞出的箭头,降低上手门槛;
    飞行动画与碰撞抖动动画,让成功飞出和碰撞反馈更直观。

  2. 实现思路
    3.1 箭头、方向与关卡的表示
    采用网格二维数组表示棋盘:每个格子要么为空(None),要么是一个方向整数,其中 0=上、1=下、2=左、3=右。
    VEC = {0: (-1, 0), 1: (1, 0), 2: (0, -1), 3: (0, 1)} # 方向 -> 行/列增量

关卡用字符串行描述,. 表示空格,^v<> 表示四个方向的箭头,便于阅读和设计:
LEVEL_1 = [
".....",
".>..>",
".^..v",
".....",
"<..<.",
]

3.2 路径检测(核心算法)
点击箭头后,判断其前进方向上是否还有其他箭头。实现为沿方向逐格扫描,只要遇到一个非空格就判定为被阻挡,越界则视为无阻挡:
def is_blocked(grid, r, c):
d = grid[r][c]
dr, dc = VEC[d]
rr, cc = r + dr, c + dc
while 0 <= rr < rows(grid) and 0 <= cc < cols(grid):
if grid[rr][cc] is not None:
return True # 被阻挡
rr += dr
cc += dc
return False # 无阻挡,可飞出

由于箭头只分上、下、左、右,且只判断同一行或同一列,算法复杂度为 O (n),实现简单且不易出错。
3.3 关卡可解性验证
用贪心求解器保证每个关卡都能通关:反复删除当前可飞出的箭头,若最终能删空则关卡可解。因为移除箭头只会减少障碍、不会增加,所以贪心策略是完备的 —— 一旦某状态没有任何箭头可飞出,就永远无法继续,即无解。测试中用该方法对 4 个关卡逐一验证。
3.4 界面与交互
用 Pygame 实现:Game 类统一管理状态(开始 / 游戏中 / 通关 / 失败)、关卡数据与动画;每帧按 clock.tick(FPS) 计算时间增量 dt,驱动飞行动画(沿方向移出棋盘)与碰撞抖动动画(带衰减的随机偏移 + 红色高亮),结束后再更新棋盘状态。

  1. AIGC 使用过程
    本项目使用 AI 编程助手(豆包 / ChatGPT 类 Coding Agent)辅助完成需求分析、代码编写、关卡设计、调试与测试。以下记录 4 次具有代表性的协作过程:
    子任务
    借助何种 AIGC 技术
    AI 实现或提供了什么
    效果如何
    人工修改
    路径检测
    Coding Agent
    生成四个方向的 is_blocked 扫描代码与 removable_arrows 统计
    方向判断正确,但未处理格子越界与空格为 None 的情况
    补充行列边界判断、None 判空,并用单测覆盖四个方向
    关卡设计
    Coding Agent
    生成多套关卡布局并写出贪心求解器验证可解性
    前几版关卡存在 “两个箭头互相指向” 的死锁,求解器判定无解
    根据求解器反馈重新设计,最终 4 关全部通过可解性验证
    图形界面与动画
    Coding Agent
    编写 Pygame 主程序:箭头绘制、信息栏、开始 / 通关 / 失败界面、飞行动画
    结构清晰可直接运行,中文显示依赖 SysFont
    发现 SysFont 在本机枚举字体时报错,改为按字体文件路径加载,兼容性更稳
    调试与状态管理
    Coding Agent
    排查 “通关后误进入菜单” 等问题
    定位到进入下一关后旧界面按钮仍残留、点击被误判
    修正 load_level 重建按钮、失败界面禁止进入下一关等逻辑,并补充冒烟测试

说明:以上均为真实开发过程中 AI 参与并经过人工判断、修改的环节;并非项目完成后一次性虚构。

  1. 测试结果
    采用自动化测试 + 手工试玩结合的方式。自动化测试见 tests/test_logic.py(核心逻辑)与 tests/smoke_game.py(界面交互流程)。以下为主要测试项:
    编号
    测试内容
    预期结果
    实际结果
    是否通过
    T01
    点击前方无阻挡的箭头
    箭头飞出棋盘并消失
    箭头沿方向飞离棋盘并被消除
    ✅ 通过
    T02
    点击前方有阻挡的箭头
    箭头不消失,失误次数减 1
    箭头抖动变红,失误次数减 1
    ✅ 通过
    T03
    点击位于边缘且朝向棋盘外的箭头
    箭头正常消失,不发生越界错误
    正常飞出,无异常
    ✅ 通过
    T04
    消除本关全部箭头
    显示通关并进入下一关
    显示 “通关!”,点击「下一关」进入下一关
    ✅ 通过
    T05
    失误次数耗尽
    显示失败并允许重新开始
    显示 “失败!”,可「重新开始」
    ✅ 通过
    T06
    游戏进行中重新开始
    箭头布局和失误次数恢复
    棋盘与失误次数恢复初始状态
    ✅ 通过
    T07
    4 个关卡可通关性
    全部存在合理通关顺序
    求解器验证全部可解,且逐关试玩通过
    ✅ 通过

自动化测试运行示例:
PASS test_all_levels_solvable
PASS test_is_blocked_directions
...
共 9 项测试全部通过。
冒烟测试全部通过。

1

2

3

4

5

6

7

8

  1. 心得体会
    AI 是高效的 “结对开发者”:借助 AIGC 快速搭出可运行的界面和路径检测代码,把精力集中在游戏规则设计和逻辑正确性上,开发效率明显提升。
    AI 的代码必须自己读懂并验证:AI 生成的四方向检测最初没考虑边界和空格的 None 情况,几版关卡也出现了无解死锁。通过求解器、单元测试和实际试玩来验证,才能保证程序正确、可通关。
    状态管理是这类小游戏的重点:开始、游戏中、通关、失败四种状态的切换,以及 “进入下一关后按钮残留导致误触” 这类问题,提醒我在交互状态上要做仔细的梳理与测试。
    测试要自动化与手工结合:把路径检测和 “可通关性” 写成自动化测试,能快速回归;再逐关手工试玩,确认界面、动画和手感符合预期。
posted @ 2026-09-21 21:37  崔jj  阅读(5)  评论(0)    收藏  举报