软件工程第二次个人作业:利用 AIGC 完成“一箭又一箭”小游戏
作业信息
| 项目 | 内容 |
|---|---|
| 课程 | 2026 秋软件工程个人作业(第二次) |
| 作业要求 | 利用 AIGC 完成“一箭又一箭”小游戏 |
| 作业目标 | 使用 Python 和 AIGC 完成可运行、可测试的基础点箭头小游戏 |
| 学号 | 112401430 |
| GitHub 仓库 | wanglong2006/one-arrow-after-another |
| 使用技术 | Python 3、Tkinter、unittest |
一、项目展示
本项目命名为“一箭又一箭”,使用 Python 标准库 Tkinter 绘制界面,不使用原游戏的代码、素材、音效或关卡。当前版本实现了基础四方向单格箭头玩法,并增加了选关、计时、得分、星级、提示、撤销、AI 自动解题和本地进度保存等功能。
以下截图均由程序实际运行后截取,原图分辨率为 1016×759:
开始界面

游戏界面

碰撞反馈

通关界面

关卡选择界面

二、需求分析与游戏规则
棋盘由若干行和若干列组成,每个非空格放置一个单格箭头,方向只有上、下、左、右四种。点击箭头后,程序沿其方向逐格检查到边界:
- 路径上没有其他箭头时,箭头飞出棋盘并从棋盘状态中删除;
- 路径上存在其他箭头时,箭头保留,播放晃动和变色反馈,并消耗一次失误机会;
- 清除当前关卡全部箭头后进入通关结算,并可进入下一关;
- 失误机会耗尽后进入失败界面,可以重新开始当前关卡。
程序包含开始界面、选关界面、游戏界面以及通关/失败界面。游戏界面显示当前关卡、剩余箭头数量、剩余失误次数、计时、得分和重新开始按钮。
三、功能设计
1. 关卡与流程
目前设计了 5 个固定关卡,棋盘规模和箭头数量逐步增加。每个关卡载入时会检查坐标是否越界、是否重复,并由求解器验证存在完整合法解序;实际通关顺序不是凭肉眼猜测,而是先用程序验证,再逐关试玩。
2. 计时、得分和星级
每关开始时记录时间。得分从基础分开始,按照用时、失误、提示和撤销次数扣分;使用 AI 自动解题会额外扣分。无失误、未使用辅助并在规定时间内完成时可获得 3 星,辅助较少时获得 2 星,完成但辅助较多时获得 1 星。星级只用于记录挑战成绩,不改变基础规则。
3. 提示、撤销、AI 求解与存档
“提示一步”会高亮一支当前合法箭头;“撤销上步”恢复点击前的箭头布局和失误次数;“AI 自动解题”按求解器得到的合法顺序逐步点击。辅助功能会扣分,AI 求解最多获得 1 星。程序还会保存已解锁关卡、各关最高分和最高星级,存档不可写时仍可正常游玩。
四、核心实现
1. 数据表示
棋盘用字典保存,键为 (row, col),值为方向字符串;方向统一用向量表示,因此四个方向可以共用一套路径检测逻辑。
DIRECTION_VECTORS = {
"up": (-1, 0), "down": (1, 0),
"left": (0, -1), "right": (0, 1),
}
arrows = {(1, 0): "left", (2, 3): "up"}
2. 路径检测
从相邻格开始逐格扫描,遇到其他箭头立即判定阻挡;走出棋盘仍未遇到箭头则判定畅通。边界箭头不需要单独特判,例如第 0 行朝上的箭头第一次检查就出界。
def path_is_clear(arrows, row, col, direction, grid_size):
dr, dc = DIRECTION_VECTORS[direction]
row, col = row + dr, col + dc
while 0 <= row < grid_size and 0 <= col < grid_size:
if (row, col) in arrows:
return False
row, col = row + dr, col + dc
return True
3. 状态先于动画
点击后先完成规则判断,再启动动画。成功时先从棋盘字典删除箭头,再绘制飞出效果;失败时保留箭头、减少失误次数,再播放晃动和变色。动画期间暂时锁定重复点击,避免一次操作被重复扣分。
4. 关卡可解性
删除箭头只会减少阻挡,因此求解器每轮寻找一个当前路径畅通的箭头并删除它。如果剩余箭头存在但没有任何可删除箭头,则说明局面锁死。当前 5 个关卡均通过完整解序检查。
五、AIGC 使用过程与人工验证
本项目使用 OpenAI Codex 作为 Coding Agent,辅助需求拆解、Tkinter 界面初稿、路径算法、关卡构造、存档逻辑和测试用例设计。AIGC 只提供候选实现,最终代码经过本人运行、测试和修改。
| 代表性过程 | 我的请求 | AI 输出与实际效果 | 人工修改和验证 |
|---|---|---|---|
| 需求拆解 | 将作业要求拆成基础规则、界面、关卡、异常流程 | 给出模块划分和验收清单 | 对照作业原文逐项补齐开始、游戏、结果界面 |
| 路径算法 | 设计四方向单格箭头的统一判定 | 给出方向向量和逐格扫描函数 | 增加边界、阻挡、身后箭头不影响等测试 |
| 界面初稿 | 用 Tkinter Canvas 完成棋盘和箭头绘制 | 给出按钮、状态栏和动画框架 | 根据实际运行调整布局、颜色、碰撞反馈时间 |
| 关卡与求解器 | 生成多关卡并验证可以通关 | 给出固定布局和合法解序搜索 | 调整位置,运行求解器并逐关试玩 |
| 测试与文档 | 生成 unittest 框架和博客提纲 | 给出 T01-T06 测试思路 | 修改断言,实际运行 8 项测试并补充限制说明 |
我特别检查了两个风险:扩展功能不能改变单格箭头的基础规则;关卡不能只凭肉眼判断可解,必须通过完整解序验证。
六、测试结果
测试命令:
python -m unittest tests.test_game -v
当前测试结果为 8 项全部通过:
| 编号/类别 | 验证内容 | 结果 |
|---|---|---|
| T01 | 路径畅通时箭头飞出并消失 | 通过 |
| T02 | 路径被挡时箭头保留、失误次数减 1 | 通过 |
| T03 | 边界箭头可直接飞出且不越界报错 | 通过 |
| T04 | 清空全部箭头后进入通关/下一关流程 | 通过 |
| T05 | 失误次数耗尽后进入失败界面 | 通过 |
| T06 | 重新开始恢复初始布局和失误次数 | 通过 |
| 其他 | 关卡可解性、撤销、提示、AI、存档 | 通过 |
已在本机完成自动化验证,并生成开始、游戏、碰撞、通关和选关界面的完整运行截图。发布前仍会由本人进行最终逐关试玩。
七、运行方式
项目使用 Python 标准库 Tkinter,不需要安装 Pygame 或其他第三方包。下载源码后运行:
python one_arrow_after_another.py
操作方式:鼠标点击棋盘箭头尝试发射;R 重新开始当前关;Esc 返回开始界面;也可以使用界面上的提示、撤销和 AI 自动解题按钮。项目源码、README、测试文件和完整运行截图已上传至 GitHub 仓库。
八、PSP 估算与实际记录
| 任务 | 预计耗时/小时 | 实际耗时/小时 |
|---|---|---|
| 需求阅读与玩法设计 | 0.8 | 1.0 |
| Tkinter 界面实现 | 1.5 | 2.0 |
| 路径判定与游戏状态 | 1.0 | 1.2 |
| 关卡设计与可解性验证 | 0.8 | 1.0 |
| 计时、评分、辅助与存档 | 1.2 | 1.5 |
| AIGC 辅助开发与修改 | 1.0 | 1.2 |
| 测试、调试和文档 | 1.0 | 1.3 |
| 合计 | 7.3 | 9.2 |
实际耗时增加的主要原因是界面状态较多,加入辅助功能后需要重新检查按钮状态、动画锁定和存档边界。
九、心得体会
这次作业让我认识到,“点击箭头并判断能不能出去”虽然规则简单,但实现时必须明确检查起点、边界、阻挡后的恢复状态,以及动画期间是否允许再次点击。项目中最重要的设计是把规则层、状态层和界面层分开:路径函数只回答是否畅通,游戏状态函数负责改变数据,Tkinter Canvas 负责显示。这样调整按钮样式或动画时间不会改变核心判定。
AIGC 对需求拆解、重复代码和测试框架很有帮助,但生成结果不能直接视为正确答案。关卡是否真的可解、边界箭头是否正常、撤销是否恢复正确状态,都需要通过测试和实际运行确认。
浙公网安备 33010602011771号