软件工程 第二次作业

项目 内容
这个作业属于哪个课程 202601 软件工程 - 福州大学
这个作业要求在哪里 2026秋软件工程个人作业(第二次)
这个作业的目标 使用 Python 和 AIGC 完成"一箭又一箭"小游戏
学号 102401108
GitHub 仓库 Limy-YY/arrow-puzzle: A simple arrow elimination game built with Python and Pygame.

项目展示

温馨提示

  1. 本视频已上传至 GitHub Release,若在本网页内无法播放,可直接点击 此处下载观看。
  2. 视频进度条可能会遮挡下方游戏界面的底部按钮,建议不要全屏播放,并将鼠标移出视频区域,进度条便会自动隐藏。
  3. 由于 GitHub 在国内访问可能受限,若视频加载失败或下载卡顿,建议开启网络代理后再试。

项目介绍

​ 本项目参考微信小程序《一箭又一箭》的核心玩法,设计并实现了一款简化的箭头消除游戏。本项目不仅旨在构建一个趣味性的解谜小游戏,更是一次完整的软件工程实践:通过开发过程深入体验软件生命周期,探索 AIGC 工具在代码编写与调试中的高效应用,并熟练掌握 Git 版本控制与 GitHub 仓库的协作流程,为后续更复杂的项目开发奠定基础。

游戏规则

  1. 棋盘布局:游戏界面呈现一个由若干箭头组成的网格棋盘,每个箭头均指向“上、下、左、右”四个方向之一。
  2. 基本操作:玩家使用鼠标点击箭头,触发其向指向方向飞出的动作。
  3. 判定逻辑:
    • 成功消除:若箭头的前进路径上直至棋盘边界均无其他箭头阻挡,该箭头将飞出棋盘并被消除。
    • 碰撞惩罚:若路径上存在其他箭头阻挡,点击无效,箭头将执行碰撞反馈(如晃动或退回),并扣除一次失误机会。
  4. 通关条件:玩家需通过逻辑推理找到正确的点击顺序,在规定时间内且失误机会耗尽前,将当前关卡的所有箭头全部消除,方可进入下一关。

界面设计

本项目的界面设计遵循“简洁直观、功能优先”的原则,旨在降低玩家的学习成本,使其能专注于解谜逻辑。系统主要包含以下四个核心界面:

开始界面

作为游戏的入口,提供清晰的导航功能:

  • 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 天

心得体会

  1. 增量迭代与版本控制的价值

通过本次作业,我完整体验了增量迭代的开发过程。Git 版本控制让我能够在某条改进路线走入死胡同时,快速回退到上一个可用版本,再尝试其他方向。开发就像一场探索——每次在保持原有功能正常运行的前提下增添新特性,逐步逼近最终目标。这种「小步快跑、随时可回退」的节奏,远比一次性写完再调试要稳妥得多。

  1. AI 赋能开发:从想法到代码的捷径

本次作业也让我切实感受到了 AI 工具的强大,体验了所谓的 Vibe-coding:给 AI 明确的指令,让它帮我实现设想。没有思路时可以问 AI,没有界面美化方案时可以让 AI 生成效果图,AI 的参与让开发门槛大幅降低。当今时代,学会用 AI 已经成为高效开发的必备能力——只有想不到的,没有做不到的。

  1. AI 的局限性与人工审查的必要性

但 AI 并非万能。每次 AI 给出的改进建议,都需要自己进行代码逻辑审查,判断其改进方向是否合理。如果一味当 AI 的「搬运工」,很容易被 AI 牵着鼻子走,尤其在代码多次改动陷入死胡同时更难脱身。AI 是助手,不是决策者——最终对代码质量负责的仍然是开发者本人。

  1. 提示词设计:与 AI 高效协作的关键

要更好地利用 AI,需要学会设计清晰合理的提示词,让 AI 准确理解需求,达到「设想统一」。在让 AI 写代码之前,先一起讨论方案、明确可行路径,才能减少返工和 bug。模糊的指令只会换来模糊的代码,而精确的需求描述才能换来符合预期的产出。

  1. 代码结构与可维护性

本次作业也让我意识到合理规划代码结构的重要性。将代码分散到多个文件、类和方法中,而不是集中在一个巨型文件里,不仅能增强复用性和可拓展性,也更方便纠错和后续修改。保持 KISS(Keep It Simple, Stupid)原则,让每个模块职责单一、边界清晰,是长期维护的基础。

  1. 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 构建/工具类杂项(不影响业务逻辑)
posted @ 2026-09-21 15:20  myuani  阅读(12)  评论(0)    收藏  举报