软件工程第二次作业:利用 AIGC 完成“一箭又一箭”小游戏
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 软件工程与软件工程实践 |
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏 |
| 学号 | 102402133 |
| GitHub 仓库 | arrow-escape-game |
一、项目展示
本项目是一款使用 Python Tkinter 开发的“一箭又一箭”点击式解谜小游戏。玩家需要观察棋盘上的折线路径和箭头方向,按照正确顺序点击线段,使所有箭头安全飞出棋盘。
游戏包含开始界面、游戏界面、碰撞反馈、失败界面和胜利界面。下面展示主要运行效果。

图 1 开始界面

图 2 游戏主界面

图 3 箭头碰撞反馈

图 4 关卡失败界面

图 5 全部关卡通关界面
二、项目介绍
2.1 游戏规则
“一箭又一箭”是一款点击式箭头解谜游戏。棋盘为 7×7 点阵,每个箭头由一条可以延伸和转弯的折线路径组成,箭头尖端位于路径末端。
玩家需要观察箭头方向并按照正确顺序点击线段:
- 如果箭头前进方向上没有其他路径,整条线段会沿路径逐步收缩,并从箭头尖端向棋盘外飞出;
- 如果前进方向上存在其他箭头,线段不能飞出,并会显示碰撞提示;
- 每关有 3 次失误机会,发生碰撞时会减少一次;
- 清除当前关卡的全部线段后自动进入下一关;
- 失误次数耗尽后本关失败,可以点击“重新开始本关”恢复初始状态;
- 完成全部 3 个关卡后显示胜利界面。
2.2 游戏界面
游戏包含以下界面:
- 开始界面:显示游戏名称、玩法提示和开始按钮;
- 游戏界面:显示当前关卡、计时、剩余箭头数量和失误机会;
- 碰撞反馈:使用红色提示圈和文字提示玩家发生碰撞;
- 失败界面:提示失误次数耗尽,并允许重新开始本关;
- 胜利界面:提示玩家完成全部 3 个关卡,并可以重新挑战。
2.3 项目特色
本项目没有使用商业游戏的代码、美术素材或关卡数据。游戏中的路径由程序自行设计,第一关的 6 条折线路径恰好覆盖 7×7 棋盘的 49 个点。第二关和第三关在此基础上使用旋转和镜像方式生成不同布局。
游戏采用 Tkinter 绘制界面,使用 Python 数据类保存关卡数据,使用独立的规则引擎处理路径检测、碰撞、失误和通关状态。
三、实现思路
3.1 项目结构
项目主要由以下文件组成:
main.py:负责 Tkinter 图形界面、鼠标点击、界面切换、计时器和动画;game_logic.py:负责关卡数据、路径检测、碰撞判断、失误次数和通关状态;tests/test_game_logic.py:负责自动化测试;README.md:负责项目说明、运行方法和游戏截图。
3.2 折线路径表示
每条箭头由一个路径点序列表示。例如,一条路径可以表示为:
(0, 0) → (0, 1) → (1, 1) → (1, 2)
程序按照这些点绘制连续折线,并将最后一个点作为箭头尖端。箭头方向必须与路径最后一段保持一致,从而避免出现箭头在终点处突然 90 度或 180 度转弯的问题。
每关的路径互不重叠,第 1 关的 6 条路径共同覆盖 7×7 棋盘中的 49 个点。
3.3 路径检测方法
玩家点击某条路径后,程序首先找到该路径的箭头尖端,然后沿箭头方向逐格检查:
- 从箭头尖端的下一个棋盘点开始检查;
- 判断该位置是否被其他活动路径占用;
- 如果发现其他路径,则判定为碰撞;
- 如果一直检查到棋盘边界都没有发现阻挡,则允许该路径飞出。
这种方法能够保证已经移除的箭头不会继续阻挡其他箭头。
3.4 游戏状态管理
游戏规则通过 GameEngine 类统一管理,主要状态包括:
- playing:当前关卡进行中;
- cleared:当前关卡已经清空;
- lost:失误次数耗尽;
- active:当前棋盘上仍然存在的路径;
- mistakes_remaining:剩余失误机会。
点击成功时,从 active 中移除对应路径;发生碰撞时保留路径,只减少失误次数。
3.5 关键代码说明
3.5.1 折线路径的数据校验
文件:game_logic.py

每条箭头由一组棋盘坐标组成。程序首先检查箭头末端是否为路径最后一个点,然后检查相邻点是否只进行上下左右移动,避免出现斜线。同时,程序禁止同一条路径重复经过某个点,从而保证路径数据有效。
3.5.2 路径阻挡检测
文件:game_logic.py

玩家点击箭头后,程序按照箭头方向逐格向前检查。如果前方遇到其他路径,就返回阻挡位置;如果一直检查到棋盘边界都没有遇到其他路径,则返回 None,表示该箭头可以飞出棋盘。
3.5.3 碰撞和通关状态处理
文件:game_logic.py

如果检测到阻挡,箭头不会从活动列表中删除,并且失误次数减一。当失误次数为零时,游戏状态变为失败。如果没有发生碰撞,程序会删除当前箭头;当活动箭头全部删除后,游戏状态变为通关。
3.5.4 沿折线路径播放飞出动画
文件:main.py

动画播放时,程序根据当前帧计算路径截取位置,从箭头尾部逐渐删除已经经过的路径点,而不是将整条线段整体平移。同时,箭头头部沿最终方向继续延伸,形成线段沿自身折线路径飞出棋盘的效果。
这些关键代码共同实现了路径校验、碰撞判断、失误处理、通关判断和飞出动画等核心功能。实际开发过程中,我根据运行效果对路径数据和动画逻辑进行了人工调整。
四、AIGC 使用过程
本项目开发过程中使用了 ChatGPT/Codex 作为 AIGC 编程辅助工具。AI 主要用于项目结构设计、代码初稿生成、关卡设计、Bug 分析、界面优化和测试用例设计。AI 生成的内容均经过本人运行、检查和修改。
4.1 游戏框架与基础规则
| 子任务 | 使用的 AIGC 技术 | AI 实现或提供的内容 | 实际效果 | 人工修改 |
|---|---|---|---|---|
| 游戏框架设计 | ChatGPT/Codex | 根据作业要求设计 Tkinter 界面、游戏状态和规则引擎 | 生成了 main.py 和 game_logic.py 的初始结构 |
根据本地运行结果调整窗口布局、中文字体和按钮样式 |
| 基础规则实现 | ChatGPT/Codex | 生成方向判断、路径检测、碰撞判断、失误次数和通关逻辑 | 基础点击和碰撞功能可以运行 | 人工检查边界情况,并增加了重新开始和失败处理 |
4.2 关卡设计与规则调试
| 子任务 | 使用的 AIGC 技术 | AI 实现或提供的内容 | 实际效果 | 人工修改 |
|---|---|---|---|---|
| 关卡设计 | ChatGPT/Codex | 生成 3 个关卡的初始数据和通关顺序 | 初始关卡中发现部分路径存在相互阻挡的循环 | 通过自动化测试定位问题,重新调整路径方向和依赖关系 |
| 折线路径设计 | ChatGPT/Codex | 根据参考视频,将单格箭头改造成可以延伸和转弯的路径 | 生成了路径点序列和路径碰撞算法 | 人工检查路径是否覆盖棋盘、箭头末端是否正确,并保证第 1 关覆盖 49 个点 |
| 方向约束 | ChatGPT/Codex | 分析箭头末端 90 度和 180 度转向问题 | 找到了部分短线和错误箭头方向 | 将所有路径调整为至少 4 个点,并要求箭头方向与最后一段路径保持共线 |
4.3 界面与动画优化
| 子任务 | 使用的 AIGC 技术 | AI 实现或提供的内容 | 实际效果 | 人工修改 |
|---|---|---|---|---|
| 界面美化 | ChatGPT/Codex + 游戏参考截图 | 生成深色背景、点阵棋盘、彩色路径、计时和生命显示 | 界面风格更加接近参考游戏 | 根据实际截图调整颜色、间距、字体和窗口布局 |
| 箭头飞出动画 | ChatGPT/Codex + 游戏参考视频 | 生成箭头离开棋盘的动画代码 | 初版动画将整条折线作为整体移动 | 发现与参考视频不一致后,改为从路径尾部逐点裁剪,同时让箭头尖端沿出口方向延伸 |
| 碰撞反馈 | ChatGPT/Codex | 生成红色提示圈、文字提示和失误次数减少效果 | 可以明显显示发生碰撞 | 人工调整反馈时间和提示文字,避免连续点击造成状态错误 |
4.4 测试辅助
AI 还辅助设计了路径检测、碰撞、失误耗尽、重置、关卡可解性和棋盘覆盖测试。最终项目使用 unittest 编写了 8 项自动化测试,所有测试均通过。
AIGC 在本项目中主要承担辅助设计和代码初稿生成工作,最终的关卡选择、运行验证、问题判断和代码修改由本人完成。
五、测试过程与结果
5.1 测试环境
测试环境如下:
- 操作系统:Windows;
- Python 版本:Python 3.14;
- 图形界面库:Tkinter;
- 测试工具:Python unittest;
- 测试方式:自动化测试与人工操作测试相结合。
5.2 功能测试
| 编号 | 测试内容 | 预期结果 | 实际结果 |
|---|---|---|---|
| T01 | 点击前方没有其他路径的箭头 | 整条路径沿自身轨迹飞出棋盘并消失 | 通过,路径正常飞出并消失 |
| T02 | 点击前方存在其他路径的箭头 | 路径不能消失,失误次数减少 1 次,并显示碰撞反馈 | 通过,路径保留,失误机会减少并显示红色提示 |
| T03 | 点击位于边缘、方向朝向棋盘外的箭头 | 箭头可以正常离开棋盘,不产生越界错误 | 通过,箭头正常飞出 |
| T04 | 清除当前关卡的全部路径 | 显示通关结果并进入下一关 | 通过,关卡可以正常切换 |
| T05 | 连续碰撞直到失误次数耗尽 | 显示失败界面,并允许重新开始 | 通过,显示失败提示 |
| T06 | 点击“重新开始本关” | 当前路径和失误次数恢复初始状态 | 通过,关卡状态恢复正常 |
5.3 自动化测试
项目使用 unittest 编写了 8 项自动化测试,测试内容包括:
- 关卡是否存在有效通关顺序;
- 第 1 关是否覆盖 7×7 棋盘的 49 个点;
- 路径长度是否不少于 4 个点;
- 箭头方向是否与路径末端保持共线;
- 路径成功飞出;
- 路径发生碰撞;
- 失误次数耗尽;
- 重新开始后状态恢复。
运行命令如下:
python -m unittest discover -s tests -v
测试结果如下:
Ran 8 tests in 0.002s
OK
六、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1.5 | 2.0 | +0.5 |
| Python 与图形库学习 | 1.5 | 2.0 | +0.5 |
| 游戏界面实现 | 2.0 | 2.5 | +0.5 |
| 路径与碰撞逻辑实现 | 2.0 | 3.0 | +1.0 |
| 关卡设计 | 1.5 | 2.0 | +0.5 |
| AIGC 辅助开发 | 1.5 | 2.0 | +0.5 |
| 测试与修改 | 1.5 | 2.0 | +0.5 |
| README 与博客撰写 | 2.0 | 2.5 | +0.5 |
| 合计 | 14.5 | 18.0 | +4.5 |
七、心得体会
通过本次“一箭又一箭”小游戏的开发,我对 Python 图形界面编程、游戏逻辑设计和软件测试有了更加具体的认识。
在开发过程中,AIGC 工具对项目帮助较大。AI 协助我完成了项目结构设计、Tkinter 界面初始化、路径数据组织、箭头移动动画、碰撞检测和自动化测试代码的初稿,提高了开发效率。同时,AI 还帮助我分析了部分运行错误,并提出了关卡设计和界面优化建议。
但是,AI 生成的代码不能直接当作最终结果使用。开发初期曾出现路径之间相互阻挡、箭头整体移动而不是沿路径移动、路径过短以及箭头末端发生 90 度或 180 度转弯等问题。针对这些问题,我通过实际运行游戏、观察动画效果、编写测试用例和修改路径数据进行了多次调整,最终使关卡能够正常通关。
本次实践让我认识到,使用 AIGC 编程时,开发者仍然需要明确需求、检查代码、运行测试并进行人工修改。只有将 AI 辅助生成、实际运行验证和人工判断结合起来,才能保证程序的正确性和可用性。
通过本项目,我还学习了将界面显示、游戏规则、关卡数据和自动化测试进行分离,了解了 Git 多次提交、README 编写和项目发布的基本流程。这些经验对今后进行更复杂的软件开发具有一定帮助。

浙公网安备 33010602011771号