一箭又一箭(计时加分威力加强手动校验有解版)
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏 |
| 学号 | <072308214> |
| GitHub 仓库 | https://github.com/WetDryGarbage/Trash-bim |
| 子任务 | 借助何种 AIGC 技术 |
项目展示
项目介绍
1. 游戏规则
本游戏是一款点击式箭头解谜游戏。玩家需要观察箭头的方向,并按照合理的顺序点击箭头。
- 如果箭头前方没有其他箭头阻挡,它会飞出棋盘并消失。
- 如果箭头前方有其他箭头阻挡,它无法飞出,并会触发碰撞反馈(箭头抖动并变红),同时扣除一次失误机会。
- 清空当前关卡所有箭头即可通关进入下一关;失误次数(上限3次)耗尽则游戏失败。
2. 界面设计
- 游戏采用深色背景(深灰蓝色),减少视觉疲劳。
- 四种方向箭头分别对应四种颜色:上(青色)、下(红色)、左(绿色)、右(黄色),方便玩家辨认。
- 界面左上角显示当前关卡、剩余箭头和失误次数;右上角有“重新开始”按钮和实时计时器。
- 界面简洁,布局清晰,游戏内包含开始界面、进行中界面和通关/失败结算界面。
3. 主要功能和特色
- 图形化交互:支持鼠标点击操作,能够精准判断点击位置和箭头。
- 路径检测算法:基于二维数组的行列遍历,精准判断四个方向是否存在阻挡。
- 碰撞视觉反馈:点错时,箭头会左右抖动并短暂变红,给予玩家明显的视觉反馈。
- 多关卡切换:内置了 3 个可通关的关卡数据。
- (特色)全局计时机制:记录玩家从开始到通关七关所需的总时间,并在最终通关时显示用时。
1. 开始界面
<
2. 游戏进行中界面
<
3. 通关结算界面
<
4. 七关更新以及新增评价机制
<

GitHub 多次提交记录

*(### ✨ 新增功能
- 关卡扩充至 7 关:前 3 关手工设计,后 4 关使用“外围优先”算法自动生成,保证每关都有解。
- 全局计时器:从开始游戏到通关第 7 关,全程记录时间,最终显示总用时。
- 评级系统:根据通关总时长自动评定 S / A / B / C 四个等级。
- 可视化“重新开始”按钮:代替原来的键盘 R 键,避免中文输入法干扰。
🐛 修复与优化
- 修复路径检测越界 Bug:向上检测时循环条件改为倒序遍历
range(row - 1, -1, -1)。 - 修复关卡死锁问题:改用“外围优先”算法,从逻辑上杜绝了箭头互相卡死的情况。
- 修复中文乱码:将字体由默认字体修改为
simhei,确保界面中文正常显示。 - 优化碰撞动画:点错时箭头抖动并变红,视觉反馈更清晰。
🤖 AIGC 使用说明
本项目在开发过程中使用了 DeepSeek 作为辅助工具,主要用于:
- 提供 Pygame 图形绘制与事件循环的代码框架;
- 提供路径检测函数的逻辑框架;
- 提供计时器与评级算法的代码思路。
所有 AI 生成的代码均经过本人实际运行、测试与修改,确保逻辑正确、可正常运行。AI 生成的原始关卡数据存在死锁问题,已由本人重新设计生成算法并逐一试玩验证。
📁 文件说明
test1.py:游戏核心源代码。README.md:项目说明文档。
测试状态:全部 7 个关卡均已本人实际试玩通关,无死锁、无越界错误。)*
实现思路
1. 数据表示
- 关卡数据:使用 4x4 的二维数组
LEVELS存储关卡。0代表空,1代表向上,2代表向下,3代表向左,4代表向右。 - 坐标转换:通过
GRID_OFFSET_X + col * CELL_SIZE把数组的行列坐标转换为屏幕上的像素坐标,实现点击位置和棋盘格子的映射。
2. 路径检测方法(核心)
路径检测的核心是 check_collision 函数。针对四个方向,使用 for 循环从当前格子出发,沿着方向遍历数组。
以“向上”检测为例:
# 检查上方是否有阻挡
for r in range(row - 1, -1, -1): # 从当前行的上一行开始,倒序遍历到边界0
if board[r][col] != 0:
return True # 有阻挡
return False # 无阻挡
| :--- | :--- | :--- | :--- | :--- |
| **1. 游戏框架与界面搭建** | DeepSeek | 提供了 Pygame 初始化窗口、主循环、事件监听以及基础 4x4 网格绘制和四色方向箭头绘制代码。 | 框架可运行,但 Pygame 默认字体无法显示中文,箭头坐标需硬编码调整。 | 手动将字体改为 `simhei`(黑体)以显示中文,并调整了 `CELL_SIZE` 等常量使棋盘居中。 |
| **2. 路径检测与鼠标点击** | DeepSeek | 生成了 `check_collision` 函数,遍历二维数组判断四个方向的阻挡。并提供了鼠标坐标转格子坐标的公式。 | **向上检测时出现越界错误**,循环条件无法正确遍历到边界。 | 修改了循环边界条件,向上检测改为 `range(row - 1, -1, -1)`,完美修复越界 Bug。 |
| **3. 关卡设计与死锁测试** | DeepSeek | 按要求生成了关卡二维数组。 | **生成的关卡存在严重的“死锁”布局**。AI 仅随机生成,未考虑逻辑闭环,导致无解。 | 手工推演并设计前 3 关数据,确保有解;后 4 关采用“外围优先”算法生成。 |
| **4. 状态管理与重开机制** | DeepSeek | 建议引入 `game_state` 管理四种状态,并提供深拷贝数据用于重置。 | 逻辑正确。但“按 R 键重开”功能**因中文输入法干扰而经常失效**。 | 去掉了键盘 R 键逻辑,改为用 `pygame.Rect` 绘制可视化的“重新开始”按钮,纯鼠标点击,解决干扰问题。 |
| **5. 计时与评级机制(创意拓展)** | DeepSeek | 提供 `time.time()` 记录时间,并转换为 `mm:ss` 格式渲染,通关第 7 关时冻结并显示总用时;提供基于用时区间的评级算法。 | 完美实现。刚开始计时器刷新的位置和 UI 元素有重叠,显得拥挤。 | 把计时器调整到了“重新开始”按钮正下方,并用黄色高亮显示;根据 7 关的合理时长重新设定了 S/A/B/C 评级阈值。 |
| **6. 扩展关卡与死锁修复** | DeepSeek | 提供了 `generate_solvable_level` 生成算法,使用“从外向内”的填充思路,从逻辑上保证生成的每一关都有解。 | AI 生成逻辑正确,但生成结果每次不同,无法预知具体布局。 | 我人工反复试玩验证了 7 个关卡,通过“优先消除外围箭头”的口诀成功通关,并确认了游戏内不会再出现死锁。 |
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
| :--- | :--- | :--- | :--- | :--- |
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头消失,剩余箭头数-1 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头抖动变红,失误+1 | 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 箭头正常飞出消失 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 弹出“通关”遮罩,点击进入下一关 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 弹出“失败”遮罩,提示点击重开 | 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 棋盘重置,失误次数清零 | 通过 |
| T07 | 通关第 7 关 | 显示总用时和评级 | 冻结时间,显示 S/A/B/C 评级 | 通过 |
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
| :--- | :--- | :--- | :--- |
| 需求分析与游戏设计 | 1 | 1.5 | +0.5 |
| Python 与图形库学习 | 2 | 3 | +1 |
| 游戏界面实现 | 2 | 2.5 | +0.5 |
| 路径与碰撞逻辑实现 | 2 | 3 | +1 |
| 关卡设计 | 1 | 2 | +1 |
| AIGC 辅助开发 | 1 | 2 | +1 |
| 测试与修改 | 1 | 2.5 | +1.5 |
| README 与博客撰写 | 1 | 1.5 | +0.5 |
| **合计** | **11** | **18** | **+7** |



浙公网安备 33010602011771号