Ch2 - 软工个人:非常上瘾的“一箭又一箭”

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

⭐ 一、项目基本信息

  • 项目名称: one-arrow-game(一箭又一箭)
  • 开发语言: Python
  • GUI 框架: Pygame
  • 开发工具: Visual Studio Code
  • 代码仓库: GitHub

🚀 二、项目目标和基本流程

本次作业要求使用 Python 完成一个“一箭又一箭”类型的箭头解谜小游戏。

游戏的基本玩法是:棋盘中会放置不同方向的箭头,玩家点击箭头后,程序需要判断箭头前进的方向上是否存在其他箭头。如果没有障碍物,箭头就可以飞出棋盘并消失;如果前方存在其他箭头,则本次点击失败,同时消耗一次失误机会。

在完成基本玩法的基础上,游戏还需要实现多个关卡、胜利和失败状态,并使用 AIGC 工具参与实际开发过程。

我的实现目标并不是一开始就加入很多复杂功能,而是先保证游戏最基本的逻辑正确,尤其是四个方向的路径检测。之后再逐步增加动画、界面和关卡等功能。

                  游戏核心功能
                      ↓
                  T01-T06 全部通过
                      ↓
                  README 完善
                      ↓
                  AIGC 使用记录整理
                      ↓
                  PSP 记录
                      ↓
                  GitHub 项目整理
                      ↓
                  博客 / 作业报告

💻 三、开发环境

本项目目前使用以下环境:

项目 使用工具
编程语言 Python 3.11
游戏框架 Pygame
IDE Visual Studio Code
代码管理 Git + GitHub
AIGC 工具 ChatGPT ,deepseek
操作系统 Windows

为了避免不同电脑上的 Python 环境产生冲突,我在项目中创建了 Python 虚拟环境 venv,并在虚拟环境中安装 Pygame。

项目同时使用 requirements.txt 保存依赖环境,使用 .gitignore 忽略虚拟环境和 Python 缓存文件。


🎮 四、项目展示和项目介绍

1. 开始界面

测试面板和箭头

开始界面提供两个入口:

  • 新游戏:从第 1 关开始,清空旧存档
  • 继续游戏:从上次存档的关卡继续(无存档时按钮变灰不可点)

背景是深蓝星空,包含星云、银河、自转星球和闪烁星星。

2. 新手教学

成功演示 阻挡演示 教学试玩

正式关卡前有一段教学流程:

  1. 成功演示:展示火箭前方无阻挡时飞出
  2. 阻挡演示:展示前方有火箭时无法飞出
  3. 教学试玩:让玩家自己尝试点出正确的火箭

3. 游戏界面

游戏界面

游戏界面包含:

  • 左上:当前关卡、剩余机会
  • 右上:计时器(淡黄窗口)、暂停按钮
  • 中央:全息投影风格的棋盘
  • 棋盘内:小火箭造型的箭头,带尾焰

4. 暂停与存档

暂停和存档

游戏中点击右上角"暂停"按钮:

  • 计时冻结
  • 弹出居中面板,遮罩下方仍可见棋盘
  • 两个按钮:继续游戏存档并退出

5. 通关界面

通关界面

清空全部火箭后进入通关界面:

  • 显示"本关耗时 XX:XX"
  • 点击"下一关"进入下一关

6. 失败界面

教学试玩

失误次数耗尽时进入失败界面:

  • 显示"本关耗时 XX:XX"
  • 点击"重新开始本关"重置当前关卡

📖 二、项目介绍

1. 游戏规则

"一箭又一箭"是一款点击式解谜游戏。棋盘上分布着若干朝向上、下、左、右的火箭:

  • 点击一个火箭,程序检查它前进方向上是否有其他火箭阻挡
  • 前方无阻挡:火箭飞出棋盘并消失
  • 前方有阻挡:火箭不能飞出,变红并抖动,扣除一次失误机会
  • 清空全部火箭 → 通关
  • 失误次数耗尽 → 失败

2. 界面设计

整体风格是深蓝宇宙 + 全息投影

元素 设计
背景 深蓝星空 + 星云 + 银河 + 闪烁星星 + 自转星球
棋盘 无底色,只有半透明蓝色网格线和发光边框,像全息投影
箭头 小火箭造型:机身 + 尖头 + 尾翼 + 舷窗 + 尾焰
计时器 右上角淡黄半透明圆角窗口,显示 MM:SS
配色 深蓝主色 + 淡蓝高光 + 橙黄尾焰 + 淡黄计时器

3. 主要功能

  • ✅ 四种方向的箭头
  • ✅ 鼠标点击选择箭头
  • ✅ 路径检测与碰撞反馈
  • ✅ 失误次数与失败判定
  • ✅ 至少 3 个可通关关卡
  • ✅ 通关 / 失败 / 重新开始
  • ✅ 新手教学流程
  • ✅ 关卡计时器
  • ✅ 暂停与计时冻结
  • ✅ 存档 / 继续游戏
  • ✅ 星空动态背景 + 自转星球

4. 项目特色

  • 主题化视觉:不是简单的方块箭头,而是完整的宇宙主题
  • 教学流程:新手不需要看说明书,通过演示 + 试玩自然掌握规则
  • 存档系统:随时暂停存档,下次继续
  • 代码结构清晰:逻辑、渲染、配置、存档分离,便于扩展

🧠 三、核心代码解释

1. 箭头和方向的表示

每个箭头用 Arrow 类表示:

class Arrow:
    def __init__(self, row, col, direction):
        self.row = row          # 逻辑行坐标
        self.col = col          # 逻辑列坐标
        self.direction = direction  # "up" / "down" / "left" / "right"

        self.x = None           # 屏幕像素坐标(动画用)
        self.y = None
        self.flying = False     # 是否正在飞出
        self.hit_timer = 0      # 碰撞反馈计时器

关键设计row/col逻辑坐标(棋盘格),x/y屏幕坐标。飞行时只改 x/yrow/col 保持不变。这样可以避免"飞行中坐标漂移"的问题。

2. 棋盘和路径检测

棋盘用二维列表 grid[row][col] 表示,每个格子要么是 None,要么是一个 Arrow

class Board:
    DIRECTIONS = {
        "right": (0, 1),
        "left":  (0, -1),
        "down":  (1, 0),
        "up":    (-1, 0)
    }

    def can_exit(self, arrow):
        row_step, col_step = self.DIRECTIONS[arrow.direction]

        row = arrow.row + row_step
        col = arrow.col + col_step

        while 0 <= row < self.rows and 0 <= col < self.cols:
            if self.grid[row][col] is not None:
                return False    # 遇到其他箭头,被阻挡
            row += row_step
            col += col_step

        return True    # 走到边界都没遇到箭头,可以飞出

核心思路

  1. DIRECTIONS 字典把四个方向统一成 (行增量, 列增量)
  2. 从箭头的下一个格子开始,沿方向逐格扫描
  3. 遇到非空格子 → 被阻挡;走到边界外 → 可以飞出

举例:

→  ·  ·  →

点最左边的箭头时,扫描路径为 (0,1) → (0,2) → (0,3),在 (0,3) 遇到箭头,返回 False

3. 飞行状态与"视觉/逻辑不同步"Bug

最初实现时,点击箭头只是设置 arrow.flying = True,并没有从 grid 里移除它。结果:

→  ·  ·  →

点最右箭头后,它还在飞行动画中,但 grid[0][3] 仍然指向它。此时点中间箭头,can_exit 扫到 grid[0][3] 非空,误判为"被阻挡"。

修复方式:箭头起飞时立即从 grid 移除:

def start_flying(self, arrow):
    if arrow.flying:
        return

    arrow.flying = True

    # 立即从棋盘逻辑层移除
    if self.board.grid[arrow.row][arrow.col] is arrow:
        self.board.grid[arrow.row][arrow.col] = None

这样,grid 只表示静止在棋盘上的箭头,路径检测天然正确。

4. 计时器

计时器用两个变量:

self.level_start_ticks = 0    # 本关开始时刻
self.level_elapsed_ms = 0     # 已耗时(停表后固定)
self.timer_running = False
  • 开始level_start_ticks = pygame.time.get_ticks()
  • 运行中elapsed = pygame.time.get_ticks() - level_start_ticks
  • 停表level_elapsed_ms = pygame.time.get_ticks() - level_start_tickstimer_running = False
  • 暂停恢复level_start_ticks = now - paused_elapsed_ms

5. 存档系统

存档用 JSON:

{
  "level_index": 2,
  "elapsed_ms": 45000,
  "mistakes": 2,
  "arrows": [
    {"row": 0, "col": 0, "direction": "right"}
  ]
}
  • 只存静止的箭头not arrow.flying),飞行中的箭头本来就会消失
  • 继续游戏时,从 elapsed_ms 恢复计时:level_start_ticks = now - elapsed_ms

6. 游戏状态机

game_state 字符串管理状态:

start → tutorial_success → tutorial_blocked → tutorial_play
      → tutorial_complete → playing ⇄ paused
      → won / failed

主循环只做三件事:

for event in pygame.event.get():
    game.handle_event(event)    # 事件分发

game.update()                   # 逻辑更新

screen.fill(BG_COLOR)
game.draw()                     # 绘制
pygame.display.flip()

所有状态相关的逻辑都封装在 Game 类的方法里,main.py 只负责启动。

7. 代码结构

main.py                 入口,约 40 行
game/
  settings.py           常量 + 字体初始化
  starfield.py          星空、星云、银河、星星、星球
  ui.py                 按钮绘制
  game.py               Game 类:状态机、事件、更新、绘制
  save_system.py        存档读写
  arrow.py              Arrow 数据类
  board.py              Board 数据类
levels/
  levels.py             关卡数据

拆分前 main.py 有 1200+ 行,拆分后各模块职责清晰:

  • main.py:启动
  • settings.py:配置
  • starfield.py / ui.py:纯视觉
  • game.py:游戏逻辑
  • save_system.py:持久化

🪐 五、开发过程

我们没有过丰富的开发经验,所以应该循序渐进,一开始,先保证一些基本功能的实现。


  • 测试面板和箭头
测试面板和箭头
  • 测试游戏通关重新开始和失败当前关卡重新开始
测试面板和箭头
  • 添加箭头碰撞反馈
测试面板和箭头
  • 添加教学引导过程
测试面板和箭头
  • UI界面渲染设计
测试面板和箭头

🤖 六、AIGC 使用过程

本项目开发过程中使用了 AIGC 工具辅助完成部分功能设计、代码理解和问题排查。AIGC 主要用于解决开发过程中遇到的具体问题,我会根据实际运行结果对 AI 给出的方案进行修改和测试,而不是直接使用 AI 生成的完整项目。

记录 1:路径检测

项目内容
子任务 路径检测
AIGC 工具 ChatGPT
提问 我正在用 Python + Pygame 做一个"一箭又一箭"小游戏,棋盘是二维列表,箭头有上下左右四个方向。应该怎么判断箭头前方有没有其他箭头阻挡?
AI 提供 建议使用方向字典,将 up、down、left、right 分别转换成行列的变化量,再从箭头的下一个格子开始逐格检查,直到遇到其他箭头或者到达棋盘边界。
效果 帮助我确定了路径检测的基本实现方式,并成功实现了四个方向的障碍判断。
人工修改 根据自己的代码结构实现了 Board 类和 can_exit() 函数,并实际测试了四个方向的有障碍、无障碍情况。

记录 2:路径检测重构

项目内容
子任务 路径检测代码优化
AIGC 工具 ChatGPT
提问 我已经分别写出了上下左右四个方向的判断,但是代码有很多重复部分,有没有更简单的写法?
AI 提供 建议使用 DIRECTIONS 字典保存四个方向对应的 (row_step, col_step),然后通过同一个 while 循环完成路径扫描。
效果 将原本针对四个方向的重复判断统一成了一套路径检测逻辑,代码更加简洁。
人工修改 我没有直接采用复杂的简写,而是保留了 while 循环的写法,因为这种方式更容易理解和调试,同时自己补充了棋盘边界判断。

记录 3:箭头飞出动画

项目内容
子任务 箭头飞出动画
AIGC 工具 ChatGPT
提问 我想让玩家点击没有障碍的箭头后,箭头不是直接消失,而是向棋盘外飞出去,应该怎么实现?
AI 提供 建议给箭头增加一个 flying 状态,在点击后进入飞行状态,然后在 Pygame 的游戏循环中不断更新箭头的位置,直到飞出棋盘。
效果 成功实现了箭头点击后向棋盘外移动的动画效果,游戏的操作反馈更加明显。
人工修改 根据自己的棋盘位置和窗口大小调整了箭头的移动方式和速度,并将飞出状态与原来的棋盘数据结合起来。

记录 4:失败机制与碰撞反馈

项目内容
子任务 失败机制和碰撞反馈
AIGC 工具 ChatGPT
提问 如果玩家点击了被其他箭头挡住的箭头,需要让箭头保持不动,同时扣除一次错误次数,并在错误次数用完后显示失败界面,应该怎么设计?
AI 提供 建议使用游戏状态记录开始、游戏中、失败和胜利等不同状态,同时增加错误次数和碰撞反馈计时器。被阻挡时不移动箭头,只扣除错误次数,并通过颜色变化给玩家反馈。
效果 实现了错误次数、失败界面以及箭头被阻挡时短暂变红的碰撞反馈。
人工修改 根据实际游戏效果调整了碰撞反馈持续时间,并将重新开始功能设计成按钮操作,而不是使用键盘快捷键。

记录 5:关卡设计与边界测试

项目内容
子任务 关卡设计与边界测试
AIGC 工具 ChatGPT
提问 请帮我设计几个"一箭又一箭"的测试关卡,要求能够实际通关,同时能够测试箭头位于棋盘边界时的情况。
AI 提供 根据箭头的位置和方向给出了关卡设计思路,并提醒需要重点检查箭头位于边缘、方向直接指向棋盘外时的情况。
效果 最终完成了 3 个可以实际通关的关卡,并增加了边界箭头测试。
人工修改 对关卡布局进行了手动调整,并逐关实际操作测试。第一关加入了位于左上角、方向指向棋盘外的箭头,用于验证边界情况下不会发生数组越界。

记录 6:修复"飞行中箭头仍被当作障碍物"的 Bug

项目内容
子任务 修复状态不同步导致的隐藏 Bug
AIGC 工具 ChatGPT
提问 我点击一个可以飞出的箭头后,只是把 arrow.flying = True,但棋盘 board.grid 里的这个箭头没有立即删除。真正删除要等它飞出屏幕。结果在飞行动画期间,它仍然被别的箭头当作障碍物,导致误判。应该怎么修?
AI 提供 给出两种方案:方案 A 是点击起飞时立即从 board.grid 移除,视觉上仍由箭头列表渲染;方案 B 是在所有路径检测的地方加 if cell.flying: return False 过滤。AI 推荐方案 A,并指出原代码在飞出屏幕时用 arrow.row/col 去清 grid,存在坐标漂移导致误清的隐患。
效果 采用方案 A 后,→ → → 场景下点最右箭头、趁它还在飞行中点中间箭头,中间箭头能正常起飞,不再被误判。同时顺手修掉了"飞出屏幕时清错格子"的隐藏 bug。
人工修改 我认同了方案 A 的思路,并在 start_flying 里加了 board.grid[arrow.row][arrow.col] = None,同时删掉了 update_arrow 里飞出屏幕时的重复清理。改完后自己构造了 → → → 场景复现验证。

记录 7:深蓝星空 + 小火箭 UI 的迭代

项目内容
子任务 游戏视觉风格重做
AIGC 工具 ChatGPT
提问 我想要游戏背景是深蓝色宇宙星空,箭头变成小火箭。另外要有星云、银河、闪烁的星星,星云和银河不能太粗糙,要接近真实的感觉,星星最亮的几颗加十字光芒。
AI 提供 第一版给了:单圆叠加的星云、14 个椭圆硬叠加的银河、pygame.draw.line 画的十字光芒。我看后觉得星云太粗糙、银河太粗糙、十字光芒像"加号"。
效果 经三轮迭代:① 星云改成每个由 180 个小圆极坐标叠加,alpha 随距离衰减;② 银河改成四层结构(柔和光晕 + 核心亮带 + 尘埃带 + 零散亮星),颜色用四段渐变函数;③ 十字光芒改成沿十字逐像素撒小圆、alpha 按 (1-rel)² 衰减,长度缩短到 6px。另外把星云和银河预渲染到一张 Surface,每帧只 blit 一次,提升性能。
人工修改 我逐轮提出"星云粗糙""银河粗糙""十字光芒粗糙",并给出了"更接近真实的星云和银河""要有渐变颜色""光芒短一点"的具体要求。最终还接受了"暖冷混合"的银河配色方案(核心淡黄 → 淡蓝 → 紫蓝)。

记录 8:暂停 + 存档功能

项目内容
子任务 暂停与存档系统
AIGC 工具 ChatGPT
提问 我想要:① 开始界面能选"新游戏"或"继续游戏";② 游戏中可以暂停,暂停时冻结计时,弹出居中窗口,有"继续游戏"按钮;③ 暂停窗口里可以"存档并退出",把当前关卡、计时、棋盘状态存下来,回到开始界面。
AI 提供 建议新增 paused 状态;存档用 save.json,包含 level_indexelapsed_msmistakesarrows(只存静止的箭头,飞行中的丢弃);计时用 level_start_ticks + elapsed_ms 双变量,暂停时把已耗时存进 paused_elapsed_ms,恢复时用 now - paused_elapsed_ms 补偿;继续游戏时用 level_start_ticks = now - elapsed_ms 恢复。
效果 完整实现了暂停面板、计时冻结、存档退出、继续游戏恢复进度。测试通过。
人工修改 我逐项确认了细节:暂停只能用按钮触发(不用 ESC)、暂停窗口只需"继续游戏"和"存档并退出"两个按钮、飞行中箭头存档时丢弃、无存档时"继续游戏"按钮变灰、点"新游戏"立即清掉旧存档。

记录 9:代码结构重构

项目内容
子任务 拆分 1200 行 main.py
AIGC 工具 ChatGPT
提问 我的 main.py 已经 1200 多行,全是全局变量和函数,太长了。想拆成几个模块,但不知道从哪里下手。
AI 提供 建议按职责拆分,分两步走:第一步只搬常量、星空、UI(低风险,逻辑不动);第二步把游戏逻辑搬进 Game 类,main.py 只留入口(高风险,逻辑重组)。最终结构:settings.py(常量 + 字体初始化)、starfield.py(星空星球)、ui.py(按钮)、game.pyGame 类)、save_system.py(存档)。
效果 拆完 main.py 从 1200 行缩到 40 行,职责清晰。两步各自测试通过,分两次 commit。
人工修改 我采纳了"分两步"的建议,每步做完都实际运行测试。第一步拆分后测试通过再 commit,第二步把全局变量改成 Game 实例变量、去掉 global,也测试通过。字体遇到"import 时 pygame 还没 init"的问题,AI 建议改成 init_fonts() 延迟初始化,我采用了。

记录 10:布局重叠问题的排查

项目内容
子任务 修复文字与棋盘重叠
AIGC 工具 ChatGPT
提问 教学界面底部的提示文字和棋盘下边缘重叠了,正式游戏时顶部 HUD 文字又和棋盘上边缘贴得太近,观感不好。
AI 提供 分析了纵向布局坐标:棋盘 BOARD_Y=70550,底部文字在 555,确实重叠。给出三个方案,推荐方案 C:HUD 文字 y 从 20 改到 14,棋盘 BOARD_Y 从 55 改到 62,底部提示文字 y 从 578 改到 582,教程标题从 25 改到 20。
效果 调整后:HUD 文字 14~38,棋盘 62~542,底部文字中心 582,上下都留出了呼吸空间,不再重叠。
人工修改 我先尝试只改文字 y 的方案 B,发现还是挤,最终采纳方案 C 两边都调。改完实际运行确认布局舒服。

AIGC 使用总结

这次项目中,我没有直接让 AIGC 一次性生成完整的游戏,而是把开发过程中的问题拆开,遇到具体问题时再进行询问。

AIGC 主要帮助我完成了四个方面的工作:一是理解和设计核心代码逻辑(路径检测、飞出动画、失败机制);二是提供具体功能的实现思路(暂停、存档、重构);三是帮助排查隐藏 Bug(飞行中箭头被当障碍、文字重叠);四是协助视觉设计迭代(星空、银河、星球、火箭)。

不过 AI 给出的方案并不是直接拿来使用。例如:

  • 路径检测部分,我最终保留了容易理解的 while 循环,而不是过度简写;
  • 星空 UI 部分,我经过三轮"粗糙 → 细化"的反馈,才得到满意的效果;
  • 修 Bug 部分,我根据 AI 的分析构造了 → → → 场景亲自复现验证;
  • 重构部分,我采纳"分两步走"的建议,每步都测试通过才继续。

因此,本项目中的 AIGC 更像是一个辅助开发工具。最终的代码修改、功能验证、关卡调整和实际测试仍然由我自己完成。

🎯 七、测试与 Git 记录

1. 测试记录

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头顺利飞出 通过 ✅
T02 点击前方有阻挡的箭头 箭头不飞出,失误次数 -1 失误次数从 3 减到 2,箭头变红晃动 通过 ✅
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误 测试一切正常 通过 ✅
T04 消除本关全部箭头 显示通关并进入下一关 通过并自动进入下一关 通过 ✅
T05 失误次数耗尽 显示失败并允许重新开始 失败后显示重新开始按钮,点击按钮重新开始本关 通过 ✅
T06 游戏进行中重新开始 箭头布局和失误次数恢复 符合预期,测试成功 通过 ✅

附加测试(本项目额外功能)

编号 测试内容 预期结果 实际结果 是否通过
T07 飞行中的箭头不再被当作障碍物 点最右箭头后立刻点中间箭头,中间箭头能起飞 修复前会被误判,修复后正常 通过 ✅
T08 暂停时计时冻结 暂停 5 秒后继续,计时不跳 计时从暂停处接着走 通过 ✅
T09 存档并退出后继续游戏 恢复关卡、棋盘、剩余机会、已耗时 全部正确恢复 通过 ✅
T10 新游戏覆盖旧存档 继续游戏按钮恢复为灰色 点新游戏后,继续游戏按钮变灰 通过 ✅

2. Git 提交记录

Commit 信息 说明
chore: 初始化游戏开发环境 建立项目结构、.gitignorerequirements.txt
feat: 完成游戏棋盘和箭头显示 棋盘绘制、箭头绘制、基本窗口
feat: 实现四个方向的路径检测 Board.can_exit() + DIRECTIONS 字典
feat: 添加箭头碰撞反馈 被挡时变红 + 抖动,hit_timer
feat: 添加游戏关卡并设计递进难度 levels.py,3 个可通关关卡
feat: 添加新手教学引导流程 成功演示、阻挡演示、教学试玩、教学完成
feat: 添加计时器、暂停与存档功能 paused 状态、save.json、继续游戏
feat: 深蓝星空 UI + 小火箭造型 星云、银河、星球、火箭、全息棋盘
fix: 修复飞行中箭头仍被当作障碍物的 Bug 起飞即从 grid 移除
refactor: 拆分常量和星空、UI 到 game/ 各模块 第一步拆分
refactor: 拆分游戏逻辑到 game/game.py 的 Game 类 第二步拆分,main.py 缩到 40 行
docs: 完善 README 和运行说明 README、游戏截图、运行步骤

说明:以上为开发过程中的代表性 Commit,实际提交次数更多。每次功能完成或 Bug 修复后都会 commit,避免在截止日期前一次性上传。

🧾 八、PSP 表格

任务 预估耗时 (小时) 实际耗时 (小时) 差异 (小时)
需求分析与游戏设计 1.0 1.5 +0.5
Python 与图形库学习 2.0 2.0 0
游戏界面实现 2.0 3.5 +1.5
路径与碰撞逻辑实现 3.0 4.0 +1.0
关卡设计 1.0 1.5 +0.5
AIGC 辅助开发 2.0 3.0 +1.0
测试与修改 1.0 2.0 +1.0
README 与博客撰写 1.0 2.0 +1.0
合计 13.0 19.5 +6.5

PSP 说明

  • 游戏界面实现超时较多,因为中途做了星空背景、星球自转、小火箭造型、全息棋盘等多轮视觉迭代,比原计划复杂。
  • 测试与修改超时,主要是排查"飞行中箭头仍被当作障碍物"这个隐藏 Bug 花了不少时间,以及暂停/存档功能的边界测试。
  • AIGC 辅助开发超时,因为和 AI 的协作是多轮迭代的(尤其是星空 UI 改了三轮),不是一次生成就完事。
  • README 与博客撰写超时,因为要整理截图、AIGC 记录、测试表格和 PSP,比预想的花时间。

💭 八、项目总结与心得

1. AIGC 带来的帮助

  • 快速上手 Pygame:Pygame 的坐标系、事件循环、Surface 这些概念,AIGC 能给出可运行的示例,比翻文档快很多。
  • 核心逻辑的设计思路:路径检测、飞出状态、碰撞反馈这些"该怎么做"的问题,AIGC 给的方向很准。
  • 排查隐藏 Bug→ → → 那个"飞行中箭头仍被当障碍"的问题,我自己只看到现象,AIGC 帮我定位到"视觉状态与逻辑状态不同步"的根因,并指出原代码还有坐标漂移的隐患。
  • 视觉设计的迭代:星空、银河、星球、火箭这些,AIGC 能快速出初版,我只需要提"更真实""更精致"的反馈。
  • 重构建议:1200 行 main.py 拆成模块,AIGC 建议"分两步走、每步测试通过再继续",这个策略很稳。

2. 遇到的问题

  • AI 代码不能直接用:比如路径检测,AI 一开始给的简写虽然短,但可读性差,我保留了更容易调试的 while 循环。
  • AI 的视觉初版往往粗糙:星云、银河、十字光芒都是"能跑但不好看",需要我明确提"哪里粗糙、往哪个方向细化"。
  • AI 不一定考虑边界情况:比如原代码在飞出屏幕时用 arrow.row/col 清 grid,AI 指出这是坐标漂移隐患,但如果我不问,这个 bug 会一直潜伏。
  • AI 会给出多种方案,要自己选:修 Bug 时给了方案 A 和 B,我根据"语义正确、消除竞态"选了 A,而不是无脑接受。

3. 收获

  • 对 AI 生成代码要保持判断:能跑不等于对,要理解它在做什么,还要构造场景验证。
  • 需求描述越具体,AI 输出越准:我一开始说"要星空",AI 给的很泛;后来说"星云要雾状渐变、银河要有尘埃带、十字光芒要渐隐",AI 才给出精细版本。
  • 重构要分步、每步测试:一次性大改很容易出问题,分两步走、每步 commit,出问题能回退。
  • 测试很重要:T01~T06 是作业要求,T07~T10 是我自己加的边界测试,正是这些测试帮我发现了隐藏 Bug。

总的来说,AIGC 是一个很强的辅助工具,但它不能替代开发者对代码的理解和判断。最终能跑通、能通关、有存档、有漂亮界面的游戏,是"我提需求 + AI 给方案 + 我判断修改 + 我实际测试"共同完成的。

posted @ 2026-09-21 20:51  Vivian_azad  阅读(22)  评论(0)    收藏  举报