软件工程第二次作业

Python 作业:基于 Pygame 的“一箭又一箭”小游戏开发记录

0. 作业基本信息

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏,掌握 Pygame 开发及 Git 工作流
学号 102402131
GitHub 仓库 https://github.com/mth102402131/arrow-game-python

1. 项目展示

本项目是一个基于 Python pygame 库开发的益智解谜游戏。玩家需要通过逻辑判断,按正确顺序点击箭头,使其飞出棋盘。

1.1 开始界面

游戏启动后显示主菜单,包含游戏标题和开始按钮。
image

1.2 游戏过程

玩家在网格棋盘上操作。绿色/蓝色箭头表示可操作对象。

  • 成功操作:箭头沿指向飞出屏幕。
  • 失败操作:箭头抖动,剩余失误次数减少。
    image

1.3 通关与失败

  • 通关:消除所有箭头后,进入下一关。
  • 失败:失误次数耗尽后,显示失败界面,支持立即重试当前关卡(无需返回主页)。
    image

演示视频/GIF
动画
动画3


2. 项目介绍

2.1 游戏规则

  1. 目标:消除棋盘上所有的箭头。
  2. 操作:鼠标左键点击箭头。
  3. 判定
    • 如果箭头指向的方向直到棋盘边缘都没有其他箭头阻挡,则消除成功,箭头飞出。
    • 如果前方有其他箭头阻挡,则消除失败,箭头抖动,且玩家失去一次失误机会。
  4. 胜负
    • 所有箭头消除 -> 通关。
    • 失误次数(默认 3 次)耗尽 -> 失败。

2.2 界面设计

  • 顶部 UI 栏:显示当前关卡数、剩余失误次数、剩余箭头数量、重置按钮。
  • 游戏区域:8xN 的网格棋盘,背景为浅蓝色,网格线清晰。
  • 配色:使用高对比度颜色(蓝、红、绿)区分状态,确保视觉清晰。

2.3 主要功能与特色

  • 即时反馈:点击无效时有明显的红色抖动动画。
  • 友好重试:失败后直接重置当前关卡,减少重复操作,提升体验。
  • 多关卡支持:内置 3 个难度递增的关卡,数据结构易于扩展。

3. 实现思路

3.1 数据结构

  • 箭头 (Arrow):使用类 Arrow 封装,属性包括 row, col (坐标), direction (0-3 代表上下左右), active (是否存活)。
  • 关卡 (Levels):使用列表嵌套元组存储,例如 [(2, 2, LEFT), ...],方便快速加载。

3.2 核心逻辑:路径检测 (check_path)

这是游戏最关键的算法。当玩家点击一个箭头时,需要判断其前方是否有阻挡。

算法流程

  1. 获取当前箭头的方向向量 (dr, dc)
  2. 从当前位置 (r, c) 开始,沿向量步进:(r+dr, c+dc), (r+2dr, c+2dc)...
  3. 在每一步检查:该坐标是否存在其他 active 状态的箭头?
    • 若存在 -> 返回 False (有阻挡)。
    • 若超出棋盘边界 -> 返回 True (无阻挡)。

4. AIGC 使用过程

在本次开发中,我利用 AI 助手辅助完成了代码结构设计、Bug 修复和功能迭代。以下是 3 次具有代表性的协作过程:

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何 人工修改
项目框架搭建与需求分析 Qwen 提供基于 pygame 的标准 Game Loop 结构,定义 Arrow 类与 Game 管理类,给出状态机(START / PLAYING / GAME_OVER)设计建议 快速确立 MVC 模式雏形,跳过 pygame API 摸索阶段,可直接进入业务逻辑开发 根据实际关卡需求微调了类的属性字段与状态命名
核心逻辑 Bug 修复(路径检测) Qwen 指出 check_path 循环终止条件问题,引入"步进向量"概念,增加棋盘边界显式检查,并建议使用 while steps < MAX_STEPS 防止死循环 修复了边缘箭头点击时的 IndexError 越界 Bug,路径检测准确率提升至 100% 结合实际网格尺寸调整了 MAX_STEPS 阈值并补充了单元测试用例
用户体验优化(失败重试机制) Qwen 给出 handle_click 函数修改方案,将 self.state = "START" 改为 self.load_level(self.current_level_idx),并建议同步更新 UI 文字 实现无缝重试本关功能,避免失败后强制返回主菜单,大幅提升游戏流畅度 进一步扩展为"重试本关 / 下一关 / 选关"多按钮布局,并美化了提示文案

5.测试结果

编号 测试内容 预期结果 实际结果 结论
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头播放飞行动画后消失 Pass
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头红色抖动,UI 计数 -1 Pass
T03 点击位于边缘且朝向外的箭头 正常消失,无报错 正常消失,控制台无 Error Pass
T04 消除本关全部箭头 显示通关并进入下一关 显示"关卡通过",可点下一关 Pass
T05 失误次数耗尽 显示失败并允许重新开始 显示"挑战失败",点击可重置本关 Pass
T06 游戏进行中点击重置 箭头布局和失误次数恢复 所有箭头复位,计数回满 Pass

6. PSP 表格

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

7.1 AI 带来的帮助

这次作业让我深刻体会到了 AIGC 作为“结对编程”伙伴的强大。
加速起步:AI 生成的 Pygame 模板代码让我跳过了繁琐的初始化配置,直接进入业务逻辑开发。
逻辑查漏:在编写路径检测算法时,我自己很难考虑到所有边界情况(如数组越界),AI 敏锐地指出了潜在风险并给出了防御性编程的建议。
即时反馈:遇到报错时,直接把错误日志丢给 AI,它能迅速定位问题(比如这次 Git 推送失败的身份配置问题),节省了大量查 StackOverflow 的时间。

7.2 出现的问题与解决

Git 身份配置:第一次提交时遇到了 Author identity unknown 错误。通过 AI 指导,学会了使用 git config 配置全局用户信息,并理解了 Commit 的意义。
坐标系混淆:Pygame 的 Y 轴向下增长,这与数学坐标系不同,导致初期箭头方向判断出错。通过打印调试和 AI 解释,理清了 row 和 y 的对应关系。

posted @ 2026-09-22 19:44  102402131马天鸿  阅读(5)  评论(0)    收藏  举报