软件工程第二次作业 ——“一箭又一箭” 游戏开发

别乱点箭头!—— 一箭又一箭开发踩坑日记

项目 内容
这个作业属于哪个课程 H202601软件工程与软件工程实践
这个作业要求在哪里 软件工程第二次作业
这个作业的目标 使用 Python 和 AIGC 完成“一箭又一箭”小游戏
学号 102402110
GitHub 仓库 aaarctic-ArrowGame

一、项目展示

1.1 开始界面

游戏启动后进入开始界面,界面上方是游戏标题“一箭又一箭”和副标题“观察方向 · 规划顺序 · 清空所有箭头”,下方分为左右两个说明面板,分别介绍玩法和挑战目标。底部提供四个按钮:开始游戏选择关卡游戏规则操作提示
下方GIF展示开始界面、游戏规则、选关界面以及开始游戏的第一关。
QQ20260922-114008
可以看到游戏界面显示了:当前关卡;游戏棋盘;剩余箭头数量;剩余失误次数;重新开始按钮。


1.2 游戏界面

游戏界面顶部为状态栏,显示游戏标题、当前关卡、剩余箭头数、剩余失误次数、剩余时间以及一个时间进度条。右上角是“重来”按钮。中间是 6×6 的棋盘,黄色箭头表示当前还未飞出的箭头。
QQ20260922-114454

点击成功时,箭头会以绿色飞行动画飞出棋盘,格子闪烁绿色;点击失败时,棋盘会左右晃动,格子闪烁红色,同时失误次数减 1。


1.3 通关与失败界面和重新开始按钮

当清空全部箭头后,进入通关结果页,显示“挑战成功!”、当前关卡和本次得分。当失误次数耗尽或倒计时结束时,进入失败结果页,显示失败原因,并提供“再玩一次”“选择关卡”“返回主页”三个按钮。

成功界面

QQ20260922-114627

失败界面

QQ20260922-114659

重新开始按钮

QQ20260922-114920


1.5 测试视频——三个关卡试玩

包含:
T01 点击前方无阻挡的箭头 箭头飞出棋盘并消失
T02 点击前方有阻挡的箭头 箭头不消失,失误次数减 1
T03 点击位于边缘且朝向棋盘外的箭头 箭头正常消失,不发生越界错误
T04 消除本关全部箭头 显示通关并进入下一关
T05 失误次数耗尽 显示失败并允许重新开始
T06 游戏进行中重新开始 箭头布局和失误次数恢复

第一关

通关:
QQ20260922-140732
不通关:
QQ20260922-115447
进行中重新开始:
QQ20260922-115518

第二关

通关:
QQ20260922-115636
不通关:
QQ20260922-115702
进行中重新开始:
QQ20260922-115729

第三关

通关:
QQ20260922-115811
不通关:
QQ20260922-115838
进行中重新开始:
QQ20260922-115905


二、项目介绍

2.1 项目背景

本项目是一款基于 Python 和 Pygame 开发的箭头消除类益智小游戏。

游戏中会在棋盘上随机生成不同方向的箭头,玩家需要根据箭头的方向判断其前方是否存在其他箭头。如果箭头前方没有其他箭头阻挡,则可以点击该箭头,使其沿指定方向飞出棋盘。

玩家需要在规定时间内消除关卡中的全部箭头,并尽可能减少错误操作。


2.2 游戏目标

游戏的主要目标是:

  1. 判断箭头的移动方向;
  2. 判断箭头前方是否存在阻挡;
  3. 点击可以正常移动的箭头;
  4. 将棋盘上的全部箭头消除;
  5. 在规定时间内完成关卡;
  6. 控制错误操作次数,避免游戏失败。

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

关键点说明:

  1. 扫描范围:从当前箭头格子出发,沿 (dx, dy) 方向一格一格向外移动。循环条件是 0 <= current_r < 6 and 0 <= current_c < 6,一旦越界就跳出循环,返回 True
  2. 逐格判断阻挡:每一次循环先判断新坐标是否在 arrow_map 中,如果在,说明前方有箭头,立即返回 False;否则继续向该方向移动。
  3. 箭头飞出条件:只要循环正常退出(即坐标越界),说明该方向上没有遇到任何箭头,可以飞出,返回 True
  4. 边界安全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 -= 1feedback = "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 使用过程

在本次开发中,我使用了 DeepSeekChatGpt 作为 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 给出基于 progressease 的插值动画方案 基本可用 调整时长到 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 和运行说明

大概如截图所示:
image

七、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 带来的帮助:效率真的高

这次开发中我主要使用了 DeepSeekChatGpt 作为辅助工具。作为第一次接触 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 的辅助和自己的思考结合起来,才能更好地完成项目。

这次开发过程中虽然遇到了一些问题,但通过不断修改和测试,最终完成了一个可以正常运行的小游戏。这次经历也让我对之后的软件开发学习更有信心。

posted @ 2026-09-22 15:17  Cactusheep  阅读(0)  评论(0)    收藏  举报