软工第二次作业:利用aigc开发小游戏

《一箭又一箭》小游戏开发随笔

一、基础信息

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业的目标 使用 Python 和 AIGC 完成「一箭又一箭」小游戏
学号 102302113
GitHub 仓库 https://github.com/shiluooo/shiluooo

二、项目展示

开始界面

开始界面

选关界面

选关

游戏过程

游戏界面

失误扣血

失误扣血

通关界面

通关界面

最终关卡通关

完成最终关卡

失败界面

失败界面


三、项目介绍

游戏规则

核心玩法参考微信小游戏《一箭又一箭》:棋盘上分布着方向为「上/下/左/右」的箭头,玩家点击箭头后,程序检查其前进方向上是否有其他箭头阻挡:

  • 无阻挡 → 箭头飞出棋盘并消除
  • 有阻挡 → 箭头不动,红色晃动提示,消耗 1 次失误机会
  • 清空全部箭头 → 通关
  • 失误 3 次耗尽 → 失败

界面设计

游戏包含 4 种状态界面:

  1. 开始界面:标题、规则说明、「开始游戏」「选择关卡」两个按钮
  2. 选关界面:2×3 网格展示 6 个关卡,已通关关卡带 ✓ 标记,可自由选择游玩
  3. 游戏界面:顶部 HUD 显示「当前关卡 / 剩余箭头 / 失误次数(心形)」,中部棋盘带交替色格子,底部「重新开始」「返回选关」按钮
  4. 结果界面:半透明蒙层 + 「通关/失败」文字 + 对应操作按钮

实现特色(附加功能)

  • ✅ 关卡难度递增:关卡 1-4 为入门/中等,关卡 5(6×6 12 箭头)、关卡 6(7×7 16 箭头)为高难度
  • ✅ 选关系统:通关任意关卡后会记录通关状态,可自由选择已解锁关卡重玩
  • ✅ 通关即时弹窗:最后一个箭头触发飞出后立即弹窗,无需等待动画结束
  • ✅ 自动关卡生成器:保证所有关卡可通关(见实现思路)

四、实现思路

1. 核心数据结构

  • 关卡表示:用二维字符数组存储,U/D/L/R 对应四个方向,. 表示空格
  • 箭头实体:Arrow 类存储 row, col, direction, state(idle / flying / collide / disappeared 四种状态)
  • 方向向量:DIRS = {'U': (0, -1), 'D': (0, 1), 'L': (-1, 0), 'R': (1, 0)}

2. 路径检测(核心算法)

点击查看代码
python
def check_path_blocked(self, arrow):
    dx, dy = DIRS[arrow.direction]
    r, c = arrow.row, arrow.col
    # 从下一格开始往边界方向逐格检查
    while True:
        r += dy
        c += dx
        # 走到棋盘外 → 路径畅通
        if r < 0 or r >= self.board_rows or c < 0 or c >= self.board_cols:
            return False
        # 遇到 idle 状态的箭头 → 被阻挡
        if self.get_arrow_at(r, c) is not None:
            return True

关键坑点:get_arrow_at 必须只认 state == 'idle' 的箭头。刚触发 flying 的箭头已经「离开格子」,不能再算阻挡——这个 bug出现过,修复逻辑见下文 AIGC 协作部分。

3. 关卡生成与可通关性验证

手动写关卡很容易出现「相向箭头卡死」(比如 L 和 R 对着放,谁都出不去)。我用 贪心放置 + BFS 求解 双重保证可通关:

  1. 贪心放置:每个新箭头放置时,必须保证其朝边界方向路径畅通(无其他箭头)
  2. BFS 求解验证:生成后模拟消除——反复找当前可飞出的箭头消除,直到全部消除(通过)或卡住(放弃重来)

4. 状态机管理

start → select → playing → win → (下一关 / 返回选关)
                              lose → (重新开始 / 返回选关)
playing 中 → 底部按钮可随时返回选关

五、AIGC 使用过程

本次开发全程使用 Trae(字节跳动旗下 Coding Agent,使用内置模型seed code) 辅助,共进行了 3 次核心协作:

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何 人工修改
路径检测初版 + 初始关卡 Trae 生成四方向路径检测循环 + 6 个手动关卡数组 通关验证器跑出来全部卡住——手动关卡存在相向箭头(比如 L/R 对着放),形成死锁 放弃手动关卡,转而让 AI 写自动生成器
关卡自动生成器 Trae 生成「贪心放置 + BFS 求解验证」的关卡生成器,核心是「每个新箭头朝边界路径必须畅通」,生成后用 BFS 模拟可通关性 迭代约 3000 次成功生成 6 关,关卡 5/6 难度拉满(12/16 箭头) 调整关卡规格(关卡 5 目标 12 箭头、关卡 6 目标 16 箭头),增加迭代次数到 5000
两个运行时 bug 修复 Trae ① 定位 pygame.font.SysFont 在 Pygame 2.6.1 存在兼容性 bug(中文显示为方块);② 定位 get_arrow_at 把 flying 状态的箭头当作阻挡,导致刚飞出的箭头挡住后方 两个 bug 定位均准确,修复代码直接可用 ① 改为直接加载 msyh.ttc(微软雅黑);② 把 state != 'disappeared' 改为 state == 'idle';另:AI 最初生成的 get_arrow_at 判断条件写错,必须自己做单元测试验证

六、测试结果

按照作业要求设计了 6 项测试,其中 T01-T04 为游戏核心逻辑,T05-T06 为流程验证:

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头沿方向飞出棋盘并消失 箭头平滑飞出,移出屏幕后标记为 disappeared ✅ 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头变红色 + 高频晃动衰减,失误次数 -1 ✅ 通过
T03 点击边缘朝外的箭头(如第一行的 ↑) 箭头正常消失,无越界错误 沿方向飞出,边界检查正常,无崩溃 ✅ 通过
T04 消除本关全部箭头 显示通关弹窗 最后一个箭头触发 fly 后立即弹窗,无需等待动画 ✅ 通过
T05 失误次数耗尽(连续 3 次点有阻挡的箭头) 显示失败弹窗 第 3 次点击后立即弹出失败界面 ✅ 通过
T06 游戏进行中点击「重新开始」 箭头布局 + 失误次数恢复初始状态 全部箭头重置为初始位置、方向,失误次数恢复为 3 ✅ 通过

七、PSP 表格

PSP(Personal Software Process)是个人软件过程度量表,用于记录预估与实际消耗的时间差异。

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

差异分析

  • 节省时间的部分:AIGC 帮着快速生成样板代码,尤其是界面绘制、状态机框架,比自己手写节省了约 2 小时;Python/Pygame 之前有一定基础,学习成本比预估低
  • 多花时间的部分:关卡生成器踩了「手动关卡卡死」的坑,不得不写自动生成器 + BFS 验证,反而比预估多花了 1 小时;还有运行时 bug 排查(SysFont 兼容性、flying 阻挡),多花了 0.5 小时

八、心得体会

1. AIGC 带来的帮助

  • 提速 60%+:核心逻辑(路径检测、状态机、界面框架)AI 可以直接生成,节省了大量样板代码时间
  • 启发思路:关卡自动生成器是 AI 帮我想的方向,我本来打算手动写 6 关,结果 AI 给出了「贪心 + 验证」的方案,直接解决了「手动关卡容易死锁」的问题
  • 快速定位 bug:两个运行时 bug(SysFont 崩溃、flying 阻挡)AI 定位都非常快,给出的修复代码几乎可以直接用

2. 踩过的坑与教训

  • 不能完全信任 AI 生成的逻辑:AI 生成的初始关卡全部卡死,就是因为没做可通关性验证——必须用单元测试/自动化工具验证 AI 生成的内容
  • 必须自己测核心边界:state 判断条件是我人工排查才发现的 bug,AI 容易忽略「正在飞出的箭头是否还占格子」这种边界逻辑
  • 第三方库版本兼容性:Pygame 2.6.1 的 SysFont 有 bug,这种版本特定问题只能自己跑起来才会发现

3. 个人收获

  • 真正理解了状态机在游戏中的应用——idle / flying / collide / disappeared 四种状态的流转,是解决路径检测 bug 的核心
  • 学会了用 BFS 验证关卡可通关性 的思路,这是做解谜游戏关卡的通用方法
  • 掌握了「AIGC 辅助开发」的正确姿势:让 AI 写代码 → 自己做验证 → 发现问题让 AI 修 → 自己再测,而不是把需求甩给 AI 就不管了

posted @ 2026-09-22 19:46  莳萝莙  阅读(7)  评论(0)    收藏  举报