软件工程第二次个人作业:利用 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 对需求拆解、重复代码和测试框架很有帮助,但生成结果不能直接视为正确答案。关卡是否真的可解、边界箭头是否正常、撤销是否恢复正确状态,都需要通过测试和实际运行确认。

posted @ 2026-09-21 17:26  王龙滨  阅读(17)  评论(0)    收藏  举报