软件工程 第二次作业
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 202601 软件工程 - 福州大学 |
| 这个作业要求在哪里 | 2026秋软件工程个人作业(第二次) |
| 这个作业的目标 | 使用 Python 和 AIGC 完成"一箭又一箭"小游戏 |
| 学号 | 102401108 |
| GitHub 仓库 | Limy-YY/arrow-puzzle: A simple arrow elimination game built with Python and Pygame. |
项目展示
温馨提示
- 本视频已上传至 GitHub Release,若在本网页内无法播放,可直接点击 此处下载观看。
- 视频进度条可能会遮挡下方游戏界面的底部按钮,建议不要全屏播放,并将鼠标移出视频区域,进度条便会自动隐藏。
- 由于 GitHub 在国内访问可能受限,若视频加载失败或下载卡顿,建议开启网络代理后再试。
项目介绍
本项目参考微信小程序《一箭又一箭》的核心玩法,设计并实现了一款简化的箭头消除游戏。本项目不仅旨在构建一个趣味性的解谜小游戏,更是一次完整的软件工程实践:通过开发过程深入体验软件生命周期,探索 AIGC 工具在代码编写与调试中的高效应用,并熟练掌握 Git 版本控制与 GitHub 仓库的协作流程,为后续更复杂的项目开发奠定基础。
游戏规则
- 棋盘布局:游戏界面呈现一个由若干箭头组成的网格棋盘,每个箭头均指向“上、下、左、右”四个方向之一。
- 基本操作:玩家使用鼠标点击箭头,触发其向指向方向飞出的动作。
- 判定逻辑:
- 成功消除:若箭头的前进路径上直至棋盘边界均无其他箭头阻挡,该箭头将飞出棋盘并被消除。
- 碰撞惩罚:若路径上存在其他箭头阻挡,点击无效,箭头将执行碰撞反馈(如晃动或退回),并扣除一次失误机会。
- 通关条件:玩家需通过逻辑推理找到正确的点击顺序,在规定时间内且失误机会耗尽前,将当前关卡的所有箭头全部消除,方可进入下一关。
界面设计
本项目的界面设计遵循“简洁直观、功能优先”的原则,旨在降低玩家的学习成本,使其能专注于解谜逻辑。系统主要包含以下四个核心界面:
开始界面
作为游戏的入口,提供清晰的导航功能:
- Start (开始游戏):点击后默认载入第一关,直接进入闯关流程。
- Select (关卡选择):点击后进入关卡选择菜单,允许玩家自主选择关卡进行挑战。
关卡选择界面
该界面为玩家提供了灵活的进度管理功能,采用网格化布局展示所有关卡入口:
- 布局设计:界面中央以 3x4 矩阵排列关卡按钮(如 Level 1-12),每个按钮清晰标注关卡序号,视觉重心突出。
- 交互逻辑:点击任意关卡按钮即可直接跳转至对应关卡;底部设有显著的 Back (返回) 按钮,点击后可上一个界面。
游戏界面
这是游戏的核心交互区域,分为三个部分:
- 信息区:位于界面顶部,实时显示“当前关卡”、“剩余时间”、“剩余箭头数量”和“剩余失误次数”,帮助玩家掌握当前局势。
- 游戏区 :位于界面中央,展示核心的网格棋盘及箭头布局,是玩家进行操作的主要区域。
- 操作区:位于界面底部,提供“Restart (重开)”、“Select (选关)”和“Return (返回)”三个功能按钮,赋予玩家对游戏进程的完全控制权。
弹窗界面
根据游戏结束时的不同状态,设计了三种针对性的结算弹窗,提供明确的反馈与后续操作指引:
- 通关状态 (Level Complete):
- 触发条件:成功消除当前关卡所有箭头。
- 显示内容:显示“Level Complete!”字样及“通关用时”。
- 操作选项:非最后一关提供“Next (下一关)”和“Return (返回)”;最后一关显示“All Completed”,提供“Select (选关)”和“Return (返回)”。
- 失败状态 (Game Over):
- 触发条件:失误次数耗尽或时间归零。
- 显示内容:显示“Game Over”提示。
- 操作选项:提供“Retry (重试本关)”和“Return (返回)”按钮,方便玩家立即重挑战。
主要功能
本项目严格遵循作业需求文档,完整实现了所有基础功能,并进行了适度的扩展:
- 图形化用户界面:基于 Python 的
Pygame库构建了完整的游戏窗口系统,流畅切换开始菜单、游戏主界面、结算弹窗及关卡选择页四个核心视图。 - 核心玩法逻辑:实现了包含上、下、左、右四种方向的箭头判定系统,精准处理路径检测算法,实现了箭头的飞出消除与碰撞反馈机制。
- 完整游戏流程:内置了 3 个经过人工验证的可通关关卡。系统能够准确处理关卡间的逻辑流转,包括通关判定、失败判定及自动跳转。
- 交互与视觉反馈:支持鼠标点击交互,并为箭头的“碰撞受阻”设计了视觉反馈,显著提升了游戏的操作手感。
- 实时状态监控:在游戏界面顶部集成了抬头显示系统,实时渲染当前关卡数、剩余时间、剩余箭头数及失误次数,确保玩家能随时掌握游戏状态。
- 状态重置机制:实现了全局的“重新开始”功能,支持在任何游戏状态下将棋盘布局、计数器及计时器重置为初始状态,方便玩家重试。
项目特色
除了基础功能外,本项目在开发模式与架构设计上具有以下亮点:
-
AIGC 深度协同开发:本项目是人机协作的典型实践。AI 工具深度参与了从需求拆解、代码生成到 Bug 定位的全流程,显著提升了开发效率,体现了现代软件工程的新范式。
-
数据与逻辑分离:采用数据驱动的设计理念,将关卡配置(箭头坐标、方向)独立存储于 JSON 文件中。这种解耦设计使得扩展新关卡无需修改核心代码,极大地提升了系统的可维护性。
-
敏捷开发与版本控制:严格遵循增量迭代开发模式。从基础框架搭建到核心逻辑实现,再到 UI 优化,每个功能点均通过细粒度的 Git Commit 进行版本管理,保留了清晰的开发历史轨迹。
-
UI 界面优化
在基础界面之上,进一步提升了视觉表现与交互反馈:棋盘格子与按钮均添加了悬停高亮特效,鼠标移入时会有明显的视觉反馈;通关/失败弹窗增加了背景柔光特效,使弹窗内容更加突出,界面层次感更强;开始界面背景加入了动态动画特效,避免静态画面的单调感;状态栏采用图标代替纯文字显示生命值、计时器等信息,界面更加简洁直观。
-
关卡选择界面
新增独立的关卡选择界面,玩家可自由跳转至任意关卡,无需按顺序逐关推进。
-
计时功能
每关增加倒计时机制,玩家需在限定时间内消除所有箭头才能通关。计时器以图标形式显示在状态栏,时间紧迫时会有红字视觉提示,增加游戏的紧张感和挑战性。
实现思路
箭头与方向的表示
游戏的核心是一个二维棋盘,每个格子要么为空,要么放一个「带方向的箭头」。为了同时让渲染、判定和关卡生成三处逻辑复用同一套编码,方向被定义为一组整数常量:
| 常量 | 值 | 含义 |
|---|---|---|
| DIR_UP | 1 | 上 |
| DIR_DOWN | 2 | 下 |
| DIR_LEFT | 3 | 左 |
| DIR_RIGHT | 4 | 右 |
每个格子里存的就是整数常量的值,0 表示空格。
同时「方向(常量) → 位移向量(dr, dc) 」的映射用一个字典 DIRECTION_DELTAS 完成:
DIRECTION_DELTAS = {
DIR_UP: (-1, 0), # 行减 1(向上)
DIR_DOWN: ( 1, 0),
DIR_LEFT: ( 0, -1),
DIR_RIGHT: ( 0, 1), # 列加 1(向右)
}
游戏里所有「沿方向前进」的逻辑,都是拿当前坐标 (r, c) 加上对应方向的 (dr, dc) 得到下一格,这样渲染、碰撞检测、关卡生成可以共用同一套几何语义。
关卡的表示
每个关卡是 levels.json 中 levels 数组里的一个对象,字段固定,格式如下:
{
"level": 1,
"grid_size": [4, 4],
"max_failures": 3,
"arrows_left": 16,
"time_limit": 30,
"map": [
[1, 4, 1, 4],
[3, 2, 1, 4],
[2, 3, 4, 1],
[3, 2, 3, 4]
]
}
其中,map 是一个 rows × cols 的二维数组,元素就是上面定义的方向整数,代表一个方向箭头。
路径检测算法
路径检测是游戏的判定核心,本质上是回答一个问题:一个箭头沿自身方向飞出去,会不会撞上别的箭头? 本项目在箭头飞行时逐帧做碰撞检测,整个判定由四步组成。
点击箭头后,程序先记下它的起始格子 (start_row, start_col) 和方向 direction,之后每帧在 _update_moving_arrow() 里推进并判定。
① 沿方向推进位置
用本帧耗时 dt 乘上速度(600 像素/秒)得到本帧位移 move_distance,再乘方向增量(dr, dc) (定义如上文“方向的表示”一节)更新坐标:
move_distance = self.move_speed * dt # 本帧应移动的像素数
curr_x += dc * move_distance # 列方向移动
curr_y += dr * move_distance # 行方向移动
② 找到路径上第一个挡路的箭头 —— _find_blocking_cell()
这一步沿方向一格一格地「数格子」,扫到第一个非空格就把它记为「潜在碰撞目标」:
def _find_blocking_cell(self, start_row, start_col, direction):
dr, dc = self._direction_delta(direction) # 该方向对应的行/列增量
for step in range(1, max(self.rows, self.cols)):
check_r = start_row + dr * step # 第 step 格的行坐标
check_c = start_col + dc * step # 第 step 格的列坐标
if not (0 <= check_r < self.rows and 0 <= check_c < self.cols):
break # 越界 = 前方没有阻挡
if self.grid_map[check_r][check_c] != 0:
return check_r, check_c # 最近的那个箭头
return None, None # 一路畅通
思路是:用方向增量乘上步数 step,就得到沿途每一格的坐标;因为更远的箭头会被近处的挡住,所以只需关心路径上离自己最近的那一个。扫到棋盘边界(越界)都没遇到非空格,说明前方畅通,返回空值。
③ 像素级碰撞检测 —— _check_pixel_collision()
找到潜在目标后还不能直接判撞——那只能说明「同一行/列上有个箭头」,两者此刻可能还隔着很远。真正判撞的是这一步:
def _check_pixel_collision(self, moving_mask, moving_left, moving_top, target_r, target_c):
other_dir = self.grid_map[target_r][target_c] # 挡路箭头的方向
other_x, other_y = self._cell_center(target_r, target_c)
other_mask = self.arrow_masks[other_dir] # 挡路箭头的碰撞掩码
other_left = other_x - other_w // 2 # 挡路箭头的左上角坐标
other_top = other_y - other_h // 2
offset_x = int(moving_left - other_left) # 两个箭头掩码的相对偏移
offset_y = int(moving_top - other_top)
return moving_mask.overlap(other_mask, (offset_x, offset_y)) is not None
这里先说明一个概念——碰撞掩码:pygame.mask 记录的是图片里「哪些像素是不透明的」。程序在加载时已经为每个方向的箭头图片预生成了掩码。判定时,把飞行箭头和挡路箭头的掩码放在各自的真实位置,算出两者的相对偏移 (offset_x, offset_y),再用 overlap() 检查它们是否有像素重叠。只有当飞行箭头的图形真的压到挡路箭头的图形上时才返回碰撞。这样做比按格子边界提前判撞更贴近视觉,手感更真实。
④ 飞出边界判定 —— _check_offscreen()
如果箭头整体(连同自身宽高)完全越过屏幕边缘,就说明它一路上没撞到任何东西,标记为 clear(消除成功):
def _check_offscreen(self, curr_x, curr_y, w, h, direction):
arrow_top = curr_y - h // 2 # 箭头最上边
arrow_bottom = curr_y + h // 2 # 箭头最下边
if direction == DIR_UP:
return arrow_bottom < 0 # 整个箭头都越过了屏幕上边界
if direction == DIR_DOWN:
return arrow_top > SCREEN_HEIGHT
# 左、右两个方向同理
于是每帧的判定顺序是:先推进位置 → 扫出最近阻挡者 → 有阻挡就做像素重叠测试,重叠即 blocked(碰撞,扣一次失误)→ 否则检查是否完全飞出屏幕,飞出即 clear(消除,计数 +1)。碰撞时还会触发一次晃动动画,等动画播完再判断失误是否耗尽(mistake_count >= max_mistakes)而失败,避免动画播到一半就突然切状态。
AIGC使用情况
本项目在开发过程中深度应用了 AIGC 技术,覆盖了从代码生成、调试重构到 UI 设计、版本控制的全流程。部分典型使用记录如下:
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 项目基础架构搭建 | Qwen | 设计了多场景切换框架,提供了莫兰迪配色方案、窗口初始化、场景管理逻辑 | 框架结构清晰,配色柔和不刺眼,场景切换流畅 | 根据实际项目结构调整了部分常量命名和目录组织 |
| 棋盘绘制与箭头渲染 | Qwen | 实现了动态计算单元格大小、棋盘居中布局算法、PNG 箭头图标加载与缩放逻辑 | 棋盘自适应不同关卡尺寸,图标显示正常 | 调整了单元格间距和图标缩放比例以适配实际视觉效果 |
| 鼠标滚轮误触开始界面修复 | Qwen | 定位事件过滤问题,提供修复方案 | 方案正确,但因变量名不一致导致报错 | 核对代码后修正字体变量名及构造函数参数 |
| Git 版本控制指导 | Qwen | 提供了 git status、git add、git commit 的完整命令及规范的 commit message 格式 |
提交记录清晰,符合课程项目协作规范 | 简化了主体部分的说明 |
| 字体系统重构与兼容性修复 | Qwen | 协助定位 AttributeError 报错,建议将字体加载统一收口到 SceneManager | 诊断准确,但代码需适配项目结构 | 自行实现字体预加载机制,统一使用 Nunito 字体文件规避 Windows 兼容性崩溃 |
| 界面设计图生成 | Qwen | 根据文字描述生成了多版游戏界面的可视化设计图,直观展示了优化后的效果 | 生成的设计图较好地呈现了建议的视觉效果,便于对比参考 | 根据实现的难易程度以及与当前界面的改动幅度采纳了部分建议 |
| 代码拆分与模块化实现 | Claude Code | 将 1155 行单文件拆为 6 个模块的 scenes/ 包,生成 ui.py 的 Button 组件与 load_font(),在 settings.py 集中常量 |
结构清晰,main.py 入口零改动,功能等价 |
删除了冗余的代码和注释 |
测试结果
本次测试对箭头方向解谜游戏的各个功能模块进行了全面验证,涵盖核心玩法、界面交互、按钮逻辑、关卡生成等多个方面。测试采用手动功能测试与自动化验证相结合的方式,确保游戏在不同场景下均能正常运行。
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头沿指定方向匀速飞出屏幕,格子清空,剩余箭头数 -1 | ✅ |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头与阻挡者发生像素级碰撞后触发晃动动画,失误计数 +1,箭头保留在原位 | ✅ |
| T03 | 点击位于边界且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 箭头飞出屏幕边界后判定为 clear,无报错,计数正常更新 | ✅ |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 最后一个箭头飞出后弹出通关界面,显示「下一关」和「重玩」按钮 | ✅ |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 失误计数达到上限后弹出失败界面,点击「重新开始」可重置本关 | ✅ |
| T06 | 游戏中点击重新开始 | 箭头布局和失误次数恢复 | 棋盘重置为初始状态,失误次数、计时器重置 | ✅ |
| T07 | 关卡计时器归零 | 弹出失败界面 | 倒计时到 0 后自动弹出失败弹窗,禁止继续操作 | ✅ |
| T08 | 弹窗状态下点击底部按钮 | 按钮应被禁用,不响应点击 | 通关/失败弹窗显示期间,关卡选择和重玩按钮点击无响应 | ✅ |
| T09 | 通关界面显示内容 | 显示标题、计时和 return、next 按钮 | 通关弹窗正确显示标题、本关用时,以及 return 和 next 按钮 | ✅ |
| T10 | 失败界面显示内容 | 显示标题、副标题和 return、retry 按钮 | 失败弹窗正确显示标题和副标题,以及 return 和 retry 按钮 | ✅ |
| T11 | 最后一关通关后的底部按钮 | 显示 return 和 select,而非 return 和 next | 最后一关通关后底部按钮正确显示为 return 和 select | ✅ |
| T12 | 点击 next 按钮 | 自动加载下一关 | 点击 next 后正确加载下一关,棋盘、计时器、生命值均重置 | ✅ |
| T13 | 点击 return 按钮 | 返回主菜单 | 点击 return 后正确返回主菜单,游戏状态清空 | ✅ |
| T14 | 关卡选择界面点击 back | 返回上一个界面 | 从关卡选择界面点击 back 正确返回主菜单;全通关时点击 back 直接 return 返回主菜单 | ✅ |
| T15 | 关卡生成器生成的关卡可解性 | 所有生成的关卡均可解 | 连续生成 12 个关卡,全部通过贪心模拟和拓扑排序双重验证,无死锁关卡。经过人工游玩验证,确实可解。 | ✅ |
| T16 | 鼠标滚轮操作 | 不触发任何游戏逻辑 | 滚轮事件被正确拦截,无箭头误触或界面异常。 | ✅ |
所有 17 个测试用例均通过验证。测试结果表明:
- 核心玩法:箭头的点击、飞行、碰撞检测逻辑正确,边界情况处理无误。
- 界面交互:通关界面、失败界面的标题、副标题、按钮显示符合预期;弹窗状态下底部按钮正确禁用,无状态混乱。
- 界面跳转:next、retry、return、back 等按钮的跳转逻辑正确,游戏状态清空与重置均正常。
- 关卡生成:关卡生成器输出的棋盘 100% 可解,无死锁或不可通关的情况。
综上所述,游戏各模块功能完整、运行稳定,满足设计要求。
PSP表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) | 对应提交记录 |
|---|---|---|---|---|
| 项目初始化与环境搭建 | 0.5 | 0.5 | 0 | a9d6b07 初始化项目并搭建 Pygame 基础框架 3bf7d43 添加 .gitignore 325e3ce 移除 Python 缓存文件 |
| 核心玩法实现(棋盘绘制 + 路径检测) | 3 | 4 | +1 | 7f6c49b 完成游戏棋盘网格和初始箭头的静态绘制 2ff49f9 实现箭头点击时的路径检测与消除逻辑 de09497 增加失误次数统计与碰撞视觉反馈 |
| UI 美化与弹窗系统 | 4 | 6 | +2 | 13eabb4 美化开始页面 cf24b06 新增通关/失败弹窗界面 f6062c4 美化游戏通关弹窗界面 f82ab76 美化弹窗界面 a744261 美化游戏界面 UI 1739b4d 美化棋盘界面 |
| 交互优化与 Bug 修复 | 2 | 3.5 | +1.5 | 73121e8 修复鼠标滚轮误触 e5e965a 修复返回按钮状态重置 faf89a1 修复步数计数 bug 09186ba 修复快速点击导致箭头无法飞出 184383f 弹窗状态下禁用底部按钮交互 |
| 动画与特效实现 | 3 | 4 | +1 | 8f2f31c 增添箭头移动动画 20acfb7 优化箭头飞出动画与碰撞检测 4805ee7 增加通关界面光束特效 b6bbac4 重构失败弹窗光效 |
| 关卡系统与计时器 | 2 | 4 | +2 | bf82eee 新增关卡选择场景 4ae4b6e 添加关卡计时器功能 c3ad74a 更新 3 个关卡布局 b19b10c 新增关卡生成器,将关卡数增加到 12 个 |
| 代码重构与模块化 | 0.5 | 2 | +1.5 | 0ec595a 优化字体加载机制 843f361 重构箭头路径检测逻辑 1193504 拆分 scenes.py 为 scenes 包 a65df04 优化通关/失败弹窗按钮逻辑 34 重构失败弹窗光效 |
| README 与文档撰写 | 3 | 5 | +2 | (编码外时间,无对应提交) |
| 合计 | 18 | 29 | +11 | 共 37 条提交,跨越 4 天 |
心得体会
- 增量迭代与版本控制的价值
通过本次作业,我完整体验了增量迭代的开发过程。Git 版本控制让我能够在某条改进路线走入死胡同时,快速回退到上一个可用版本,再尝试其他方向。开发就像一场探索——每次在保持原有功能正常运行的前提下增添新特性,逐步逼近最终目标。这种「小步快跑、随时可回退」的节奏,远比一次性写完再调试要稳妥得多。
- AI 赋能开发:从想法到代码的捷径
本次作业也让我切实感受到了 AI 工具的强大,体验了所谓的 Vibe-coding:给 AI 明确的指令,让它帮我实现设想。没有思路时可以问 AI,没有界面美化方案时可以让 AI 生成效果图,AI 的参与让开发门槛大幅降低。当今时代,学会用 AI 已经成为高效开发的必备能力——只有想不到的,没有做不到的。
- AI 的局限性与人工审查的必要性
但 AI 并非万能。每次 AI 给出的改进建议,都需要自己进行代码逻辑审查,判断其改进方向是否合理。如果一味当 AI 的「搬运工」,很容易被 AI 牵着鼻子走,尤其在代码多次改动陷入死胡同时更难脱身。AI 是助手,不是决策者——最终对代码质量负责的仍然是开发者本人。
- 提示词设计:与 AI 高效协作的关键
要更好地利用 AI,需要学会设计清晰合理的提示词,让 AI 准确理解需求,达到「设想统一」。在让 AI 写代码之前,先一起讨论方案、明确可行路径,才能减少返工和 bug。模糊的指令只会换来模糊的代码,而精确的需求描述才能换来符合预期的产出。
- 代码结构与可维护性
本次作业也让我意识到合理规划代码结构的重要性。将代码分散到多个文件、类和方法中,而不是集中在一个巨型文件里,不仅能增强复用性和可拓展性,也更方便纠错和后续修改。保持 KISS(Keep It Simple, Stupid)原则,让每个模块职责单一、边界清晰,是长期维护的基础。
- AI 工具的选择:Agent vs 客户端 LLM
本次作业中,我还对比了两种 AI 协作方式的效果:
- 客户端 LLM:开发初期为了体验「一步步完善项目」的感觉,我选择用客户端 LLM 作为指导。实际效果尚可,编写的代码能够实现功能要求,但代码结构不够理想,生成的关卡也大多存在可解性问题。
- Agent 工具:后期改用 Agent 进行代码结构优化和关卡生成,效果明显提升。Agent 能够直接访问项目文件夹下的代码文件,对项目背景有更完整的理解,编写的代码结构更合理,关卡生成器也能正确实现可解性验证,经手动测试确实有效。
这次对比让我认识到:不同 AI 工具的性能差异确实明显,选择合适的工具能事半功倍。对于需要项目上下文理解的任务,Agent 是更优的选择。
项目改进方向
受限于开发时间,当前版本主要实现了核心玩法与基础交互,整体更偏向轻量娱乐体验。以下是后续迭代中可考虑实现的改进方向:
双模式选择
在开始界面提供「闯关模式」和「自由模式」两种入口:
- 闯关模式:沿用当前版本的关卡推进逻辑,增加「关卡解锁」机制——通过上一关后方可解锁下一关,关卡选择界面仅显示已解锁关卡,增强通关成就感。
- 自由模式:基于现有的关卡生成器提供用户交互界面,支持自定义棋盘大小、最大允许失误次数、通关时间限制及箭头布局难度(简单 / 普通 / 困难)。同时支持批量生成(一次设定参数,通关后点击 Next 自动生成下一关)与随时调整方案(游玩中途可修改参数并重新生成关卡),大幅提升可玩性。
玩法扩展
- 开局空格布局:支持非满格开局,预设部分空格,增加路径规划难度。同时增加箭头预测功能——鼠标悬停某格时,高亮显示该箭头的飞行路径,降低操作门槛。
- 连锁反应机制:消除一个箭头后,相邻同方向箭头自动触发联动,增加解谜的策略深度。
视觉优化
- 主题配色:不同关卡采用不同主题色区分,并支持暗色模式切换,适配不同使用场景。
- 音效系统:添加点击反馈音、碰撞提示音、通关庆祝音效及背景音乐,增强沉浸感。
功能完善
- 本地存档系统:使用 JSON 或 SQLite 记录通关进度,支持断点续玩;同时记录最佳用时与失误次数,为游戏增加竞赛趣味。
附录
资源引用列表
本项目在开发过程中使用了以下第三方资源,特此声明并感谢原作者的分享:
-
字体资源:
资源名称 来源网站 授权协议 链接 Nunito Google Fonts SIL Open Font License 1.1(OFL 1.1) https://fonts.google.com/specimen/Nunito Nunito 是一款由 Vernon Adams 设计、Jacques Le Bailly 扩展的圆润无衬线字体系列,支持免费商用、修改和分发。
-
图标素材
资源类型 用途说明 来源 PNG 图标 箭头方向图标、生命值图标、计时器图标、关卡标识等 UI 元素 <阿里巴巴矢量图标库> 以上图标均遵循 iconfont 平台相关授权协议,感谢各位设计师的开源分享。
Git Commit 记录
本项目采用细粒度的增量迭代开发模式,所有功能均通过 Git 进行版本管理。从基础框架搭建到核心逻辑实现,再到 UI 优化与关卡扩展,完整记录如下:
阶段一:项目初始化与基础框架
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 1 | a9d6b07 |
chore | 初始化项目并搭建 Pygame 基础框架 |
| 2 | 3bf7d43 |
chore | 添加 .gitignore 忽略 Python 缓存文件 |
| 3 | 325e3ce |
chore | 从版本控制中移除 Python 缓存文件 |
阶段二:核心游戏逻辑实现
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 4 | 7f6c49b |
feat | 完成游戏棋盘网格和初始箭头的静态绘制 |
| 5 | 2ff49f9 |
feat | 实现箭头点击时的路径检测与消除逻辑 |
| 6 | de09497 |
feat | 增加失误次数统计与碰撞视觉反馈 |
| 7 | cf24b06 |
feat | 新增通关/失败弹窗界面 |
阶段三:关卡优化与 Bug 修复
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 8 | c3ad74a |
fix | 更新 3 个关卡的布局 |
| 9 | f623ddc |
fix | 调整网格中箭头的显示大小 |
| 10 | e5e965a |
fix | 点击返回按钮时游戏恢复初始状态 |
| 11 | 0ec595a |
refactor | 优化字体加载机制并修复初始化顺序错误 |
阶段四:UI 美化与交互优化
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 12 | 13eabb4 |
feat | 美化开始页面(背景设计 + 字体更改) |
| 13 | 73121e8 |
fix | 修复开始页面鼠标滚轮误触切换场景及 scene_manager 引用错误 |
| 14 | 1739b4d |
feat | 美化棋盘界面 |
| 15 | a744261 |
feat | 美化游戏界面 UI |
阶段五:动画效果与逻辑重构
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 16 | 843f361 |
refactor | 重构箭头路径检测逻辑,为移动动画做准备 |
| 17 | 8f2f31c |
feat | 增添箭头移动动画 |
| 18 | 20acfb7 |
feat | 优化箭头飞出动画与碰撞检测逻辑 |
| 19 | faf89a1 |
fix | 修复箭头飞出后步数计数不减少的 Bug |
阶段六:弹窗系统完善
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 20 | a65df04 |
refactor | 优化通关/失败弹窗按钮逻辑 |
| 21 | 3e01549 |
feat | 实现全通关特殊弹窗 |
| 22 | f6062c4 |
feat | 美化游戏通关弹窗界面 |
阶段七:关卡选择与场景管理
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 23 | bf82eee |
feat | 新增关卡选择场景并更新 StartScene |
| 24 | 38fc263 |
feat | 优化 GameScene 全通关弹窗按钮交互 |
| 25 | fa3c6a6 |
feat | 优化 GameScene 底部按钮为三按钮布局 |
| 26 | f82ab76 |
feat | 美化弹窗界面 |
| 27 | 184383f |
fix | 弹窗状态下禁用底部按钮交互与视觉反馈 |
| 28 | 49e5961 |
feat | 优化关卡选择界面返回逻辑 |
阶段八:交互细节与计时功能
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 29 | 36fa75f |
feat | 新增游戏界面鼠标悬停阴影与点击发射箭头 |
| 30 | 4ae4b6e |
feat | 添加关卡计时器功能 |
阶段九:最终优化与关卡扩展
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 31 | b7b82c4 |
feat | 优化全通关页面按钮设计 |
| 32 | 4805ee7 |
feat | 增加通关界面的光束特效 |
| 33 | 3147141 |
feat | 优化通关弹窗副标题排版与字体样式 |
| 34 | b6bbac4 |
refactor | 重构失败弹窗光效 |
| 35 | 09186ba |
fix | 修复快速点击导致箭头无法飞出的问题 |
| 36 | 1193504 |
refactor | 拆分 scenes.py 为 scenes 包 |
| 37 | b19b10c |
feat | 新增关卡生成器,将关卡数增加到 12 个 |
阶段十:文档完善
| 序号 | Commit | 类型 | 提交说明 |
|---|---|---|---|
| 38 | 2094669 |
docs | 更新 README(简介/环境/运行/操作说明/截图/关卡生成用法) |
说明:以上 38 条提交记录展示了从基础框架搭建、核心逻辑实现、UI 美化、关卡扩展到最终文档完善的完整开发历程。完整提交历史可通过
git log命令查看,或访问项目仓库的 Commits 页面。
类型说明
| 类型 | 含义 |
|---|---|
feat |
新功能开发 |
fix |
Bug 修复 |
refactor |
代码重构(不改变功能,优化结构) |
chore |
构建/工具类杂项(不影响业务逻辑) |

浙公网安备 33010602011771号