软工第二次作业

一、 作业信息

项目 内容
这个作业属于哪个课程 软件工程
这个作业要求在哪里 第二次作业
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏
学号 102401212
GitHub 仓库 https://github.com/sl666slsl/game1

二、 项目展示

联想截图_20260922213931

联想截图_20260922220446

联想截图_20260922220504

联想截图_20260922220428

联想截图_20260922220650

项目简介:
基于 Python 和 Pygame 开发的休闲解谜小游戏。玩家需要点击箭头使其飞出棋盘,前方有阻挡则失误+1。包含开始界面、游戏界面、通关界面和失败界面,支持 3 个不同难度的关卡。

游戏操作说明:

  • 鼠标左键点击箭头:若前方无阻挡,箭头飞出并消失;若有阻挡,失误+1,箭头抖动。
  • 右上角“重新开始”按钮:重置当前关卡。
  • 失误达到 3 次或通关全部关卡后,点击屏幕可重新开始。

三、 实现思路

1. 数据表示

游戏棋盘使用一个 GRID_ROWS x GRID_COLS 的二维列表 board 表示。每个格子存储箭头方向('up', 'down', 'left', 'right')或 None(空格)。

2. 核心逻辑:路径检测

路径检测函数 check_path(board, row, col, direction) 是游戏的核心。它根据箭头方向遍历同一行或同一列,判断前方是否有其他箭头阻挡。重点是要处理边界情况,避免数组越界(IndexError)。

3. 游戏状态管理

使用 state 变量管理游戏状态(STATE_START, STATE_PLAYING, STATE_WIN, STATE_LOSE)。通关后切换到 STATE_WIN,点击屏幕触发 next_level() 进入下一关。

4. 动画反馈

  • 飞出动画:点击后从棋盘移除箭头,并将其加入 flying_arrows 列表,每一帧更新位置,模拟飞出效果。
  • 碰撞动画:被阻挡时,触发 shake_timer,箭头变红并随机抖动几帧,提供视觉反馈。

四、 AIGC 使用过程(3 次代表性协作)

在本次开发过程中,我借助了 AIGC 工具(ChatGPT / DeepSeek)辅助开发,以下是 3 次具有代表性的协作记录:

协作 1:路径检测逻辑

  • 我的提问:“请用 Python 写一个函数,判断二维网格中某个箭头前方是否有其他箭头阻挡,需要处理边界情况。”
  • AI 实现:AI 给出了一个遍历同行/同列的代码框架。
  • 实际效果:代码逻辑基本正确,但在边缘格子(如最右列朝右的箭头)会报 IndexError 数组越界错误。
  • 人工修改:我手动修改了循环边界,增加了 if row < 0 or row >= GRID_ROWS: break 等判断,确保边缘箭头能正常飞出,修复了 T03 测试用例的 Bug。

协作 2:关卡设计与死局修复

  • 我的提问:“帮我生成 3 个‘一箭又一箭’的关卡数据,确保每个关卡都有解。”
  • AI 实现:AI 生成了包含多个箭头坐标和方向的列表。
  • 实际效果:前两关正常,但第三关出现了死局(某些箭头互相阻挡,导致无法全部消除)。
  • 人工修改:我手动推演了第三关的解法,调整了部分箭头的方向,重新设计了一组能确保通关的关卡数据,并编写了一个简单的“关卡求解器”验证了所有关卡都有解。

协作 3:解决 GitHub 推送网络问题

  • 我的提问:“git push 时报错 Connection reset 和 Repository not found,如何解决?”
  • AI 实现:AI 分析了可能是网络被墙或用户名拼写错误导致的。
  • 实际效果:在 AI 的指导下,我排查了用户名(发现 sl666slsl 末尾是字母 l 而不是数字 1),并改用 SSH 协议推送。
  • 人工修改:我生成了 SSH 密钥,添加到 GitHub,修改远程地址为 git@github.com:sl666slsl/game1.git,最终成功推送代码。这次经历让我学会了如何排查 Git 网络问题。

五、 测试结果

对程序进行了 T01-T06 的测试,结果如下:

编号 测试内容 预期结果 实际结果 是否通过
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失 箭头飞出并消失 ✅ 通过
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1 箭头变红抖动,失误+1 ✅ 通过
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误 正常飞出,无报错 ✅ 通过
T04 消除本关全部箭头 显示通关并进入下一关 显示通关,点击后进入下一关 ✅ 通过
T05 失误次数耗尽 显示失败并允许重新开始 显示“游戏失败”,可重开 ✅ 通过
T06 游戏进行中重新开始 箭头布局和失误次数恢复 重置为初始状态 ✅ 通过

六、 PSP 表格

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

七、 心得体会

这次作业是我第一次完整地使用 Python 和 Pygame 开发一个图形化小游戏。在这个过程中,AIGC 工具(如 ChatGPT)给了我很大的帮助,特别是在快速生成代码框架和提供实现思路上。

AI 带来的帮助:

  • 快速生成了 Pygame 的基础游戏循环和路径检测代码,节省了大量查文档的时间。
  • 在遇到逻辑 Bug(如边缘越界)时,AI 能帮我快速定位问题原因。

遇到的问题与收获:

  • AI 代码不能全信:AI 生成的路径检测代码在边缘条件下会报错,需要我手动修改循环边界;生成的第三关数据存在“死局”,需要我手动调整关卡设计。这让我深刻体会到,AI 是助手,而不是替代者,最终需要对代码负责的是程序员自己。
  • 网络与 Git 问题:在推送代码到 GitHub 时,我遇到了 Connection reset 和 Repository not found 等报错。通过排查,我发现是网络限制和用户名拼写错误(sl666slsl 末尾是字母 l 而非数字 1)导致的。最终通过生成 SSH 密钥并改用 SSH 协议推送成功。这次经历让我学会了 Git 的进阶用法和网络问题排查技巧,收获非常大。

通过这次作业,我不仅掌握了 Pygame 的基本用法,更学会了如何与 AI 协作、如何调试代码、如何解决工程中的实际问题。这些经验对我今后的软件开发学习非常有帮助。

posted @ 2026-09-22 22:08  sl66  阅读(14)  评论(0)    收藏  举报