软件工程第二次作业

博客素材("一箭又一箭"小游戏)


一、

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717
这个作业的目标 使用 Python 和 AIGC 完成"一箭又一箭"小游戏
学号 102401334
GitHub 仓库 https://github.com/joe-wang-max/arrow-by-arrow

二、项目展示

  • 开始界面:start

  • 游戏界面:image

  • 通关界面:image

GIF 录制

ani


三、项目介绍

本项目是一款点击式箭头解谜小游戏,参考微信小游戏《一箭又一箭》的核心玩法,使用 Python + Pygame 开发。

游戏规则: 棋盘上有若干带方向的箭头(上、下、左、右)。点击箭头时,程序检查其前进方向(同一行或同一列)到棋盘边界之间是否还有其他箭头:没有阻挡则箭头飞出并消除;有阻挡则箭头晃动变红提示碰撞,并消耗一次失误机会。清空当前关卡全部箭头即可进入下一关,失误次数耗尽则本关失败。

主要功能:

  • 开始界面、游戏界面、通关/失败结果界面;
  • 四个方向箭头的路径检测与阻挡判断;
  • 箭头飞出动画、碰撞晃动变红反馈;
  • 失误次数统计与显示;
  • 3 个可通关关卡、关卡切换、重新开始。

四、实现思路

1. 箭头和方向的表示

方向用二维向量 (dx, dy) 表示,屏幕坐标 y 向下:

UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)

关卡数据里方向用字符串 "up"/"down"/"left"/"right"(可读性好),加载时通过 settings.DIRECTIONS 字典映射成向量。

2. 关卡的表示

每个关卡是一个字典,箭头列表里每个元素是 (x, y, direction):

{
    "name": "第 1 关",
    "rows": 5, "cols": 5,
    "max_mistakes": 3,
    "arrows": [(0, 0, "right"), (3, 0, "up"), (4, 3, "right")],
}

棋盘用二维列表 grid[y][x] 存储,每个格子是 None 或方向向量。

3. 路径检测(核心)

判断箭头能否飞出的关键代码:

def can_escape(self, x, y):
    direction = self.arrow_at(x, y)
    if direction is None:
        return False
    dx, dy = direction
    cx, cy = x + dx, y + dy
    while 0 <= cx < self.cols and 0 <= cy < self.rows:
        if self.grid[cy][cx] is not None:   # 途中遇到其他箭头 -> 被阻挡
            return False
        cx += dx
        cy += dy
    return True                              # 走到边界都没遇到 -> 可飞出

思路:从箭头位置沿方向逐格前进到边界,途中只要遇到非空格就返回"被阻挡";能走完则返回"可飞出"。

关键点:用 while 循环 + 边界条件 0 <= cx < cols and 0 <= cy < rows,从根源上避免了数组越界(箭头位于边缘且朝外时,第一次判断就退出循环)。这也是作业 T03 专门要测的边界情况。


五、AIGC 使用过程

本次开发全程使用 Claude Code 辅助,以下是 5 次有代表性的协作记录:

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何 人工修改
需求分析与结构设计 Claude Code 分析作业要求,将项目拆分为 settings.py(配置)、game.py(核心逻辑)、levels.py(关卡数据)、main.py(界面渲染)四个模块 结构清晰,各模块职责单一,便于后续扩展和讲解 无,直接采用
路径检测 Claude Code 生成 can_escape 方法,用 while 循环沿方向逐格检查 四个方向判断正确,边界处理安全 审查后确认用 while 循环 + 边界判断(而非数组索引),从源头避免越界
碰撞反馈与飞出动画 Claude Code 生成飞出动画(箭头沿方向滑出棋盘)和碰撞反馈(箭头变红 + sin 函数晃动) 动画流畅、反馈明显 调整动画时长与晃动幅度参数
关卡设计 Claude Code 设计 3 个关卡的箭头布局 初版部分关卡存在循环依赖(死锁),无法通关 编写 DFS 求解器验证可通关性,发现死锁后重新设计,最终 3 关全部可通关
自动化测试 Claude Code 生成 T01–T06 测试脚本,覆盖四方向边界情况 13 项断言全部通过 无,测试结果与预期一致

说明:以上记录均来自真实开发过程,AI 生成代码后由本人运行、测试和审查确认。

image


六、测试结果

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头飞出并消失 通过
T02 点击前方有阻挡的箭头 箭头不消失,剩余失误次数减 1 箭头不消失,剩余失误减 1 通过
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误 四个方向均正常消失、无越界 通过
T04 消除本关全部箭头 显示通关并进入下一关 触发通关(剩余箭头为 0) 通过
T05 失误次数耗尽 显示失败并允许重新开始 触发失败(失误数达到上限) 通过
T06 游戏进行中重新开始 箭头布局和失误次数恢复 布局和失误次数均恢复 通过

测试脚本见仓库 test_game.py,运行 python test_game.py 可复现,共 13 项断言全部通过。

image


七、PSP 表格

任务 预估耗时(小时) 实际耗时(小时) 差异(小时)
需求分析与游戏设计 1 2 1
Python 与图形库学习 2 2 0
游戏界面实现 2 1 1
路径与碰撞逻辑实现 2 1 1
关卡设计 1 1 0
AIGC 辅助开发 2 1 1
测试与修改 1 1 0
README 与博客撰写 2 1 1
合计 13 10 3

八、附加功能

  • 计时与星级评价:

九、心得体会

  • AI 带来的帮助:Claude Code 能快速生成代码框架、路径检测逻辑、动画和测试用例,大幅缩短了从需求到可运行程序的时间;遇到问题(如关卡死锁)时也能协助定位和修正。
  • 出现的问题:AI 生成的关卡布局一度存在循环依赖导致无法通关,说明 AI 的输出不能直接信任,必须实际运行验证;路径检测的越界风险也需要人工审查才能避免。
  • 自己的收获:通过审查和修改 AI 代码,理解了路径检测的 while 循环边界判断思路、状态机的设计,以及"关卡可通关性"需要专门验证这一容易被忽略的工程问题。
posted @ 2026-09-19 13:08  王翔鹏  阅读(22)  评论(0)    收藏  举报