软件工程第二次个人作业

《一箭又一箭》:2D 网格逻辑解谜小游戏开发过程

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16718
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏,实践需求分析、图形交互、路径检测、测试与过程记录
学号 102402108

一、项目展示******

1、游戏概况
《一箭又一箭》是一款基于 Python Pygame 开发的 2D 网格逻辑解谜小游戏。游戏棋盘上摆放着带有不同朝向的箭头,玩家点击箭头后,箭头会沿着自身指向方向向前飞行;如果飞行路径上存在其他箭头阻挡,本次发射就会失败。玩家的目标是规划箭头发射的先后顺序,合理安排发射次序,让所有箭头顺利飞出棋盘,以此通关。每一关的布局各不相同,需要提前预判阻挡关系,不能盲目点击。游戏包含多组关卡、开始界面、游戏界面与通关结算界面,同时增加了基础动画美化。本项目在开发过程中借助 AIGC 工具辅助编写代码、排查程序 bug、优化界面视觉效果,并且对 AI 生成的内容进行人工测试、修改与验
2、游戏界面
(1)开始界面
屏幕截图 2026-09-22 184329
(2)进入游戏
a.开启游戏
屏幕截图 2026-09-22 184459
b.通过单关提示
屏幕截图 2026-09-22 184353
c.未通关提示
屏幕截图 2026-09-22 184427
d.全部通过
屏幕截图 2026-09-22 190026

二、项目介绍

1.需求构思
本次项目目标是制作一款轻量化 2D 逻辑解谜小游戏,不需要复杂操作与美术资源,重点考察玩家的预判与逻辑规划能力。选择网格棋盘 + 箭头发射的核心玩法,原因是规则简单易懂、代码体量小,适合用 Pygame 快速实现,同时方便借助 AIGC 辅助开发。
游戏核心规则:棋盘上存在多个不同方向的箭头,点击箭头会沿着箭头指向向前移动;若路径上存在其他箭头阻挡,则本次发射失败。玩家需要思考合理的发射顺序,将全部箭头移出棋盘完成关卡。
2.核心机制设计
*网格棋盘:采用固定大小二维数组存储关卡布局,数组中记录每个格子箭头的方向,便于关卡配置、读取与修改。
*箭头发射判定:点击箭头后,程序沿箭头方向逐格检测前方格子,判断路径是否存在其他箭头。无障碍物则持续移动直到飞出棋盘;存在阻挡则发射失败。
*关卡设计:多关卡递进,关卡布局由简单到复杂。初级关卡阻挡关系简单,只需要少量推理;后续关卡箭头互相牵制,需要提前规划发射先后顺序,增加思考难度。
*界面与交互设计:设计三级界面:开始菜单、游戏界面、通关结算界面。增加基础动画效果,如箭头飞行动画、通关提示动画,提升游玩体验;鼠标点击作为唯一操作方式,降低上手门槛。
3.开发思路与技术选型
*使用 Python + Pygame 库实现。Pygame 适合快速开发 2D 小游戏,能够轻松完成窗口渲染、鼠标事件监听、图形绘制、动画效果。
*开发流程:先完成基础棋盘渲染与箭头发射核心逻辑,再逐步调试 bug,接着补充多关卡、界面切换,最后美化视觉与动画。开发全程使用 AIGC 辅助编写代码、排查 bug、优化界面,人工校验、修改 AI 生成代码,保证程序逻辑正确。
4.设计目标
-玩法层面:规则简单,上手容易,但关卡具备足够的逻辑思考空间。
-项目层面:完成完整可运行的小游戏,实现界面跳转、关卡切换、胜负判定等基础功能;学习使用 AIGC 辅助软件开发,学会甄别与修改 AI 生成的代码。

三、开发思路与核心算法

1. 数据结构设计

采用二维列表存储关卡棋盘数据,None代表空白格子,字符串"up"/"down"/"left"/"right"代表四个方向的箭头。所有关卡统一存入LEVELS列表,每个关卡为独立二维数组,便于切换加载。
定义常量ROWSCOLSCELL_SIZE控制棋盘行列数与单元格尺寸,通过网格行列号 × 单元格大小,将网格坐标映射为 Pygame 窗口像素坐标,完成棋盘渲染定位。
方向映射字典DIR_MAP将方向字符串转为坐标增量(dr, dc),统一路径检测的移动步长。

2. 核心算法:射线式路径检测

check_path(r,c,dr,dc)函数为本游戏核心算法。采用射线扫描思想,从点击箭头的相邻格子开始,沿着箭头方向持续循环向前遍历网格:

def check_path(self, r, c, dr, dc):
    nr, nc = r + dr, c + dc
    while 0 <= nr < ROWS and 0 <= nc < COLS:
        if self.board[nr][nc] is not None:
            return False
        nr += dr
        nc += dc
    return True

循环持续沿方向前进,只要在棋盘范围内遇到非空格子(存在箭头),直接返回 False,表示路径被阻挡;若循环走出棋盘边界,返回 True,代表路径通畅,可以发射箭头。
该算法可以一次性跳过多个空白格子,检测整条直线上的阻挡,是解谜逻辑的基础。

3. 游戏状态机设计

使用字符串常量定义 3 种游戏状态:STATE_START开始界面、STATE_PLAY游戏游玩、STATE_RESULT结算界面。Game类的self.state变量保存当前状态,主循环根据状态执行不同绘制与交互逻辑。

  • 开始界面:展示游戏标题、规则与开始按钮;
  • 游玩界面:渲染棋盘、监听鼠标点击、执行箭头发射逻辑;
  • 结算界面:根据失误次数判断通关 / 失败,展示对应按钮。
    状态切换触发条件:点击开始按钮、全部箭头清空、失误次数达到上限、切换关卡 / 返回主页。

4. 交互逻辑实现

主事件循环监听鼠标左键点击事件,handle_click函数处理点击逻辑:

  1. 判定当前游戏状态,区分按钮点击与棋盘格子点击;
  2. 点击棋盘时,换算鼠标像素坐标得到网格行列;
  3. 读取格子内箭头方向,调用路径检测函数;
  4. 路径通畅:创建飞行箭头对象,将棋盘该位置置为None,启动飞行动画;
  5. 路径阻挡:失误计数 + 1,开启屏幕抖动反馈;失误达到上限,切换到失败结算界面。

5. 动画与粒子更新思路

update()函数中逐帧更新所有动态元素:

  1. 箭头发飞与残影flying_arrow保存飞行箭头的位置、方向,每帧更新偏移量;飞行过程持续生成残影对象,残影随生命周期衰减;箭头飞出窗口后销毁。
  2. 屏幕抖动:发射失败时开启抖动计时器,绘制棋盘时叠加随机偏移,计时器归零后关闭抖动。
  3. 通关粒子:关卡全部箭头清空后,调用spawn_particles()生成彩带粒子;粒子带有初速度、重力衰减与生命周期,超出生命后移除。

6. 关卡管理思路

load_level(idx)函数加载指定关卡,拷贝关卡二维数组赋值给self.board,同时重置失误计数、动画对象。
count_remaining()遍历棋盘统计剩余箭头数量,当剩余箭头为 0 判定为本关通关,自动生成通关粒子并进入结算界面。
关卡数组预先人工校验,保证每一关存在可行通关顺序,消除死锁布局。

7. 渲染绘制思路

将渲染逻辑拆分为draw_start()draw_play()draw_result()三个函数,对应不同游戏状态。

  • 不使用系统SysFont,改用pygame.font.Font(None, size)内置字体,规避 Windows 注册表字体闪退 bug;
  • 自定义draw_arrow函数,使用基础几何图形绘制箭头,完全不依赖字符;
  • draw_gradient_bg逐行绘制实现渐变背景,增加背景星星装饰、圆角按钮、阴影面板提升视觉效果。

8. 主循环框架

采用标准 Pygame 固定帧率循环:事件监听 → 执行逻辑更新update() → 画面绘制draw() → 刷新屏幕,帧率锁定 60FPS,保证动画稳定。

四、AIGC使用过程

子任务名称 借助的 AIGC 工具名称 AI 具体实现了什么 最终效果 人工修改 / 验证部分
游戏核心逻辑初版搭建 豆包大模型 生成 pygame 基础游戏框架,实现棋盘渲染、四方向箭头点击发射、路径阻挡检测、失误计数、3 个关卡的基础代码 游戏可以跑通基本流程,具备完整的开始 / 游戏 / 结算三界面结构 人工逐行核对路径检测边界判断,修复数组越界隐患,确认点击格子坐标映射正确
窗口闪烁闪退问题排查 豆包大模型 定位到事件循环中重复调用绘制函数导致闪屏的问题,给出 "事件只处理逻辑、绘制统一在主循环执行" 的修改方案 解决了点击按钮时画面闪烁的问题,渲染帧率稳定 人工调整按钮矩形缓存逻辑,确认一帧只调用一次 display.flip ()
Windows 字体崩溃 bug 修复 豆包大模型 识别出 pygame 2.5.2 在 Windows 系统调用 SysFont 读取注册表触发 int 类型解析异常的 bug,给出替换为内置 Font (None, size)、改用几何图形绘制箭头的兼容方案 游戏在 Windows Python3.12 环境下正常启动,不再闪退,箭头显示清晰无乱码方框 人工将所有箭头从字符渲染改为几何多边形绘制,验证不同分辨率下箭头大小比例协调
界面视觉美化 豆包大模型 生成渐变深蓝背景、星星装饰、棋盘卡片阴影、按钮悬浮变色、箭头飞出残影、通关彩带粒子的代码 界面从朴素黑白方块升级为具备游戏感的视觉效果,动画流畅 人工调整配色对比度,修改棋盘格子交替色,优化抖动动画幅度,避免视觉刺眼
关卡死锁问题调整 豆包大模型 识别出关卡中双向对顶箭头互相阻挡导致无法通关的问题,逐行调整关卡数组,移除互锁箭头 3 个关卡全部可以顺利通关,不存在点不动的死锁布局 人工逐关试玩验证发射顺序,确认剩余箭头计数显示和棋盘实际箭头数量完全一致

五、测试结果

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 触发箭头发飞动画,动画播放完成后,棋盘二维数组中该箭头位置置为None,箭头从棋盘数据中删除,界面不再显示 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数 + 1 箭头保留在原网格不变,触发屏幕抖动反馈,失误计数error_count自增 1;失误达到上限后跳转失败结算界面 通过
T03 点击边缘且朝向棋盘外的箭头 正常消失,不发生越界错误 路径检测函数识别箭头方向直接出界,判定路径通畅;箭头正常执行飞行动画并删除,无数组下标越界、程序崩溃异常 通过
T04 消除本关全部箭头 显示通关界面,点击 “下一关” 后进入下一关 count_remaining()统计剩余箭头为 0,触发通关彩带粒子效果,切换至结算界面;点击下一关按钮,加载下一关二维关卡数组,重置失误计数与动画状态 通过
T05 失误次数耗尽 显示失败并允许重新开始 error_count >= max_error(3),自动切换到失败结算界面;点击 RETRY 按钮,调用load_level重新加载当前关卡,棋盘布局重置,失误清零 通过
T06 游戏进行中重新开始 布局和失误次数恢复 点击 RESTART 按钮,执行关卡加载函数,棋盘恢复为本关原始布局,失误计数清零,飞行箭头、残影、粒子等动画对象全部清空 通过

测试结论

  1. 全部 6 项功能测试用例均通过,游戏核心逻辑(路径检测、箭头发射、失误统计、关卡切换、界面状态跳转)运行正常。
  2. 边界场景测试有效:射线路径检测可以正确识别边界箭头,不存在数组越界报错。
  3. 附加交互反馈:失败抖动动画、通关彩带粒子、箭头飞行残影等视觉效果均可正常工作,提升交互体验。
  4. 代码兼容性优化:放弃系统SysFont,采用几何绘图绘制箭头,规避 Windows 字体相关闪退 bug,程序稳定性良好。

六、PSP表格

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

七、心得体会

本次项目我使用 Python 和 Pygame 完成箭头射击小游戏,借助 PSP 个人软件过程对开发任务进行工时规划,完整经历了需求分析、编码实现、功能测试等软件开发全流程。
在开发中我发现,前期工时预估存在偏差,低估了图形库学习和代码调试的工作量。AIGC 可以快速生成基础代码,但需要人工进行大量修改与 bug 修复,它只是开发辅助工具,无法代替逻辑思考与代码调试。实现路径检测、关卡切换等核心功能时,我学会将复杂功能拆分为多个小模块逐步开发。同时在排错过程中,锻炼了问题定位能力。在测试环节,我设计多组测试用例,覆盖正常场景与边界场景,认识到软件测试对保障程序稳定的重要性。
本次项目也暴露了我在项目时间预估上的不足,没有预留充足的调试缓冲时间。今后进行项目开发时,我会做好前期设计,更加合理评估工作量,进一步提升项目管理与代码开发能力。

posted @ 2026-09-22 21:31  阿合加依娜尔  阅读(7)  评论(0)    收藏  举报