news 2026/10/1 13:17:40

Java Swing大乱斗闯关游戏源码:面向对象与状态机实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Swing大乱斗闯关游戏源码:面向对象与状态机实战解析

简介:这份源码是一份完整的Java大乱斗闯关游戏项目,面向Java学习者、游戏开发爱好者以及需要实战练习的编程人群,可用于阅读代码、拆解框架和二次改造。压缩包共有760个文件,整体约120.47MB;核心代码包括37个Java源文件与79个class文件,另有382个png、202个gif图像素材、30个wav音效以及jar、xml等工程配置,覆盖图形界面、角色动画、音效播放和项目构建等环节。从项目目录可以看到主程序、游戏逻辑、视图、模型、控制类、资源文件和测试等模块的划分;游戏中的角色移动、攻击判定、道具使用和胜负规则多以类封装,从类结构可对应菜单、角色、Boss、关卡等模块,适合按模块追踪研究。当前已有198人学习使用。借助这份源码,读者能深入掌握事件处理、线程游戏循环、碰撞检测、状态管理等典型游戏开发技术,也能体会如何利用继承与多态设计可扩展的游戏实体,理解大型Java项目的目录组织和面向对象设计原则,是提升Java游戏开发能力的一份优质实践样本。

1. 大乱斗闯关游戏源码:一份能写进 Java 课程设计的完整 Swing 游戏框架

如果你正在找 Java 课程设计选题,而不是又一个人事管理系统的增删改查,这份“基于 Java 的大乱斗闯关游戏源码”值得拆开来看。项目没有用任何游戏引擎,全部逻辑都是 Java 基础语法、面向对象、线程和 Swing 图形组件搭起来的,代码里有主菜单、关卡选择、普通敌人、多个 BOSS,甚至还有按章节分关卡的命名,比如 Chapter3_3。反直觉的地方在于:这种“不用引擎”的土办法反而更适合学习,你能看到游戏循环、碰撞检测、状态机这些概念在纯 Java 环境里是如何落地的。对想走 Java 学习路线的人,或者准备课程设计答辩、想拿一个能讲清楚的项目亮点的人来说,这是一份可以运行、可以改、也可以写进简历的完整样本。

2. 源码结构与类设计:从 MenuWindow 到 GameWindow 的职责拆解

从项目给出的 class 文件清单来看,源码的主线非常清晰:一个主菜单窗口、一个游戏主窗口、两个玩家角色、一个普通敌人、三个 BOSS、一个具体关卡类。没有多余的第三方依赖,入口和游戏面板被拆成不同类,这本身就是典型的 Swing 游戏分层结构。在动手改代码之前,先把每个类在干什么搞清楚,能省下大量全局搜索的时间。

2.1 类清单与职责划分

先看源码里给出的 class 文件,把它们按职责归类,基本就是下面这张表:

类名职责在游戏循环中的位置
MenuWindow主菜单窗口,负责标题显示、开始按钮、角色选择入口启动入口,创建后切换到 GameWindow
GameWindow游戏主窗口 / 游戏面板,持有绘制方法、游戏循环、关卡切换核心容器,update 与 repaint 都发生在它上面
Player玩家角色基类,存放移动、攻击、受击、死亡等公共逻辑被 GameWindow 调用,参与每帧更新
PlayerYun / PlayerMai继承 Player 的两个可选角色,重写技能表现具体玩家实例,由角色选择结果决定
Enemy普通敌人,负责追击玩家与基础攻击由关卡类生成,逐帧更新
BossA / BossB / BossC三个关底 BOSS,通常带多阶段攻击模式在特定章节出现,按状态机切换行为
Chapter3_3具体关卡类,代表第三章第三节的敌人波次与 BOSS 配置被 GameWindow 加载,管理本关通关条件

从类名能推断出作者的设计习惯:MenuWindow 管入口,GameWindow 管运行中的游戏,Player 系列管角色,Chapter 系列管关卡。这种拆法的好处是每个类职责单一,课程设计报告里的“系统结构图”可以直接照着类名画。如果你要交作业,这比把所有逻辑塞进一个 2000 行的类里好讲得多。

还有个细节值得注意:PlayerYun、PlayerMai 和 BossA、BossB、BossC 都用了“具体类名”而不是“Player1、Player2”。这说明作者在命名时把角色和 BOSS 当成了独立个体来对待,后面扩展新角色、新 BOSS 时,只需要新增子类,不需要回头改 GameWindow 里的大段分支。

2.2 为什么用 Swing:面向学习者的选型理由

Swing 属于 JDK 自带的 GUI 库,不需要额外下载运行时,这一点对课程设计太重要了。JavaFX 虽然界面更现代,但要配 JavaFX SDK、处理模块依赖,演示环境一换就容易跑不起来。Swing 老归老,网上任何报错都搜得到解决方案,对新手友好得多。

从学习角度讲,Swing 的事件监听模型和重绘机制,恰好能逼着你理解 Java 的事件分发线程。你知道鼠标点击、键盘按下这些操作在 Swing 里不是“你调代码”,而是“系统回调你的监听器”,这个模型理解了,后面看 Android 或桌面应用源码都会顺畅很多。这个项目还有个天然优势:它是游戏,有持续运行的动画,所以你必须处理线程和刷新频率,这比写一个表单程序更能加深对“EDT”(Event Dispatch Thread,事件分发线程)的理解。

跨平台这一点在答辩时也值得一提。在 Windows 上写完编译出的字节码,拿到装了 JDK 的 Mac 或 Linux 机器上能直接运行,这就是 Java 跨平台特性最直观的体现。对于课程设计来说,这属于一句话就能讲清楚的亮点,不需要额外造概念。

2.3 游戏循环的组织方式:Timer 与 repaint 的配合

Swing 游戏循环最常见的做法是用javax.swing.Timer,而不是自己写new Thread(() -> { while(true) ... })。原因是 Swing 组件的绘制必须在 EDT 上执行,如果你在单独线程里疯狂调用repaint(),轻则界面闪烁,重则直接卡死。而 Timer 的每次回调本身就跑在 EDT 上,天然规避了线程竞争问题。

import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GameLoop { private final GameWindow window; private Timer timer; private int fps = 60; public GameLoop(GameWindow window) { this.window = window; } public void start() { int delay = 1000 / fps; // 每帧间隔,单位毫秒 timer = new Timer(delay, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { update(); // 1. 先更新玩家、敌人、Boss 的逻辑 window.repaint(); // 2. 再触发面板重绘 } }); timer.start(); } private void update() { // 这里放碰撞检测、敌人 AI、Boss 状态切换等逻辑 } }

代码里delay = 1000 / fps是一个关键参数:fps 设为 60,delay 约等于 16 毫秒;fps 设为 30,delay 约等于 33 毫秒。数值越小刷新越快,但对 CPU 占用也越高。课程设计级别的游戏不需要追求 60 帧,30 帧就能保证动画平滑,而且能明显降低低配电脑上的卡顿概率。

要注意的是,javax.swing.Timer的精度受系统时钟影响,不是硬实时。如果要做非常精确的物理模拟,需要记录上一次回调的时间戳,计算 deltaTime 来修正位移。但这个项目是闯关游戏,不是物理引擎,我一般建议直接用固定 delay,保持代码简单。

3. 玩法核心:玩家多态、Boss 状态机与章节关卡

这一章是整个项目里含金量最高的部分。从类文件可以看出:Player 是基类,PlayerYun 和 PlayerMai 是两个可选的玩家角色;Enemy 是普通杂兵;BossA、BossB、BossC 是三个 BOSS;Chapter3_3 是具体关卡。把他们串在一起,就是完整的“选人—进图—清杂兵—打 BOSS—过关”流程。理解这些类怎么协作,比看懂单个类内部代码更重要。

3.1 Player 基类:继承、多态与角色差异化

双角色设计的核心是用继承来复用公共逻辑。抽一个 Player 基类,把血量、攻击力、坐标、移动、受击这些所有角色都有的东西放进去,然后让 PlayerYun 和 PlayerMai 各自继承并重写技能。这种写法的最大好处是:新增第三个角色时,不需要改动 GameWindow 和 Enemy 的代码,只要多写一个子类并注册到选人界面。

public abstract class Player { protected int hp; protected int attack; protected int x, y; protected boolean isDead; public void move(int dx, int dy) { x += dx; y += dy; // 边界检查,避免角色走出窗口 if (x < 0) x = 0; if (y < 0) y = 0; } public void takeDamage(int damage) { hp -= damage; if (hp <= 0) { isDead = true; } } public abstract void skill(); // 子类各自实现技能,体现多态 }
public class PlayerYun extends Player { @Override public void skill() { // 范围攻击:对周围所有敌人造成伤害 // 具体伤害值和范围半径在源码里通常定义为常量 } }
public class PlayerMai extends Player { @Override public void skill() { // 高伤害单攻:对前方敌人造成多段伤害 // 与 PlayerYun 形成操作手感上的差异 } }

skill()是抽象方法,子类各自实现,这就是面向对象里“多态”的直接应用。GameWindow 里只需要持有一个Player类型的引用,运行时不管实际是 PlayerYun 还是 PlayerMai,调用player.skill()都会执行对应的技能逻辑。这在 Java 基础面试里是高频考点,如果你正在准备校招,这个项目里的多态应用可以直接当案例讲。

我拆源码时习惯先看攻击力、技能冷却这些数值放在哪里。常见做法是定义成protected static final int常量,放在子类顶部。这样调平衡时只需要改子类头部,不会误伤其他类。

3.2 Enemy 与 Boss 的状态机:从待机到死亡

普通敌人可以只写简单的追击逻辑,但 BOSS 不行。BOSS 需要有“待机、追击、攻击、受击、死亡”这些状态,甚至还要在血量低的时候切换攻击方式。如果全用 if-else 嵌套,代码会变成一坨没人敢改的“屎山”。用状态机是最稳妥的方案。

enum EnemyState { IDLE, CHASE, ATTACK, HIT, DEAD } public class BossA extends Enemy { private EnemyState state = EnemyState.IDLE; private int phase = 1; public void update(Player target) { switch (state) { case IDLE: // 玩家进入触发范围后切换为追击 if (distanceTo(target) < 300) { state = EnemyState.CHASE; } break; case CHASE: moveToward(target); if (distanceTo(target) < 50) { state = EnemyState.ATTACK; } break; case ATTACK: attack(target); state = EnemyState.CHASE; // 攻击完回到追击 break; case HIT: // 受击硬直,动画播放完回到 CHASE break; case DEAD: // 死亡:掉落道具、触发关卡通关判定 break; } } private void changePhase() { // 半血后切换阶段,招式变化 if (hp < maxHp / 2) { phase = 2; } } }

状态机的优点在调试时特别明显。你可以在update()入口打印当前状态,玩家能看到“BOSS 卡在 CHASE 状态反复移动不吃攻击”,比对着几百行 if-else 排查快得多。三个 BOSS 的差异可以体现在阶段数量上:常见设计是 BossA 一到两阶段、BossB 两阶段、BossC 三阶段,每阶段换一套攻击组合。具体招式属于表现层,不影响状态机框架本身。

changePhase()这种半血触发的阶段切换,是 BOSS 战设计里最常见的手法。玩家打到一半突然发现 BOSS 攻击方式变了,游戏的紧张感立刻就上来了。实现上只需要在takeDamage()里加一个血量阈值判断。

3.3 章节关卡与 Chapter3_3:一个关卡类怎么串起流程

Chapter3_3这个类名透露了作者的组织方式:第三章第三关。一个关卡类通常负责三件事:初始化本关的敌人波次、放置 BOSS、判断通关条件。GameWindow 只需要加载当前关卡对象,不需要关心具体敌人数量。

public class Chapter3_3 implements Chapter { private List<Enemy> enemies; private BossC boss; private boolean clear = false; public void init() { // 先刷两波普通 Enemy,最后出 BossC enemies.add(new Enemy()); enemies.add(new Enemy()); boss = new BossC(); } public void checkClear() { // 通关条件通常绑定 BOSS 死亡 if (boss.isDead()) { clear = true; GameWindow.showNextChapter(); } } }

这种设计下,新增一关的成本很低:复制一个 Chapter 类,改敌人波次和 BOSS 类型,注册进关卡跳转逻辑就行。init()负责创建实例,checkClear()负责决定什么时候过关。如果你想把游戏改成“清完所有敌人过关”,只需要把条件从boss.isDead()改成enemies.isEmpty()。

有一点需要注意:把章节号写进类名虽然直观,但关卡多了类会爆炸。如果后续要加几十关,建议把敌人配置抽成 JSON 或 properties 文件,用配置文件驱动关卡生成。源码里用类名硬编码章节,更适合学习阶段的规模。

4. 编译与运行:把源码跑起来的三个关键步骤

拿到源码第一件事不是打开 IDE 就点运行,而是在命令行把编译路径先走通。Java 项目只要编译命令能过,说明类路径没缺、依赖没丢,后面导入 IDE 才有意义。我自己拆项目的习惯是先命令行验证,再谈其他。

4.1 环境检查:JDK 版本与 JAVA_HOME

先确认你机器上的 Java 环境,打开终端执行:

java -version javac -version

只要显示 Java 8 或更高版本,跑这个项目基本没问题。Swing 从 JDK 1.2 开始就内置了,但 JDK 8 以上的生态更稳定,而且课程设计答辩时评委的机器大概率装的就是 8 或 11。

如果javac提示找不到命令,而java -version正常,说明你只装了 JRE 没装 JDK,编译必须装 JDK。接下来确认环境变量:

# Windows echo %JAVA_HOME% # Linux / macOS echo $JAVA_HOME

JAVA_HOME 为空时,命令行编译会失败,但 IDE 里可能还能跑,因为 IDE 自己管理了 JDK 路径。我建议你还是把环境变量配好,不然以后写自动化脚本或者跑命令行工具时会反复踩坑。这一步就是常说的“java 环境变量配置”,配一次能管用好几年。

4.2 编译源码:javac 多文件处理

环境没问题后,进入项目根目录编译。解压出来的文件夹名一般是daluandou-master:

cd daluandou-master # 将源码编译到 out 目录 javac -encoding UTF-8 -d out src/*.java

命令参数说明:-encoding UTF-8告诉编译器源码文件是 UTF-8 编码,避免中文字符乱码;-d out指定字节码输出目录,这样不会把.class文件跟.java文件混在一起。如果项目里有图片、音频等资源,不需要编译,它们只要跟 class 文件保持相对路径就可以被代码读取。

如果你的源码是按包组织的,比如文件顶部写了package game;,编译时建议用 find 递归收集源文件,否则容易漏编译:

# Linux / macOS javac -encoding UTF-8 -d out $(find src -name "*.java") # Windows 用 PowerShell javac -encoding UTF-8 -d out (Get-ChildItem -Recurse src -Filter *.java).FullName

编译报错时先看两处:一是编码问题,报错信息里中文全是乱码,把-encoding换成GBK再试;二是找不到符号,说明某个类引用漏了编译,用上面的 find 方式全量编译基本能解决。

4.3 启动入口与常见运行参数

编译通过后,启动入口一般是主菜单类:

java -cp out MenuWindow

-cp out表示 classpath 指向 out 目录,JVM 会从这里找主类。如果提示ClassNotFoundException,说明源码开头有package声明,主类在包里,需要换成完整类名:

java -cp out 包名.MenuWindow

从项目给出的 class 文件看,MenuWindow排在最前面,它大概率是启动入口,因为它负责显示主菜单,通常会在用户点击“开始”后创建GameWindow。如果运行后直接进入游戏画面,说明作者把入口写在了GameWindow里,换成java -cp out GameWindow即可。

关于运行参数还有个实用小技巧:窗口大小、帧率、玩家初始血量这类数值,一般会在 GameWindow 或一个专门的配置类顶部定义为常量。想自己调难度,就搜WINDOW_WIDTH、FPS、MAX_HP这几个关键词。不用全局搜索“窗口”或“血量”,直接按字段名定位最快。

5. 避坑与调试:线程、输入与资源加载的五个翻车现场

这段是血泪经验。这份源码本身能跑,但只要你动手改,就很容易踩到 Swing 游戏开发里最常见的几个坑。每个坑我都按“现象 → 原因 → 解决”的顺序写,遇到问题直接对照排查。

5.1 界面黑屏与无响应:EDT 和游戏循环谁该让路

坑 1:运行后窗口能弹出来,但一片黑,鼠标移动没反应,几秒后系统提示“程序未响应”。原因大概率是游戏循环写在了main线程里,用while(true)死循环占住了事件分发线程,Swing 根本没有机会执行重绘。解决方法是改用javax.swing.Timer驱动循环;如果你坚持用独立线程,更新完逻辑后必须用SwingUtilities.invokeLater(() -> window.repaint());把重绘请求交给 EDT。排查时可以把手动线程的循环里加一行System.out.println("updating"),如果日志刷得飞快但界面不动,就坐实了是线程占死的问题。

坑 2:另一种情况是窗口有画面但像 PPT 一样卡顿,CPU 占用接近 100%。原因通常是 Timer 的 delay 数值填错了,比如把fps变量误写成delay = 1000 / 1000,相当于每毫秒触发一次回调,EDT 忙不过来。解决:把帧率控制在 30 到 60 之间。先改成fps = 30跑通,确认动画流畅后再往上调。我做这类项目时一般固定用 30,视觉效果和资源消耗最平衡。

5.2 键盘失灵与图片资源加载失败

坑 3:方向键怎么按都没反应,但鼠标点击按钮有反应。这个坑在 Swing 里特别经典,原因不是你的键盘坏了,而是KeyListener必须挂在获得焦点的组件上。如果窗口里有JButton、JTextField,焦点会被这些组件抢走,键盘事件就被吞掉了。解决:主窗口调用setFocusable(true)和requestFocusInWindow(),而且要在窗口显示后再调用一次;更彻底的做法是用 Swing 的Key Bindings(InputMap/ActionMap)替代KeyListener,焦点问题直接从根上消失。如果你只是临时调试,可以在window.show()后面加一行window.requestFocus()看看是否恢复。

坑 4:运行时报NullPointerException或FileNotFoundException,指向某一行图片加载代码。原因多半是用了new File("images/xxx.png")这种相对路径,当前工作目录一换就找不到文件。解决:用类加载器读取资源,即new ImageIcon(getClass().getResource("/images/xxx.png")),并确保资源在 src 的资源目录里。这个写法同时兼容源码运行和打包成 jar 后的运行,属于一劳永逸的改法。我在拆这个项目时发现,资源路径相关的报错占了所有运行期异常的三成以上,所以特别提醒你别踩。

5.3 帧率不稳与碰撞偏移:两个最玄学的问题

坑 5:角色移速一会儿快一会儿慢,BOSS 技能明明看着躲开了还是扣血。前者的原因通常是把位移写成了固定像素值并按帧执行,帧率一波动速度就不稳定;后者的原因通常是碰撞判定用了整个图片矩形,没有考虑图片边缘的透明区域。解决:位移计算乘上 deltaTime,即x += speed * deltaTime,用真实时间间隔做单位换算;碰撞框用一个比图片略小的矩形,常见做法是new Rectangle(x + 8, y + 4, w - 16, h - 12),具体缩进量看素材里角色的实际轮廓。

排查这两个问题时,最有效的办法是在窗口标题栏实时显示帧率,比如每 60 帧更新一次标题为FPS: 60。帧率稳定了,移速波动问题就排除了;帧率稳定后碰撞还是不准,再调碰撞框不迟。别一上来就同时怀疑两个地方,那会让调试变成猜谜。

6. 二次开发:加角色、加关卡、验证回归的三步走

如果你拿这份源码做课程设计,最常见的需求是“换皮”:加一个新角色、加一个新关卡,让答辩时看起来跟原版有明显区别。我建议你按“复制 → 注册 → 回归”的流程来,而不是直接在原有类上大改。

6.1 从复制到注册:最小改动新增一个章节

拿新增关卡举例。复制Chapter3_3改成Chapter4_1,只改三类内容:本关敌人波次、BOSS 类型、通关后的跳转目标。如果源码里已经用接口方式组织关卡,注册一个映射表是最省事的:

Map<String, Supplier<Chapter>> chapterMap = new LinkedHashMap<>(); chapterMap.put("1-1", () -> new Chapter1_1(gameWindow)); chapterMap.put("3-3", () -> new Chapter3_3(gameWindow)); chapterMap.put("4-1", () -> new Chapter4_1(gameWindow));

这里用Supplier<Chapter>而不是直接new Chapter,是懒加载思路:只有玩家进入对应关卡时才创建实例,避免一启动就实例化所有关卡对象,拖慢加载速度。加新角色同理:继承Player、重写skill(),再把角色缩略图注册到选人界面列表里,就完成了一个最小改动的新角色。技能特效如果不想从头画,可以直接复用现有角色的绘制方法,只改伤害数值和冷却时间,代码量非常小。

6.2 验证回归:改完先跑旧关卡再跑新关卡

改代码最怕影响旧的正常流程。我每一次加完新章节,都会强制自己回旧关卡完整跑一遍,确认三个点:菜单能正常进出、旧关卡敌人能正常刷新、BOSS 半血切换阶段时不报错。这三项过了,再进新关卡测新内容。这样做的好处是,一旦出问题,你能立刻缩小排查范围——是新加的类有问题,还是原有的东西被我改坏了。如果直接进新关卡,报错了你也分不清是哪边引起的。

复盘这份源码,我学到最实际的一件事就是:改动越小的项目,越值得做回归验证。小项目往往没有自动化测试,全靠手点;而手点也要有顺序,先验证旧逻辑再验证新逻辑,效率最高。我拆过太多课程设计源码,翻车原因九成不是主流程多复杂,而是小字段没初始化、状态没重置这种低级问题,而这些问题在旧关卡里反而暴露得最快。从那以后,我每次给这种游戏源码加内容,都强制先旧后新,跑一遍完整流程再交出去,这个习惯帮我避免了好几次答辩现场的尴尬。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 13:17:21

云边端协同算力体系:从训练到推理的架构设计与部署实践

做了几年AI算力相关的基础设施工作&#xff0c;我越来越确定一件事&#xff1a;这个行业的算力焦虑&#xff0c;正在从“能不能把模型训出来”转向“一堆模型部署出去之后&#xff0c;到底怎么喂饱它们”。AI算力、训练、推理、云边端协同这几个词&#xff0c;前两年聊起来还像…

作者头像 李华
网站建设 2026/10/1 13:17:18

2026本地大模型部署实战:从Ollama到Dify的完整指南

2026年做本地大模型部署&#xff0c;比两年前省心太多了。我最早折腾本地大模型&#xff0c;还是在显卡驱动和编译工具链上反复摩擦&#xff0c;一个周末全耗在把llama.cpp编译通过这件事上。现在不一样了&#xff0c;Ollama一条命令就能把DeepSeek拉起来&#xff0c;LM Studio…

作者头像 李华
网站建设 2026/10/1 13:17:17

深度学习驱动的公文校对系统:从BERT微调到离线交付实战

简介&#xff1a;基于深度学习的公文校对系统.zip是一个面向深度学习、机器学习课程期末大作业或毕业设计的完整Python实现&#xff0c;核心利用NLP技术对公文文本进行智能校对&#xff0c;可辅助处理拼写错误、语法偏差及格式不规范等问题。资源包共6个文件&#xff0c;压缩后…

作者头像 李华
网站建设 2026/10/1 13:16:57

2026年口碑好的企业专属知识库配套GEO优化公司实力参考

在当今数字化飞速发展的时代&#xff0c;企业的营销和推广方式也在不断地更新和变革。GEO优化作为一种精准的营销手段&#xff0c;对于企业获取本地流量、提升品牌曝光度具有重要意义。而企业专属知识库则能为企业提供智能应答、优化客户体验等功能。在2026年&#xff0c;选择一…

作者头像 李华
网站建设 2026/10/1 13:15:39

Java开发者AI应用实战:Spring AI与RAG集成路线图

Java 圈子这两年有个挺有意思的现象&#xff1a;面试造火箭的那批人&#xff0c;突然开始集体焦虑 AI。倒不是怕被 AI 取代&#xff0c;而是发现身边做 Python 的同事&#xff0c;三行代码就能调个大模型跑通一个 RAG 问答&#xff0c;自己还在那儿纠结 Maven 依赖冲突。更扎心…

作者头像 李华
网站建设 2026/10/1 13:15:18

AI工程从零到实战:Prompt、RAG与Agent全链路指南

1. 项目概述&#xff1a;一个仓库背后的AI工程路线图1.1 为什么会有 ai-engineering-from-scratch 这个项目我接触 AI Engineering 已经三年多了。回想刚入门那会儿&#xff0c;最痛苦的其实不是模型不会调参&#xff0c;而是信息太碎。今天看到一段 Prompt 技巧&#xff0c;明…

作者头像 李华