软件工程第二次作业:利用 AIGC 完成“一箭又一箭”小游戏

项目 内容
这个作业属于哪个课程 软件工程与软件工程实践
这个作业要求在哪里 作业要求
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏
学号 102402133
GitHub 仓库 arrow-escape-game

一、项目展示

本项目是一款使用 Python Tkinter 开发的“一箭又一箭”点击式解谜小游戏。玩家需要观察棋盘上的折线路径和箭头方向,按照正确顺序点击线段,使所有箭头安全飞出棋盘。

游戏包含开始界面、游戏界面、碰撞反馈、失败界面和胜利界面。下面展示主要运行效果。
image

图 1 开始界面

image

图 2 游戏主界面

image

图 3 箭头碰撞反馈

image

图 4 关卡失败界面

image

图 5 全部关卡通关界面

二、项目介绍

2.1 游戏规则

“一箭又一箭”是一款点击式箭头解谜游戏。棋盘为 7×7 点阵,每个箭头由一条可以延伸和转弯的折线路径组成,箭头尖端位于路径末端。

玩家需要观察箭头方向并按照正确顺序点击线段:

  1. 如果箭头前进方向上没有其他路径,整条线段会沿路径逐步收缩,并从箭头尖端向棋盘外飞出;
  2. 如果前进方向上存在其他箭头,线段不能飞出,并会显示碰撞提示;
  3. 每关有 3 次失误机会,发生碰撞时会减少一次;
  4. 清除当前关卡的全部线段后自动进入下一关;
  5. 失误次数耗尽后本关失败,可以点击“重新开始本关”恢复初始状态;
  6. 完成全部 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 路径检测方法

玩家点击某条路径后,程序首先找到该路径的箭头尖端,然后沿箭头方向逐格检查:

  1. 从箭头尖端的下一个棋盘点开始检查;
  2. 判断该位置是否被其他活动路径占用;
  3. 如果发现其他路径,则判定为碰撞;
  4. 如果一直检查到棋盘边界都没有发现阻挡,则允许该路径飞出。

这种方法能够保证已经移除的箭头不会继续阻挡其他箭头。

3.4 游戏状态管理

游戏规则通过 GameEngine 类统一管理,主要状态包括:

  • playing:当前关卡进行中;
  • cleared:当前关卡已经清空;
  • lost:失误次数耗尽;
  • active:当前棋盘上仍然存在的路径;
  • mistakes_remaining:剩余失误机会。

点击成功时,从 active 中移除对应路径;发生碰撞时保留路径,只减少失误次数。

3.5 关键代码说明

3.5.1 折线路径的数据校验

文件:game_logic.py

image

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

3.5.2 路径阻挡检测

文件:game_logic.py

image

玩家点击箭头后,程序按照箭头方向逐格向前检查。如果前方遇到其他路径,就返回阻挡位置;如果一直检查到棋盘边界都没有遇到其他路径,则返回 None,表示该箭头可以飞出棋盘。

3.5.3 碰撞和通关状态处理

文件:game_logic.py

image

如果检测到阻挡,箭头不会从活动列表中删除,并且失误次数减一。当失误次数为零时,游戏状态变为失败。如果没有发生碰撞,程序会删除当前箭头;当活动箭头全部删除后,游戏状态变为通关。

3.5.4 沿折线路径播放飞出动画

文件:main.py

image

动画播放时,程序根据当前帧计算路径截取位置,从箭头尾部逐渐删除已经经过的路径点,而不是将整条线段整体平移。同时,箭头头部沿最终方向继续延伸,形成线段沿自身折线路径飞出棋盘的效果。

这些关键代码共同实现了路径校验、碰撞判断、失误处理、通关判断和飞出动画等核心功能。实际开发过程中,我根据运行效果对路径数据和动画逻辑进行了人工调整。

四、AIGC 使用过程

本项目开发过程中使用了 ChatGPT/Codex 作为 AIGC 编程辅助工具。AI 主要用于项目结构设计、代码初稿生成、关卡设计、Bug 分析、界面优化和测试用例设计。AI 生成的内容均经过本人运行、检查和修改。

4.1 游戏框架与基础规则

子任务 使用的 AIGC 技术 AI 实现或提供的内容 实际效果 人工修改
游戏框架设计 ChatGPT/Codex 根据作业要求设计 Tkinter 界面、游戏状态和规则引擎 生成了 main.pygame_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 编写和项目发布的基本流程。这些经验对今后进行更复杂的软件开发具有一定帮助。

posted @ 2026-09-20 17:19  十月有什么呢  阅读(14)  评论(0)    收藏  举报