软件工程第二次作业:《一箭又一箭》小游戏开发记录

软件工程课程第二次个人作业

《一箭又一箭》:Python + AIGC 小游戏的诞生过程

这个作业属于哪个课程 H202601软件工程与软件工程实践
这个作业要求在哪里 2026 秋软件工程个人作业(第二次)
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏,实现四方向路径检测、碰撞反馈、失误机制和多关卡流程,并上传 GitHub
学号 102402109
GitHub 仓库 https://github.com/Vvvicky005/one-arrow-game

一、项目展示

《一箭又一箭》是一款使用 Python + Pygame 开发的点击式箭头解谜小游戏。玩家需要观察箭头的方向和相互阻挡关系,按照合适的顺序点击箭头,让所有箭头依次飞出棋盘。

游戏包含开始界面、选关界面、游戏界面、通关界面和失败界面,并加入了背景音乐、飞出动画、碰撞反馈、失误次数、得分和重新开始功能。

1. 开始界面

开始界面采用蓝天、白云、星星和可爱箭头小人风格,包含“开始游戏”“选择关卡”“怎么玩?”三个入口。

c3d6fee944adfeb6e21368f6fd3574ae

2. 选择关卡界面

玩家可以在这里选择要挑战的关卡。

387fb2e381daf346ed038bc703875cd4

3. 游戏指南界面

游戏指南介绍了基本玩法。

4fc3652fc5eccc78e5985c2b3ea7d9b6

4. 游戏界面

游戏界面顶部显示当前关卡、时间、失误次数,中间是 6×6 棋盘,底部有“重新开始”“提示”“返回主页”三个按钮。

34dc4660cd7d4651071425eade422643

5. 通关界面

清空当前关卡全部箭头后,会显示“关卡完成”、本关用时和当前得分,点击“下一关”进入下一关。

549490cd31a1aca1a50f861d4fab1f00

6. 失败界面

失误次数耗尽后进入失败界面,可以重新挑战当前关卡或返回主页。

77c8f9160b1469a76cdf7ce7962fc21b

7. 全部通关界面

完成最后一关后,会显示“全部通关”,展示最终得分和最后一关用时,并提供“再玩一次”和“返回主页”按钮。

9deba0519cd6f9aa0376a9b18c0fc4ec

8. 动画演示

下面展示游戏中的实际操作与动画效果:

2e0a5f53fa7ea5309a56483f8ef5582f


二、项目介绍

1. 游戏规则

  • 棋盘中每个箭头占一个格子,方向分为上、下、左、右四种。
  • 点击箭头后,程序检查该箭头前进方向上是否有其他箭头。
  • 如果前方没有阻挡,箭头飞出棋盘并消失。
  • 如果前方有阻挡,箭头不能消失,会晃动、变色,并消耗一次失误。
  • 清除当前关卡全部箭头即可通关。
  • 失误次数耗尽则本关失败,可以重新开始。

2. 主要功能

  • 开始、选关、游戏、通关、失败完整流程
  • 5 个可通关关卡
  • 鼠标点击箭头
  • 四种方向路径检测
  • 飞出动画和碰撞反馈
  • 失误次数显示
  • 重新开始当前关卡
  • 背景音乐,空格键静音 / 恢复
  • 得分系统
  • 通关界面显示本关用时

3. 界面设计

界面采用浅蓝渐变背景,搭配白云、星星、可爱箭头小人,整体风格轻松可爱。棋盘使用圆角格子,箭头用圆形底色 + 方向图标绘制,视觉清晰。


三、开发环境

项目 环境
操作系统 Windows 10
Python 3.12
图形库 Pygame 2.6.1
开发工具 VS Code
版本控制 Git
代码托管 GitHub

四、实现思路

1. 程序结构

项目将核心逻辑、界面、关卡和测试分开:

one-arrow-game/
├── main.py              程序入口
├── core/
│   ├── board.py         棋盘规则、路径检测
│   ├── solver.py        关卡求解
│   └── levels.py        关卡数据
├── ui/
│   ├── theme.py         配色、字体、布局
│   ├── render.py        绘制工具
│   ├── animations.py    动画与粒子
│   └── game.py          状态管理与主循环
├── tests/
│   └── test_core.py     核心逻辑测试
├── tools/
│   └── check_levels.py  关卡体检工具
├── assets/
│   ├── bgm.mp3          背景音乐
│   └── screenshots/     游戏截图
├── .gitignore
└── README.md

核心逻辑不依赖 Pygame,可以单独测试。

2. 箭头和方向表示

每个箭头用一个字典表示:

{
    "row": 0,
    "col": 0,
    "direction": "right",
    "active": True,
}

方向对应的行列变化:

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

3. 路径检测

路径检测是核心。

从箭头位置出发,沿方向一步步前进:

def is_blocked(arrow, arrows, rows, cols):
    row = arrow["row"]
    col = arrow["col"]
    dr, dc = DIRECTIONS[arrow["direction"]]
    r = row + dr
    c = col + dc

    while 0 <= r < rows and 0 <= c < cols:
        for other in arrows:
            if not other["active"]:
                continue
            if other is arrow:
                continue
            if other["row"] == r and other["col"] == c:
                return True
        r += dr
        c += dc

    return False

如果循环结束后没有遇到任何箭头,说明可以飞出。

4. 游戏状态管理

current_screen 管理不同界面:

  • start:开始界面
  • level_select:选关
  • game:游戏中
  • help:游戏说明
  • level_clear:通关
  • success:全部通关
  • fail:失败

根据状态决定绘制什么、处理什么事件。

5. 动画和音效

  • 飞出动画:箭头沿方向加速离开棋盘
  • 碰撞动画:箭头左右晃动并变红
  • 粒子效果:飞出和碰撞时生成小圆点
  • 背景音乐:用 pygame.mixer.music 循环播放,空格键暂停 / 恢复

五、AIGC 使用过程

本项目主要使用 DeepSeek / ChatGPT 辅助开发。下面记录 4 次有代表性的协作过程。

子任务 使用的 AIGC 我提出的要求 AI 提供的内容 实际效果 我的修改
路径检测 DeepSeek 写一个函数,判断箭头沿方向前进到边界之间有没有其他箭头 生成四方向检测代码 向上判断时越界 修改边界条件为 0 <= r < rows
关卡设计 Kimi 设计 5 个 6×6 的可通关关卡 生成关卡数据 第 5 关出现死锁 重新设计第 5 关并用 tools/check_levels.py 验证
碰撞动画 ChatGPT 点击被阻挡箭头时,让它晃动并变红 晃动代码 基本可用 调整晃动幅度和持续时间
背景音乐 DeepSeek Pygame 怎么循环播放背景音乐,并支持静音 pygame.mixer.music 用法 音乐正常播放 增加空格键切换,并处理中文输入法拦截 M 键的问题

通过这些过程,我发现 AI 能快速给出框架和思路,但代码必须自己运行、测试、修改,不能直接复制。


六、测试结果

1. 自动化测试

运行:

python tests/test_core.py

输出:

所有测试通过!

2. 手工测试

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头飞出后消失 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头晃动变红,失误减 1 通过
T03 点击边缘且朝向棋盘外的箭头 正常消失,不越界 正常飞出,无报错 通过
T04 消除本关全部箭头 显示通关并进入下一关 显示通关界面 通过
T05 失误次数耗尽 显示失败并允许重新开始 进入失败界面 通过
T06 游戏进行中重新开始 布局和失误次数恢复 恢复初始状态 通过

3. 关卡检查

运行:

python tools/check_levels.py

输出 5 关全部可解。


七、Git 提交记录

开发过程中按功能阶段进行了多次 Commit:

feat: 完成游戏基本框架
feat: 通关界面显示本关用时
docs: 完善 README 和添加游戏截图
fix: 修正 README 截图路径
docs: 添加动画演示

GitHub 仓库:https://github.com/Vvvicky005/one-arrow-game


八、PSP 表格

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

九、心得体会

这次作业让我完整经历了一个小游戏从设计、编码、调试到测试的过程。

一开始我以为规则很简单,但真正写起来才发现,路径检测要考虑边界、要考虑已经消失的箭头、还要考虑四个方向。AI 给的代码不能直接用,必须自己运行、测试、修改。

印象最深的是第 5 关出现死锁。玩家玩到一半,所有剩余箭头都互相挡住,谁也飞不出去。后来我写了 tools/check_levels.py,用 BFS 自动判断关卡是否有解,才把这个问题解决。

背景音乐也遇到一个小坑:中文输入法状态下,M 键会被输入法拦截,Pygame 收不到按键事件。后来改成空格键控制静音,问题解决。这个过程让我意识到,开发中很多问题不是代码逻辑问题,而是环境和交互问题。

AIGC 确实能提高效率,它可以快速给出框架、思路和代码片段。但它不是万能的。它生成的关卡可能无解,它写的边界条件可能越界,它给的动画可能效果不好。最终还是要靠自己去运行、去试玩、去判断。

这次作业让我更理解了“模块化”和“测试”的价值。把核心逻辑和界面分开后,逻辑可以单独测试,界面可以放心改。有了自动化测试,改代码时也不怕改坏。

最后看到自己做的开始界面、棋盘、箭头、动画、音乐组合在一起,能正常玩、能通关、能失败、能重开,还是挺有成就感的。


十、素材来源与版权说明

  • 本项目只参考“一箭又一箭”类游戏的基础玩法,没有复制原商业游戏的代码、素材、音效或关卡。
  • 箭头、云朵、星星、按钮、棋盘等均由 Pygame 图形 API 绘制。
  • 背景音乐来自 Pixabay,授权 CC0,可免费使用。
  • 项目中未包含密码、Cookie、API Key、Token 等敏感信息。
  • 本项目仅用于课程学习,不用于商业用途。
posted @ 2026-09-20 01:59  Vvvicky-  阅读(5)  评论(0)    收藏  举报