软件工程第二次个人作业

项目:一箭又一箭 Python小游戏开发

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/16717
这个作业的目标 使用 Python + Pygame,借助AIGC工具完成“一箭又一箭”箭头解谜小游戏,实现箭头路径检测、关卡管理、动画反馈、多界面切换等功能,理解图形界面开发与游戏状态管理。
学号 102401202
GitHub 仓库 https://github.com/hongyalin/arrow-shoot-game

一、项目展示

1. 开始界面:游戏主页,展示游戏标题,点击开始游戏进入关卡

游戏主页

2. 游戏界面:显示棋盘网格、方向箭头、关卡号、剩余箭头、剩余失误次数、计时、重新开始按钮、提示按钮

游戏页面

3. 成功界面:清除全部箭头后弹出通关弹窗,展示用时,支持下一关/返回主页

成功页面

4. 失败界面:失误次数耗尽,弹出失败弹窗,支持重试/返回主页

失败页面

5.碰撞反馈:当箭头碰到前方阻挡时,会变红向前移动至碰到阻挡后返回

碰撞反馈

6.提示效果:当点击提示图标时,前方无阻挡的箭头会变黄闪烁。每关最多提示两次。

提示效果

7.重新开始效果:当点击重新开始时,该关游戏页面会回归最初状态。

重新开始

8.全部关卡通关页面:
完成全部关卡后

二、项目介绍

1.游戏规则

本项目是点击式箭头解谜小游戏,参考微信小游戏《一箭又一箭》核心玩法,独立实现所有代码与素材。

  1. 棋盘网格内存在上、下、左、右四个方向的箭头。
  2. 玩家点击箭头,程序检测箭头前进方向:
    • 如果箭头朝向棋盘外的路径上没有其他箭头阻挡,箭头播放飞出动画,然后从棋盘消除。
    • 如果路径存在其他箭头阻挡,箭头播放碰撞回弹动画,本次点击消耗1次失误机会。
  3. 玩家一共有3次失误机会,失误次数耗尽则本关失败。
  4. 清空本关卡所有箭头,即可通关,进入下一关卡。
  5. 游戏内置3个可通关关卡,支持随时点击【重新开始】重置当前关卡。

2.界面设计

游戏一共包含3类页面:

  1. 开始界面:带有美化背景图,游戏标题、游戏操作提示、开始游戏按钮。
  2. 游戏界面:浅蓝简约风格背景,绘制网格棋盘;顶部显示关卡编号、剩余箭头数量、计时、红心血条(剩余失误次数);右上角【重新开始】按钮;右下角提示锦囊按钮;点击箭头有飞出/碰撞动画反馈。
  3. 结果界面:分为通关成功界面、失败界面,使用独立背景图,中间弹窗展示文字信息与操作按钮。

3.主要功能

  • 鼠标点击箭头交互
  • 四方向路径检测与阻挡判断
  • 箭头飞出、碰撞回弹动画效果
  • 失误次数(红心)显示与消耗
  • 3个可通关关卡,关卡自动切换
  • 计时功能、剩余箭头计数
  • 提示锦囊功能(附加功能)
  • 多页面状态管理:start / play / win_level / win / lose / all_clear
  • 背景图片加载,美化UI(附加功能)

三、实现思路

1. 数据结构设计

  • 方向常量UP=0, DOWN=1, LEFT=2, RIGHT=3,搭配方向偏移数组DIR_OFFSET,存储每个方向xy移动增量。
  • 箭头类 Arrow:封装箭头坐标x,y、方向dire;保存动画状态:flying(是否飞出)、block_anim(碰撞回弹动画)、locked(被阻挡锁定)、hint_highlight(提示高亮标记),提供update()更新动画、draw()绘制箭头文字与动画。
  • 关卡数据 LEVELS:使用列表存储每一关所有箭头坐标+方向,每一关是一个子列表。
  • 游戏状态 state:使用字符串标记游戏当前页面状态,start主页、play游戏棋盘、win_level单关通关、win全部通关、lose关卡失败。

2. 核心:路径检测算法

关键代码片段

def check_path(self, arrow):
    dx, dy = DIR_OFFSET[arrow.dire]
    cx, cy = arrow.x, arrow.y
    while True:
        cx += dx
        cy += dy
        # 判断是否到达棋盘边界
        if cx < 0 or cx >= GRID_COLS or cy <0 or cy >= GRID_ROWS:
            return True, 0 # 无阻挡,可以飞出
        # 检查路径上是否存在其他箭头
        for a in self.arrows:
            if a.x == cx and a.y == cy:
                # 存在阻挡,返回碰撞距离
                return False, math.hypot((cx-arrow.x)*CELL_SIZE, (cy-arrow.y)*CELL_SIZE)

逻辑说明:

  1. 获取箭头方向对应的 x、y 步长。

  2. 沿着箭头方向一格一格向前遍历。

  3. 如果坐标超出棋盘边界:路径畅通,箭头可以飞出。

  4. 如果遍历到任意其他箭头的坐标:判定被阻挡,返回 False,同时计算碰撞距离用于回弹动画。

3. 游戏状态流转

1.程序启动 → 进入start主页,点击开始游戏,加载第 0 关,切换play状态。

2.在play状态:玩家点击箭头,执行路径检测。

  • 可飞出:箭头开启飞出动画,动画结束后从 arrows 列表删除;判断 arrows 列表是否为空,为空进入win_level单关通关。

  • 被阻挡:开启碰撞回弹动画,失误次数mistake +=1;判断失误次数是否等于最大值,达到上限进入lose失败页面。

3.通关页面:点击下一关,加载下一关数据;全部 3 关打完,进入最终全部通关页面。

4.失败页面:点击重新开始,重置当前关卡所有数据,回到play状态。

4. 动画与界面绘制

绘制遵循先画背景图,再绘制面板、文字、网格、箭头、按钮的顺序。

  • 飞出动画:箭头沿着方向持续偏移,到达边界后移除。

  • 碰撞动画:箭头向前移动一小段,再回弹回到原位置,使用缓动函数实现平滑效果。

四、AICG使用过程记录

子任务 借助何种 AIGC 技术 AI 实现或提供了什么 效果如何 人工修改
路径检测逻辑 豆包 生成上下左右 4 个方向的路径检测代码,循环遍历判断前方是否存在箭头 基础逻辑正确,但向上检测时存在数组越界风险,边界判断不完善 修改边界判断条件,调整循环终止逻辑,增加距离计算用于碰撞动画
箭头碰撞与飞出动画 豆包 生成 Arrow 类的动画更新、缓动函数代码,实现箭头移动效果 动画可以运行,但是回弹速度过快,动画不够顺滑 修改 ease_in_out_sine 缓动函数,调整动画步长,优化动画时长
界面美化与多页面背景加载 豆包 编写图片加载代码,提供多状态页面绘制模板 图片加载代码写在窗口初始化之前,触发 pygame 报错,缺少异常容错 调整图片加载顺序,增加 try-except 捕获图片缺失异常,修改 draw 函数,保证先绘制背景再绘制弹窗面板

五、测试结果

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头播放飞出动画,飞出棋盘并消失 箭头正常飞出并从列表移除 通过
T02 点击前方有阻挡的箭头 箭头触发碰撞回弹动画,不消失,失误次数 - 1 箭头回弹,红心减少一颗 通过
T03 点击位于边缘、朝向棋盘外的箭头 箭头正常飞出,不发生数组越界报错 箭头正常飞出,无程序崩溃 通过
T04 消除本关全部箭头 清空所有箭头后,弹出通关弹窗,可进入下一关 全部箭头消除后,自动切换通关界面,点击下一关加载新关卡 通过
T05 失误次数耗尽 失误次数等于最大限制,弹出失败界面,支持重新开始 红心全部消失,进入失败页面,重试按钮可以重置关卡 通过
T06 游戏进行中点击重新开始 当前关卡箭头布局、失误次数、计时全部恢复初始状态 棋盘重置,红心恢复 3 颗,计时清零 通过

六、PSP表格

任务 预估耗时(小时) 实际耗时(小时) 差异(小时)
需求分析与游戏设计 2 1 -1
Pygame 图形库学习 3 4 +1
游戏界面实现(页面、按钮、文字) 4 2 -2
路径检测与碰撞逻辑实现 4 5 +1
关卡设计与关卡试玩验证 2 1 -1
AIGC 素材生成 1 3 +2
测试与 Bug 修改 2 3 +1
README 文档与博客撰写 2 4 +2
合计 20 23 +3

七、心得体会

本次作业使用 Python 和 Pygame 完成 “一箭又一箭” 小游戏,并且借助 AIGC 工具辅助开发。AIGC 在代码模板编写、算法思路参考、美术素材生成、文档撰写方面提供了很大帮助,能够快速搭建项目基础框架,节省大量重复代码编写时间。

但是 AI 生成的代码存在明显缺陷:边界条件考虑不全、代码顺序错误、动画参数不符合预期,不能直接复制粘贴运行。我必须读懂每一段代码,手动调试、修改边界逻辑、修正 bug,测试每一个关卡,才能保证程序稳定运行。

通过本次项目,我理解了游戏状态管理、二维网格坐标、路径遍历检测的原理,学会 Pygame 图形绘制、动画实现、图片资源加载。同时认识到,AI 是辅助开发工具,开发者必须掌握代码逻辑、完成测试验证,对最终代码负责。

在开发过程中,我额外增加了计时、提示锦囊等附加功能,进一步熟悉了界面交互和动画效果开发。本次项目的经验,也让我对小型图形化软件项目的完整开发流程有了完整认知。

posted @ 2026-09-20 21:39  广陵鸭梨  阅读(13)  评论(0)    收藏  举报