2026秋软件工程第二次作业——一箭又一箭游戏开发
2026秋软件工程第二次作业——一箭又一箭游戏开发
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/ |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏 |
| 学号 | 102401431 |
| GitHub 仓库 | https://github.com/LinkWalker/arrow-game |
一、项目展示

图1:第一关游戏界面(点击箭头使其飞出)

图2:第一关通关,提示按空格进入下一关

图3:失误次数耗尽,提示失败,可按 R 键重开

图4:第二关游戏界面(需要先点击右上角的 U 才能解开阻挡)

图5:第三关游戏界面(包含四个方向,难度稍微提升)

图6:全部通关界面,提示按 R 键重新开始
二、项目介绍
本项目基于 Python + Pygame,实现了一个点击式箭头解谜小游戏。游戏规则如下:
- 棋盘中包含上、下、左、右四种方向的箭头。
- 玩家点击某个箭头后,程序会检查该箭头前进方向上的路径。
- 如果前方没有其他箭头阻挡,该箭头会飞出棋盘并消失。
- 如果前方有阻挡,箭头会晃动提示,并消耗一次失误机会。
- 失误次数上限为 3 次,耗尽则本关失败。
- 清空当前关卡全部箭头即可通关并进入下一关。
游戏包含开始界面、游戏界面以及通关/失败界面,内置 3 个可通关关卡,并提供了右上角按钮和键盘 R 键两种重新开始的方式。
三、实现思路
1. 箭头与关卡表示
游戏使用二维网格(5x5)表示棋盘。箭头使用 (row, col, direction) 来标识。其中 direction 使用字符 'U', 'D', 'L', 'R' 表示上下左右。
方向映射使用字典实现:
DIRS = {'U': (-1, 0), 'D': (1, 0), 'L': (0, -1), 'R': (0, 1)}
ARROW_TEXT = {'U': '↑', 'D': '↓', 'L': '←', 'R': '→'}
关卡数据使用字符串数组表示,'.' 表示空位,方向字符表示该位置有一个箭头。例如第一关:
["R....",
".....",
".....",
".....",
"....U"]
2. 路径检测与碰撞逻辑
路径检测的核心是 can_fly 函数。从当前箭头所在位置出发,沿着它的方向逐格前进:
def can_fly(self, arrow):
dr, dc = DIRS[arrow.direction]
r = arrow.row + dr
c = arrow.col + dc
while 0 <= r < ROWS and 0 <= c < COLS:
for a in self.arrows:
if a is not arrow and a.row == r and a.col == c:
return False # 遇到其他箭头,被阻挡
r += dr
c += dc
return True # 走到边界,无阻挡,可以飞出
只要在前进路径上遇到任何其他箭头,就返回 False(阻挡);如果走到棋盘外,说明前方畅通,返回 True(可飞出)。
点击箭头时,若 can_fly 为真,则播放飞行动画并移除;若为假,则晃动并扣减失误次数。鼠标点击坐标通过反向计算转换为 (row, col) 来进行判定。
四、AIGC 使用过程
本次开发使用了 DeepSeek 进行辅助,以下为 3 次具有代表性的 AIGC 协作过程记录。虽然 AI 极大地提高了效率,但也暴露出了许多必须在实际运行中才能排查的问题。
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 游戏窗口与字体绘制 | DeepSeek | 生成 Pygame 初始化及 SysFont 绘制文字代码 |
代码在 Python 3.13 环境下直接崩溃报错 | 排查发现是版本兼容性 Bug,改用 pygame.font.Font("C:/Windows/Fonts/simhei.ttf") 指定本地字体路径后解决 |
| 方向与路径检测 | DeepSeek | 生成四方向路径检测 can_fly 函数 |
运行时只有右下角箭头能飞,其他方向逻辑错乱 | 检查代码发现 DIRS 字典中的行列映射反了(把 (0, -1) 当成上了),修正为 (-1, 0) 后逻辑全部正常 |
| 重新开始功能(R键) | DeepSeek | 生成键盘按键事件处理逻辑 | 游戏中按 R 键无反应,且受中文输入法影响 | 增加大小写兼容判断 if event.key in (pygame.K_r, pygame.K_R),并调整状态机使其在游戏进行中也生效 |
五、测试结果
在开发完成后,针对基础功能进行了 T01-T06 的手工测试,结果如下:
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头正常飞出并消失 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 箭头晃动,显示“被阻挡”,失误加 1 | 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 正常消失,无报错 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 正常显示通关并切换关卡 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 显示失败,点击按钮或按 R 可重开 | 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 点击右上角按钮或按 R 键均可恢复初始状态 | 通过 |
六、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1 | 1 | 0 |
| Python 与图形库学习 | 2 | 2 | 0 |
| 游戏界面实现 | 2 | 2 | 0 |
| 路径与碰撞逻辑实现 | 2 | 3 | +1 |
| 关卡设计 | 1 | 0.5 | -0.5 |
| AIGC 辅助开发 | 1 | 2 | +1 |
| 测试与修改 | 1 | 1 | 0 |
| README 与博客撰写 | 1 | 1.5 | +0.5 |
| 合计 | 11 | 13 | +2 |
七、心得体会
通过本次“一箭又一箭”小游戏的开发,我熟练掌握了 Pygame 的基本用法和二维网格路径检测算法的实现。
在使用 AIGC 辅助开发的过程中,我深刻体会到了 AI 带来的便利,它能够快速生成基础框架和逻辑代码。但同时我也认识到,AI 生成的代码绝不能直接信任并提交。比如这次遇到的 Python 3.13 字体崩溃、方向映射逻辑错乱以及 R 键失效等问题,都是 AI 没有考虑到的实际运行环境差异和细节交互。只有通过自己不断地运行、排查报错、修改边界条件,才能真正让程序稳定运行。
这次作业不仅锻炼了我的编码能力,更让我学会了如何将 AI 作为辅助工具,结合自己的思考去解决问题。
浙公网安备 33010602011771号