软件工程第二次作业 ——“一箭又一箭” 游戏开发
别乱点箭头!—— 一箭又一箭开发踩坑日记
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
| 这个作业要求在哪里 | 软件工程第二次作业 |
| 这个作业的目标 | 使用 Python 和 AIGC 完成“一箭又一箭”小游戏 |
| 学号 | 102402110 |
| GitHub 仓库 | aaarctic-ArrowGame |
一、项目展示
1.1 开始界面
游戏启动后进入开始界面,界面上方是游戏标题“一箭又一箭”和副标题“观察方向 · 规划顺序 · 清空所有箭头”,下方分为左右两个说明面板,分别介绍玩法和挑战目标。底部提供四个按钮:开始游戏、选择关卡、游戏规则、操作提示。
下方GIF展示开始界面、游戏规则、选关界面以及开始游戏的第一关。
可以看到游戏界面显示了:当前关卡;游戏棋盘;剩余箭头数量;剩余失误次数;重新开始按钮。
1.2 游戏界面
游戏界面顶部为状态栏,显示游戏标题、当前关卡、剩余箭头数、剩余失误次数、剩余时间以及一个时间进度条。右上角是“重来”按钮。中间是 6×6 的棋盘,黄色箭头表示当前还未飞出的箭头。
点击成功时,箭头会以绿色飞行动画飞出棋盘,格子闪烁绿色;点击失败时,棋盘会左右晃动,格子闪烁红色,同时失误次数减 1。
1.3 通关与失败界面和重新开始按钮
当清空全部箭头后,进入通关结果页,显示“挑战成功!”、当前关卡和本次得分。当失误次数耗尽或倒计时结束时,进入失败结果页,显示失败原因,并提供“再玩一次”“选择关卡”“返回主页”三个按钮。
成功界面

失败界面

重新开始按钮

1.5 测试视频——三个关卡试玩
包含:
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误
T04 消除本关全部箭头 显示通关并进入下一关
T05 失误次数耗尽 显示失败并允许重新开始
T06 游戏进行中重新开始 箭头布局和失误次数恢复
第一关
通关:
不通关:
进行中重新开始:
第二关
通关:
不通关:
进行中重新开始:
第三关
通关:
不通关:
进行中重新开始:
二、项目介绍
2.1 项目背景
本项目是一款基于 Python 和 Pygame 开发的箭头消除类益智小游戏。
游戏中会在棋盘上随机生成不同方向的箭头,玩家需要根据箭头的方向判断其前方是否存在其他箭头。如果箭头前方没有其他箭头阻挡,则可以点击该箭头,使其沿指定方向飞出棋盘。
玩家需要在规定时间内消除关卡中的全部箭头,并尽可能减少错误操作。
2.2 游戏目标
游戏的主要目标是:
- 判断箭头的移动方向;
- 判断箭头前方是否存在阻挡;
- 点击可以正常移动的箭头;
- 将棋盘上的全部箭头消除;
- 在规定时间内完成关卡;
- 控制错误操作次数,避免游戏失败。
2.3 主要功能
项目主要实现了以下功能:
- 开始游戏;
- 关卡选择;
- 多个难度不同的游戏关卡;
- 四个方向的箭头;
- 箭头路径检测;
- 箭头阻挡判断;
- 箭头飞出动画;
- 点击错误提示;
- 错误次数限制;
- 游戏倒计时;
- 游戏进度显示;
- 通关提示;
- 失败提示;
- 重新开始;
- 返回关卡选择;
- 游戏玩法说明。
2.4 项目特色
- 路径检测算法:使用循环遍历,判断箭头前方是否有障碍物,逻辑清晰。
- 动画反馈:成功飞出使用缓动函数(Ease Out)实现平滑动画,失败使用正弦波实现抖动。
- 视觉风格:采用圆角卡片、柔和阴影、粉紫配色,界面友好。
- 多关卡设计:共 5 个关卡,每个关卡均经过实际试玩,确保有解。
三、实现思路
开发环境
| 项目 | 版本/说明 |
|---|---|
| 操作系统 | Windows 11 |
| Python | 3.12.7 |
| 第三方依赖库 | pygame 2.6.1 |
| 开发IDE | VS Code |
| 文档编写 | Markdown |
依赖安装:
pip install pygame
3.1 箭头与方向的表示
在代码中,箭头用三元组 (行, 列, 方向数字) 表示,所有箭头放在每个关卡的 arrows 列表里。方向数字由一个统一的 DIRS 列表映射为坐标变化:
DIRS = [(0, -1), (1, 0), (0, 1), (-1, 0)]
索引 0 / 1 / 2 / 3 分别对应 上 / 右 / 下 / 左,每个元素是一个 (dx, dy)。屏幕坐标系中 y 轴向下为正,所以 (0, -1) 是向上,(0, 1) 是向下。
关键说明:
- 只需维护一个
DIRS列表,就能把“方向数字”和“行列增量”统一起来,后续绘制、检测、动画都复用这一个结构。 - 每个箭头用一个三元组表示,避免了定义
Arrow类,代码更轻量,适合关卡数据直接写在LEVELS里。
3.2 关卡数据
每个关卡是一个字典,arrows 字段是 (行, 列, 方向) 的列表:
LEVELS = [
{
"name": "入门练习", "count": 7, "time": 90,
"arrows": [(0, 0, 1), (5, 0, 2), (2, 1, 0), (0, 2, 1),
(2, 3, 0), (4, 4, 3), (5, 5, 2)]
},
...
{
"name": "终极挑战", "count": 10, "time": 75,
"arrows": [
(0, 0, 0), # 左上 向上,第一步即可飞出
(0, 5, 3), # 右上 向左,第一步即可飞出
(5, 0, 2), # 左下 向下,第一步即可飞出
(5, 5, 2), # 右下 向下,第一步即可飞出
(2, 2, 1), # 中心 向右
(3, 3, 3), # 中心 向左
(1, 1, 3), # 内圈 向左,被外圈挡住
(1, 4, 1), # 内圈 向右,被外圈挡住
(4, 1, 3), # 内圈 向左,被外圈挡住
(4, 4, 1), # 内圈 向右,被外圈挡住
]
}
]
关键说明:
- 每个关卡用
name / count / time / arrows四个字段描述,结构清晰,方便在“选择关卡”界面里直接读取。 - 第五关的布局遵循“外圈朝外 + 内圈朝外 + 中心分散”原则:外圈四角第一步就能飞出,内圈四个箭头朝外但被外圈挡住,中心两个箭头不同行不同列,各自前方无阻挡。
3.3 路径检测(核心算法)
路径检测是游戏的核心逻辑,判断箭头沿其方向前进时是否会撞到其他箭头:
def is_clear(r, c, direction, arrow_map):
dx, dy = DIRS[direction]
current_c = c + dx
current_r = r + dy
while 0 <= current_r < 6 and 0 <= current_c < 6:
if (current_r, current_c) in arrow_map:
return False
current_c += dx
current_r += dy
return True
关键点说明:
- 扫描范围:从当前箭头格子出发,沿
(dx, dy)方向一格一格向外移动。循环条件是0 <= current_r < 6 and 0 <= current_c < 6,一旦越界就跳出循环,返回True。 - 逐格判断阻挡:每一次循环先判断新坐标是否在
arrow_map中,如果在,说明前方有箭头,立即返回False;否则继续向该方向移动。 - 箭头飞出条件:只要循环正常退出(即坐标越界),说明该方向上没有遇到任何箭头,可以飞出,返回
True。 - 边界安全:
arrow_map的访问放在越界判断之后,保证不会出现“先访问字典再判断越界”的隐患。
举例说明:以第五关 (0, 0, 0) 为例,方向为上,(dx, dy) = (0, -1),起始 current_r = -1,直接不满足 0 <= current_r < 6,循环不执行,返回 True,说明第一步就能飞出。
3.4 点击处理逻辑
点击一个格子后,根据 arrow_map 判断该位置是否有箭头、能否飞出:
def try_click(cell):
global game_arrows, mistakes, feedback, feedback_until, animating, \
last_success_cell, last_fail_cell
if cell is None:
return
r, c = cell
arrow_map = {(rr, cc): dd for rr, cc, dd in game_arrows}
if cell not in arrow_map:
feedback = "empty"
feedback_until = pygame.time.get_ticks() + 650
return
direction = arrow_map[cell]
if is_clear(r, c, direction, arrow_map):
# 能飞出:从 game_arrows 中移除,加入动画
game_arrows = [(rr, cc, dd) for rr, cc, dd in game_arrows
if (rr, cc) != cell]
feedback = "success"
feedback_until = pygame.time.get_ticks() + 750
last_success_cell = cell
last_fail_cell = None
animating.append((r, c, direction, pygame.time.get_ticks()))
else:
# 被挡住:失误次数 -1
mistakes -= 1
feedback = "blocked"
feedback_until = pygame.time.get_ticks() + 800
last_fail_cell = cell
last_success_cell = None
关键点说明:
- 点击空格子 →
feedback = "empty",不扣失误; - 点击能飞出的箭头 → 从
game_arrows中移除,加入animating列表,feedback = "success"; - 点击被挡住的箭头 →
mistakes -= 1,feedback = "blocked"; - 三种状态分别对应底部的三种提示文字和棋盘格子的不同颜色反馈。
3.5 动画实现
成功飞出(淡出 + 缓出)
for (ar, ac, ad, started) in animating:
progress = (now - started) / 520.0
if progress < 1:
progress = clamp(progress, 0, 1)
ease = 1 - (1 - progress) ** 3
start_x = bx + 20 + ac * (cell + gap) + cell / 2
start_y = by + 20 + ar * (cell + gap) + cell / 2
dx, dy = DIRS[ad]
end_x = start_x + dx * 170
end_y = start_y + dy * 170
arrow_x = start_x + (end_x - start_x) * ease
arrow_y = start_y + (end_y - start_y) * ease
draw_arrow(arrow_x, arrow_y, ad, GREEN,
0.78 * (1 - 0.25 * progress),
int(255 * (1 - progress)))
still_animating.append((ar, ac, ad, started))
animating[:] = still_animating
progress从 0 到 1,持续 520ms;ease = 1 - (1 - progress) ** 3是三次缓出函数,箭头起步快、末端慢;- 终点位置用
DIRS[ad]算出,向外偏移 170 像素; - 透明度随
progress递减,实现淡出; - 动画未结束的条目会重新写入
still_animating,动画结束后自然从列表中移除。
碰撞晃动(正弦 + 递减)
shake = 0
now = pygame.time.get_ticks()
if feedback_until > now and feedback == "blocked":
shake = int(math.sin(now / 35) * 5)
- 棋盘左右偏移由
sin(now / 35) * 5控制,幅度 5 像素,频率约 35ms 一周期; - 只在
feedback == "blocked"且反馈未结束时出现,持续约 800ms。
格子颜色反馈
success_cell = None
fail_cell = None
if feedback == "success" and feedback_until > now:
success_cell = last_success_cell
if feedback == "blocked" and feedback_until > now:
fail_cell = last_fail_cell
在 draw_board 中,如果当前格子是 success_cell,填充绿色;如果是 fail_cell,填充红色,实现“格子闪烁”的视觉反馈。
3.6 通关与失败判定
主循环中每帧都会检查一次游戏状态:
if screen_name == "game":
if not game_arrows:
if feedback_until < now - 100:
finish(True)
elif mistakes <= 0:
finish(False)
elif remaining_time() <= 0:
finish(False)
关键点说明:
- 箭头全部清空 → 等最后一个
feedback显示完(延迟 100ms)再判定通关,避免玩家看不到最后一步反馈; - 失误次数耗尽 → 立即失败;
- 时间耗尽 → 立即失败。
finish() 中计算得分:
elapsed = time_limit - remaining_time()
arrow_count = len(LEVELS[selected_level]["arrows"])
last_score = max(0, int(arrow_count * 100 - elapsed * 2 + mistakes * 50))
- 箭头数量越多、用时越短、剩余失误越多,得分越高;
- 再用
max(0, ...)保证得分不为负。
3.7 游戏状态
用 screen_name 字符串管理页面状态,共 4 种:
"home":开始界面;"select":选择关卡界面;"game":游戏进行中;"result":通关或失败结果界面。
主循环根据 screen_name 分发绘制和事件处理逻辑:
if screen_name == "home":
draw_home()
elif screen_name == "select":
draw_select()
elif screen_name == "game":
draw_game()
elif screen_name == "result":
draw_result()
关键说明:
- 用字符串而不是枚举或常量,写法更直观,方便调试;
- 每个页面各有一个
draw_xxx()函数,返回它自己的按钮区域,便于主循环里做碰撞检测; - 事件处理与绘制分离,逻辑清晰、易于扩展新页面。
四、AIGC 使用过程
在本次开发中,我使用了 DeepSeek 和ChatGpt 作为 AIGC 辅助工具,以下为 4 次具有代表性的使用记录。
4.1 过程一:路径检测代码生成与修正
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 路径检测 | DeepSeek | 生成 is_clear 函数,根据方向沿直线检测前方是否有箭头 |
初次生成时向上判断会出现越界访问 | 修改边界条件为 0 <= current_r < 6 and 0 <= current_c < 6 后正常 |
提问:请用 Python 写一个函数,输入箭头坐标 (r, c)、方向 direction(0上、1右、2下、3左)和所有箭头的位置字典,判断这个箭头前方是否没有阻挡,可以飞出 6×6 棋盘。
AI 提供:给出了基于 DIRS 与 while 循环的检测思路,并补全了函数框架。
我的修改:AI 初始版本在检测边界时条件写得不够严谨,向上检测时会出现 current_r < 0 仍然访问 arrow_map 的问题。我把边界条件改为 while 0 <= current_r < 6 and 0 <= current_c < 6,保证先判断越界再访问字典,问题解决。
4.2 过程二:关卡设计
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 关卡设计 | DeepSeek | 生成 5 个关卡的箭头数组 | 第五关出现死锁,无法通关 | 手工调整方向并试玩验证,改为“外圈朝外、内圈朝外、中心分散”的布局 |
提问:设计 5 关“一箭又一箭”的关卡数据,每关箭头数量递增,要求每关都有解。
AI 提供:给出了 5 组 (r, c, d) 三元组。
我的修改:实际试玩时发现第五关存在两个箭头互相指向对方(例如 (0,0,1) 与 (0,5,3) 同行反向),导致第一步就无法点击。我重新设计第五关:外圈四角全部朝外,内圈四个箭头朝外但被外圈挡住,中心两个箭头分开放置。改完后手动模拟通关顺序,确认 10 步可以清空。
4.3 过程三:动画与碰撞反馈
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 成功飞行动画 | DeepSeek | 给出基于 progress 和 ease 的插值动画方案 |
基本可用 | 调整时长到 520ms,透明度随进度递减 |
| 失败碰撞反馈 | DeepSeek | 给出基于 sin 的棋盘晃动方案 |
基本可用 | 将幅度定为 5 像素,频率 now / 35,持续约 800ms |
提问:在 Pygame 中如何实现箭头飞出棋盘并淡出的动画?以及点击失败时如何给玩家一个明显的碰撞反馈?
AI 提供:飞出动画用 progress 从 0 到 1,位置用 ease 插值,透明度用 255 * (1 - progress);碰撞反馈用 math.sin(now / 35) * 5 让棋盘左右晃动。
我的修改:把动画时长从 AI 默认的 300ms 调整为 520ms,让飞出更自然;晃动幅度从 8 像素调小到 5 像素,避免过于剧烈。
AIGC使用总结
| 子任务 | 借助何种 AIGC 技术 | AI 实现或提供了什么 | 效果如何 | 人工修改 |
|---|---|---|---|---|
| 游戏整体设计 | ChatGpt | 根据需求设计游戏页面、关卡和基本游戏流程 | 提供了完整的设计思路 | 根据自己的需求重新调整界面和功能 |
| 游戏界面与动画 | ChatGpt | 提供 Pygame 界面、按钮、箭头绘制和动画实现思路 | 基本能够运行 | 调整窗口比例、颜色、箭头样式和动画效果 |
| 路径检测 | DeepSeek | 生成四个方向的路径检测代码 | 初始版本在向上判断时出现数组越界(r < 0) |
手动增加 0 <= current_r < 6 边界条件后正常 |
| 关卡设计 | DeepSeek | 生成 5 个关卡的箭头数组 | 第三关和第五关存在无法通关的死局(箭头互相阻挡) | 手工调整箭头位置,并实际试玩验证,确保有解 |
| 碰撞动画 | DeepSeek | 补全箭头抖动和粒子反馈代码 | 基本可用,但抖动幅度过大,视觉上不舒适 | 调整 shake_strength 参数从 10 改为 5,并加入正弦波平滑 |
| 界面排版 | DeepSeek | 生成 Pygame 界面布局代码 | 初始版本窗口高度不足,底部文字和按钮被遮挡 | 手动调整 HEIGHT 从 760 改为 880,并重新定位所有元素 |
总结:AIGC 在本项目中主要起到了辅助开发作用。
它可以帮助我快速生成基础代码、分析程序错误以及提供修改思路,但是生成的代码并不能直接保证完全符合实际需求。
通过实际运行、发现问题、修改代码和再次测试,我逐渐理解了程序的具体实现过程。
因此,本项目最终代码是在 AI 辅助和人工修改的基础上逐步完成的。
五、测试结果
测试结果都可以在第一点的项目展示的动图中看到
| 编号 | 测试内容 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| T01 | 点击前方无阻挡的箭头 | 箭头飞出棋盘并消失 | 箭头淡出飞出,格子闪绿,剩余箭头数 -1 | 通过 |
| T02 | 点击前方有阻挡的箭头 | 箭头不消失,失误次数减 1 | 棋盘晃动,格子闪红,失误次数 -1 | 通过 |
| T03 | 点击位于边缘且朝向棋盘外的箭头 | 箭头正常消失,不发生越界错误 | 箭头正常飞出,无异常 | 通过 |
| T04 | 消除本关全部箭头 | 显示通关并进入下一关 | 显示“挑战成功!”,可继续挑战或返回 | 通过 |
| T05 | 失误次数耗尽 | 显示失败并允许重新开始 | 显示“挑战失败:失误次数已经用完”,可重玩 | 通过 |
| T06 | 游戏进行中重新开始 | 箭头布局和失误次数恢复 | 点击“重来”后,箭头与失误恢复到初始状态 | 通过 |
| T07 | 倒计时结束 | 显示失败 | 显示“挑战失败:时间已经用完” | 通过 |
| T08 | 点击空白格子 | 给出“这里没有箭头”提示 | 底部显示灰色提示,不扣失误 | 通过 |
补充说明:
- T03 分别在四个方向的边缘箭头上各测一次,均正常飞出。
- T04 对 5 个关卡分别通关一次,确认每关都有可行通关顺序。
- T06 在游戏进行到一半时点击“重来”,箭头数量、失误次数、倒计时均恢复。
六、Git 提交记录
仓库地址:GitHub 仓库aaarctic-ArrowGame
主要 Commit 记录:
chore: 初始化仓库并添加 .gitignore
feat: 搭建游戏窗口配置、颜色常量和字体加载
feat: 定义 5 个可通关的关卡数据
feat: 实现四个方向的路径检测 is_clear
feat: 实现箭头绘制与按钮、文字绘制工具
feat: 实现 6×6 棋盘绘制与鼠标格子定位
feat: 实现首页、选择关卡、帮助、游戏、结果五个页面绘制
feat: 实现游戏主循环、点击处理与状态管理
fix: 重新设计第五关,保证可解
docs: 完善 README 和运行说明
大概如截图所示:

七、PSP 表格
| 任务 | 预估耗时(小时) | 实际耗时(小时) | 差异(小时) |
|---|---|---|---|
| 需求分析与游戏设计 | 1.0 | 1.5 | +0.5 |
| Python 与图形库学习 | 2.0 | 3.0 | +1.0 |
| 游戏界面实现 | 2.0 | 3.5 | +1.5 |
| 路径与碰撞逻辑实现 | 1.5 | 2.5 | +1.0 |
| 关卡设计 | 1.0 | 2.0 | +1.0 |
| AIGC 辅助开发 | 1.5 | 2.5 | +1.0 |
| 测试与修改 | 2.0 | 3.0 | +1.0 |
| README 与博客撰写 | 1.5 | 2.5 | +1.0 |
| 合计 | 12.5 | 20.5 | +8.0 |
📌 为什么“实际耗时”比“预估耗时”多这么多?
因为这是第一次用 Pygame 做完整的小游戏,遇到很多意料之外的问题:
窗口尺寸不对导致排版错乱;生成的关卡有死局;路径检测越界;飞行动画和抖动反馈调参等等等等。
关卡设计和游戏界面实现比预期更耗时,尤其是第五关反复试玩、反复调整方向,才得到一个既有趣又可解的布局;界面部分因为要兼顾按钮、状态栏、时间条、结果页的布局,也花了不少时间微调。
八、心得体会
通过这次“一箭又一箭”小游戏的开发,我完整地体验了一次“从零开始做项目”的过程。虽然游戏本身并不复杂,但中间踩过的坑、改过的 Bug、调过的排版,让我收获了很多课堂上学不到的东西。
1. AIGC 带来的帮助:效率真的高
这次开发中我主要使用了 DeepSeek和 ChatGpt 作为辅助工具。作为第一次接触 Pygame 的新手,AI 在以下几个方面帮了大忙:
- 快速上手:我不熟悉 Pygame 的事件循环、Surface 绘制、字体渲染,AI 能直接给出可运行的示例代码,让我不用从零翻文档。
- 逻辑生成:路径检测的核心算法,AI 很快就给出了清晰的循环遍历逻辑,我只需要微调边界条件。
- 动画实现:成功飞出和失败抖动的动画,AI 提供了缓动函数和正弦波抖动的思路,让游戏的视觉反馈立刻提升了一个档次。
- 排版重构:当我发现窗口高度不够、底部文字被遮挡时,AI 帮我重新算了布局参数,把按钮和文字挪到了合适的位置。
可以说,没有 AI 的辅助,我不可能在这么短的时间内完成一个功能完整、界面美观的小游戏。
2. 踩过的坑:AI 不是万能的
但这次开发也让我深刻认识到,AI 生成的代码不能直接信任,必须经过人工审查、测试和调整。
坑一:关卡设计出现死局
AI 第一次生成第三关和第五关的箭头数据时,我试玩后发现根本过不了——几个箭头互相阻挡,形成了一个死循环。这说明 AI 在生成逻辑数据时,并不真正理解“游戏规则”和“可解性”。我只能手工调整箭头的位置和方向,反复试玩,确保每一关都有合理的通关顺序。
坑二:路径检测数组越界
AI 生成的路径检测代码,在处理“向上”方向时,没有考虑到 r - 1 可能小于 0,导致程序在边界处抛出 IndexError。我手动加上了 0 <= current_r < 6 的边界条件,才修复了这个 Bug。
坑三:排版反复错乱
第一次跑起来时,窗口高度是 760,但棋盘画到了 y=821,底部一大截被切掉了。重来按钮也贴在窗口右边缘,被遮挡得看不清。我改了窗口高度、调整了棋盘位置、把重来按钮移到了顶部状态栏右侧,来回折腾了好几次才把布局调顺眼。
坑四:动画参数调优
AI 给的抖动幅度太大,看起来像在地震;粒子飞行的速度也太快,看不清。我手动把 shake_strength 从 10 改到 5,把动画的 progress 增量调小,才让反馈看起来舒适自然。
3. 我的收获
- 技术层面:掌握了 Pygame 的基本使用,理解了游戏循环、事件驱动、渲染层分离的思想;也学会了用循环和边界判断实现路径检测。
- 工程层面:明白了“代码能跑”和“代码能正确跑”是两回事。测试不是为了应付作业,而是真的能发现 AI 没考虑到的问题。
- 协作层面:AI 是极好的“副驾驶”,但方向盘必须握在自己手里。它负责生成,我负责判断、验证、修改。人机协作的核心,是人的批判性思维。
- 心态层面:遇到 Bug 不要慌,慢慢定位、逐步排查。比如排版问题,只要把每个元素的位置打印出来,就能发现是哪个坐标出了问题。
4. 总结
这次作业让我体验了一个比较完整的软件开发过程:
需求分析
↓
功能设计
↓
代码实现
↓
运行测试
↓
发现问题
↓
修改代码
↓
再次测试
↓
完善项目
虽然中间有反复,但每一次修改都让我对代码的理解更深一层。以前可能更关注“把代码写出来”,而这次项目让我认识到,软件开发不仅仅是写代码,还包括需求分析、测试、修改、版本管理和文档整理等多个环节。
总体来说,这次作业让我不仅学习了 Python 和 Pygame 的使用,也让我更加了解了一个完整项目从想法到实现的过程。
通过这次实践,我认识到在使用 AIGC 的同时,自己仍然需要具备基本的代码理解和判断能力。只有把 AI 的辅助和自己的思考结合起来,才能更好地完成项目。
这次开发过程中虽然遇到了一些问题,但通过不断修改和测试,最终完成了一个可以正常运行的小游戏。这次经历也让我对之后的软件开发学习更有信心。












浙公网安备 33010602011771号