AIGC标识 2026 秋软件工程个人作业(第二次):利用 AIGC 完成"一箭又一箭"小游戏

2026 秋软件工程个人作业(第二次):利用 AIGC 完成"一箭又一箭"小游戏

项目 内容
这个作业属于哪个课程 2026-01软件工程与软件工程实践
这个作业要求在哪里 作业要求链接
这个作业的目标 使用 Python 和 AIGC 完成"一箭又一箭"小游戏
学号 102401415
GitHub 仓库 https://github.com/Lin-fzu/ArrowGame

一、项目展示

1.1 开始界面

游戏启动后进入开始界面,展示游戏名称、规则说明和开始按钮。

开始界面

1.2 游戏界面

游戏界面顶部显示关卡名称,左上角显示剩余箭头数量,右上角显示剩余失误次数,中央为游戏棋盘,底部提供重新开始和返回菜单按钮。

游戏界面-第一关

游戏界面-第三关

1.3 通关界面

清除当前关卡全部箭头后,显示通关结果,可选择进入下一关或重玩本关。

通关界面

1.4 失败界面

失误次数耗尽时,显示失败结果,可选择重新开始或返回菜单。

失败界面


二、项目介绍

2.1 游戏规则

"一箭又一箭"是一款点击式箭头解谜游戏。棋盘中包含上、下、左、右四种方向的箭头,玩家需要观察箭头的方向和相互阻挡关系,按照合适的顺序点击箭头,使所有箭头依次飞出棋盘。

  • 点击箭头后,程序检查其前进方向上的路径
  • 前方无阻挡:箭头飞出棋盘并被消除
  • 前方有阻挡:箭头不能消除,触发碰撞反馈(前冲后返回 + 变红),并消耗一次失误机会
  • 清除本关全部箭头即可进入下一关
  • 失误次数耗尽时,本关失败,可重新开始

2.2 主要功能

功能 说明
图形化界面 基于 Pygame 开发,包含开始、游戏、通关、失败四种界面
四方向箭头 支持上、下、左、右四种箭头,用三角形绘制
鼠标点击操作 点击箭头尝试飞出,点击按钮进行操作
路径检测 正确判断箭头前进方向上是否存在其他箭头
飞出动画 箭头沿方向加速移出棋盘
碰撞反馈 箭头前冲后返回,同时变为红色警示
失误计数 显示剩余失误次数,耗尽则失败
三个关卡 3×3、4×4、5×5 三个难度递增的关卡
关卡切换 通关后自动进入下一关
重新开始 恢复当前关卡到初始状态
键盘快捷键 R 键重开、ESC 键返回菜单

2.3 关卡设计

关卡 名称 棋盘大小 箭头数量 失误上限
1 初窥门径 3×3 4 3
2 渐入佳境 4×4 6 3
3 运筹帷幄 5×5 8 4

每个关卡均经过贪心算法验证,存在合理的通关顺序。


三、实现思路

3.1 数据结构设计

箭头方向表示:使用字符 U/D/L/R 分别表示上、下、左、右四种方向,关卡数据以二维字符数组存储,. 表示空格。

# 关卡数据示例
LEVELS = [
    {
        "name": "第一关 · 初窥门径",
        "grid": [
            ["R", ".", "U"],
            [".", ".", "."],
            ["D", ".", "L"],
        ],
        "max_mistakes": 3,
    },
]

Arrow 类:每个箭头对象包含以下属性:

  • row, col:在棋盘中的行列位置
  • direction:箭头方向(U/D/L/R)
  • alive:是否存活(未被消除)
  • anim_state:动画状态(idle/flying/crashing)
  • anim_progress:动画进度(0.0 ~ 1.0)

3.2 路径检测算法

路径检测是游戏的核心逻辑。对于一个箭头,从其位置出发,沿方向向量逐格检查,直到到达棋盘边界:

def check_path_clear(self, arrow):
    dx, dy = DIR_VECTORS[arrow.direction]
    r, c = arrow.row, arrow.col
    rows = len(self.initial_grid)
    cols = len(self.initial_grid[0])

    nr, nc = r + dy, c + dx
    while 0 <= nr < rows and 0 <= nc < cols:
        if self.get_arrow_at(nr, nc) is not None:
            return False  # 遇到阻挡
        nr += dy
        nc += dx
    return True  # 路径畅通

算法说明

  • 时间复杂度 O(n),n 为棋盘边长
  • 只检查同一行或同一列上箭头与边界之间的格子
  • 遇到第一个存活箭头即返回 False(有阻挡)
  • 到达边界仍未遇到箭头则返回 True(畅通)

3.3 动画系统

飞出动画:箭头沿方向向量移动,位移随动画进度递增,最终移出棋盘后将 alive 设为 False。

碰撞动画:箭头先沿方向前冲一段距离(进度 0~0.5),然后返回原位(进度 0.5~1.0),同时颜色变为红色。动画结束后恢复 idle 状态。

3.4 游戏状态管理

使用状态机管理游戏流程:

  • menu:开始界面
  • playing:游戏进行中
  • level_complete:关卡通关
  • game_over:游戏失败
  • all_complete:全部通关

状态切换由用户操作和游戏逻辑触发,例如消除全部箭头后切换到 level_complete,失误耗尽后切换到 game_over


四、AIGC 使用过程

本次开发使用 豆包 (Doubao) 作为 AIGC 辅助工具,以下记录 4 次具有代表性的使用过程。

4.1 第一次:需求分析与代码结构设计

项目 内容
子任务 游戏整体架构设计
借助何种 AIGC 技术 豆包 (Doubao)
提出的要求 分析"一箭又一箭"游戏需求,设计 Python + Pygame 的代码结构,包括类划分、核心方法和数据结构
AI 实现或提供了什么 设计了 Arrow 类(箭头属性和动画)、ArrowGame 类(游戏主控制器),规划了路径检测、状态管理、界面绘制等模块,给出了关卡数据的二维数组表示方案
效果如何 整体架构清晰合理,类划分符合面向对象设计原则,数据结构选择恰当,为后续编码提供了明确的框架
人工修改 基本采用 AI 设计的结构,仅将字体初始化从 SysFont 改为直接加载字体文件(因兼容性问题,见第三次记录),并增加了键盘快捷键功能

4.2 第二次:路径检测算法实现

项目 内容
子任务 四方向路径检测与碰撞判断
借助何种 AIGC 技术 豆包 (Doubao)
提出的要求 实现箭头前进方向的路径检测算法,要求正确处理四个方向、边界条件,以及有阻挡和无阻挡两种情况
AI 实现或提供了什么 生成了 check_path_clear 方法,使用方向向量 DIR_VECTORS 统一处理四个方向,从箭头位置出发沿方向逐格检查,遇到其他箭头返回 False,到达边界返回 True
效果如何 算法逻辑正确,四个方向统一处理避免了重复代码,边界条件处理得当,经测试 T01-T03 全部通过
人工修改 未做实质性修改,仅调整了变量命名以保持代码风格一致

4.3 第三次:Bug 修复 - Pygame 字体兼容性问题

项目 内容
子任务 修复游戏启动崩溃问题
借助何种 AIGC 技术 豆包 (Doubao)
提出的要求 运行游戏时 pygame.font.SysFont("microsoftyahei", 48) 报错 TypeError: expected str, bytes or os.PathLike object, not int,分析原因并提供修复方案
AI 实现或提供了什么 分析出这是 pygame 2.6.1 在 Python 3.13 上的已知兼容性问题(initsysfonts_win32 函数处理注册表字体时类型错误),建议改用 pygame.font.Font(font_path, size) 直接加载字体文件,并提供了微软雅黑字体的系统路径
效果如何 修复后游戏正常启动,中文字体渲染正确,所有界面文字显示正常
人工修改 采用 AI 建议的方案,将 4 处 SysFont 调用替换为 Font("C:/Windows/Fonts/msyh.ttc", size),并添加了注释说明原因

4.4 第四次:自动化测试用例编写

项目 内容
子任务 编写 T01-T06 自动化测试
借助何种 AIGC 技术 豆包 (Doubao)
提出的要求 根据作业要求的 T01-T06 测试项,编写自动化测试脚本,使用 dummy 视频驱动避免弹窗,验证箭头消除、失误计数、边界处理、关卡通关、游戏失败、重新开始等功能
AI 实现或提供了什么 生成了完整的 test_game.py 测试脚本,包含 7 个测试函数,使用 SDL_VIDEODRIVER=dummy 环境变量实现无窗口测试,通过模拟动画更新验证箭头消除,使用贪心算法验证所有关卡可通关
效果如何 7/7 测试全部通过,覆盖了作业要求的所有测试项,额外验证了三个关卡的可通关性
人工修改 未做修改,测试脚本直接运行通过

五、测试结果

5.1 测试环境

  • 操作系统:Windows 11
  • Python 版本:3.13.13
  • Pygame 版本:2.6.1
  • 测试方式:自动化测试脚本(dummy 视频驱动)+ 手工试玩验证

5.2 测试结果汇总

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头飞出动画播放后消失,存活数减 1 ✅ 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头播放碰撞动画后保持,失误数从 0 变为 1 ✅ 通过
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误 边缘朝外箭头路径检测返回 True,正常飞出,无越界异常 ✅ 通过
T04 消除本关全部箭头 显示通关并进入下一关 全部箭头消除后状态切换为 level_complete,显示通关界面 ✅ 通过
T05 失误次数耗尽 显示失败并允许重新开始 失误达到上限后状态切换为 game_over,显示失败界面,可重新开始 ✅ 通过
T06 游戏进行中重新开始 箭头布局和失误次数恢复 重新开始后箭头数恢复为初始值,失误数归零 ✅ 通过

5.3 额外测试

测试内容 结果
关卡 1 可通关性验证 ✅ 4 步通关
关卡 2 可通关性验证 ✅ 6 步通关
关卡 3 可通关性验证 ✅ 8 步通关
键盘快捷键(R/ESC) ✅ 功能正常
界面切换流畅性 ✅ 无卡顿

5.4 测试运行输出

============================================================
测试总结
============================================================
  [PASS] T01 箭头消除
  [PASS] T02 失误计数
  [PASS] T03 边界处理
  [PASS] T04 关卡通关
  [PASS] T05 游戏失败
  [PASS] T06 重新开始
  [PASS] 关卡可通关验证

总计: 7/7 通过
所有测试通过!

六、PSP 表格

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

差异分析

  • Python 与图形库学习比预估少,因为已有 Pygame 基础
  • 路径与碰撞逻辑实现比预估快,AIGC 生成的代码质量较高
  • AIGC 辅助开发和博客撰写比预估略多,主要花在调试字体兼容性问题和完善博客内容上

七、心得体会

7.1 AIGC 带来的帮助

  1. 架构设计效率提升:AIGC 能够快速分析需求并给出合理的代码结构设计,避免了从零开始摸索的时间成本。Arrow 类和 ArrowGame 类的划分在开发初期就确定了,后续编码非常顺畅。

  2. 核心算法快速实现:路径检测算法虽然不复杂,但 AIGC 生成的代码使用方向向量统一处理四个方向,比我最初设想的四个 if 分支更简洁优雅。

  3. Bug 定位与修复:遇到 Pygame 字体兼容性问题时,AIGC 迅速定位到是 pygame 2.6.1 + Python 3.13 的已知问题,并给出了直接加载字体文件的解决方案,节省了大量搜索和试错时间。

  4. 测试用例自动生成:AIGC 生成的测试脚本覆盖了所有要求的测试项,还额外使用 dummy 视频驱动实现了无窗口测试,以及贪心算法验证关卡可通关性,测试质量超出预期。

7.2 出现的问题

  1. Pygame 字体兼容性问题pygame.font.SysFont 在 Python 3.13 下崩溃,这是 pygame 2.6.1 的已知 bug。通过改用 pygame.font.Font 直接加载字体文件解决。

  2. Git 环境缺失:系统未安装 Git,需要通过 winget 安装。安装后首次推送时凭据管理器弹出浏览器授权,整体流程顺利。

  3. 关卡设计需验证可通关性:最初设计的几个关卡布局存在死锁(两个箭头互相阻挡),通过编写贪心算法验证才发现并调整。这让我意识到关卡设计不能只靠直觉,需要算法验证。

7.3 收获与总结

  1. AIGC 是工具不是替代品:AIGC 能够大幅提升开发效率,但生成的代码仍需要人工审查和测试。例如字体兼容性问题就是在实际运行中发现的,AIGC 最初生成的代码也使用了 SysFont。

  2. 测试驱动开发的价值:编写自动化测试脚本不仅验证了功能正确性,还在关卡设计阶段帮助发现了死锁问题。测试不再是可选的"额外工作",而是开发流程的必要组成部分。

  3. 版本控制的重要性:按照作业要求进行多次有意义的 Commit,而不是一次性上传全部代码,让开发过程更有条理,也便于回溯和问题定位。

  4. 小游戏开发的完整流程:从需求分析、架构设计、编码实现、测试验证到文档撰写,完整经历了一个小型软件项目的开发流程,对软件工程的实践有了更深入的理解。


八、附录

8.1 项目结构

ArrowGame/
├── main.py                  # 游戏主程序(界面、逻辑、动画)
├── levels.py                # 关卡数据
├── test_game.py             # 自动化测试脚本
├── capture_screenshots.py   # 截图生成脚本
├── README.md                # 项目说明文档
├── .gitignore               # Git 忽略文件
├── assets/                  # 资源文件目录
└── screenshots/             # 游戏截图
    ├── 01_menu.png
    ├── 02_game_level1.png
    ├── 03_game_level3.png
    ├── 04_level_complete.png
    └── 05_game_over.png

8.2 运行方法

# 安装依赖
pip install pygame

# 运行游戏
python main.py

# 运行测试
python test_game.py

8.3 GitHub 提交记录

Commit 说明
417f77e feat: 初始化项目结构,添加三个关卡数据
275ae4b feat: 实现游戏核心逻辑和图形界面
633c44d feat: 添加键盘快捷键支持
281dee8 test: 添加自动化测试脚本,覆盖全部测试项
ca1509a docs: 添加游戏截图和自动截图脚本
d33882e docs: 完善 README 项目文档
posted @ 2026-09-16 18:15  102401415林豪  阅读(13)  评论(0)    收藏  举报