仿仙剑Java游戏实战:状态机、碰撞检测与JSON存档改造指南
简介这是一份基于Java编写的仿仙剑奇侠传游戏工程定位为毕业设计或课程设计素材适合希望通过完整项目提升编程能力的初学者和中级开发者。项目实现了角色移动、战斗系统、剧情推进、进度存档等核心玩法并融入事件驱动、状态机、多线程、文件读写、异常处理等后端开发要点源码中还包含GamePanel1、read_or_save等模块可帮助理解游戏界面与数据持久化的衔接。压缩包共526个文件约177.48MB其中503个png素材用于场景与角色表现另有gif、jpg、wav、mid、bmp等媒体资源以及4个java源文件和说明文档整体结构清晰。已有646人浏览学习适合作为课程设计答辩展示、毕业设计扩展基础或Java游戏后端入门练习可在现有框架上继续添加玩法、优化交互并巩固面向对象设计能力。1. 仿仙剑的Java游戏打开zip之前先看它的技术骨架基于java开发的仿仙剑奇侠传游戏.zip这个文件名一听就知道里面装的不是3D大世界而是一个用Swing或Java 2D堆出来的2D像素回合制RPG。仙剑原版的迷宫、对话、战斗用Java做出来大致就是这个形态。这类zip在网上一搜一大把但多数解压后要么编译报错要么黑屏真正值得研究的是它的回合制战斗时序、瓦片地图碰撞、剧情触发这套骨架。这篇文章顺着这套骨架拆讲它是什么、怎么跑起来、哪些地方最容易翻车以及拿到手之后怎么把它改造成你自己的RPG。适合刚学完Java基础想找项目练手的人也适合想做课程设计但不想从零画界面的学生。2. 回合制战斗的时序控制状态机与轮次判定的落地写法2.1 为什么仙剑式战斗必须先谈状态机仿仙剑的战斗是典型的回合制玩家选指令、敌人出招、播动画、算伤害、判断胜负然后进入下一轮。很多人第一次写这种逻辑时习惯用一堆if嵌套结果就是玩家按一下攻击程序里同时跑出三个分支伤害结算和动画播放互相打架。这类项目的战斗逻辑如果不用状态机后期加一个中毒眩晕Buff就会把代码改得面目全非。状态机的思路是把战斗拆成几个互斥的阶段同一时刻只允许处于一个阶段。玩家指令只能在PLAYER_TURN阶段被接受敌人AI只能在ENEMY_TURN阶段执行动画播放和伤害飘字只能在ACTION_ANIMATION阶段发生。一个阶段做什么事是固定的阶段之间通过事件切换而不是通过函数调用互相跳转。这样写的好处是你永远知道游戏此刻处于哪个环节排查翻车现场时只需要看状态在哪个阶段卡住了。2.2 战斗控制器的状态机骨架我一般会用一个枚举定义状态再用一个控制器类持有当前状态和切换逻辑。下面这个骨架可以直接抄进Swing或JavaFX项目里。public class BattleController { // 战斗阶段的五个状态 public enum BattleState { PLAYER_TURN, // 玩家选择指令阶段 ENEMY_TURN, // 敌人行动阶段 ACTION_ANIMATION, // 招式动画与伤害结算阶段 VICTORY, // 胜利 DEFEAT // 失败 } private BattleState state BattleState.PLAYER_TURN; private final PlayerActor player; // 玩家角色 private final EnemyActor enemy; // 敌人 private int round 1; public BattleController(PlayerActor player, EnemyActor enemy) { this.player player; this.enemy enemy; } // 玩家在UI上点击攻击/法术/道具后统一进入这里 public void onPlayerCommand(PlayerCommand cmd) { if (state ! BattleState.PLAYER_TURN) { battleView.showTip(当前不能操作); return; } // 先锁定状态防止连点导致二次进入 state BattleState.ACTION_ANIMATION; // 玩家指令与敌人AI指令一起结算谁快谁先手 resolveRound(cmd, enemy.chooseAction()); } private void resolveRound(PlayerCommand playerCmd, EnemyCommand enemyCmd) { // 速度快的先出手这里用speed比较 if (player.speed enemy.speed) { executeAction(playerCmd, enemy); if (checkBattleEnd()) return; executeAction(enemyCmd, player); } else { executeAction(enemyCmd, player); if (checkBattleEnd()) return; executeAction(playerCmd, enemy); } if (checkBattleEnd()) return; round; // 状态切回玩家回合UI重新亮起指令按钮 state BattleState.PLAYER_TURN; battleView.updateRound(round); } }这段代码的关键点是onPlayerCommand开头的那道状态检查。很多回合制游戏出现玩家连点攻击导致一次回合打两下的玄学Bug就是因为少了这道锁。玩家按下按钮到动画播完中间有几百毫秒的窗口期状态不锁定的话第二次点击会把另一个回合提前触发。把state切到ACTION_ANIMATION之后再结算本质上是用状态机当作一个互斥锁。速度判定放在resolveRound里而不是放在玩家指令里是为了让敌人AI和玩家指令走同一条结算管线。排序、扣血、播动画、判断胜负这些流程不分敌我区别只在于参数是谁。这样后期加第三个队友或者多个敌人时只需要把List传进来逻辑不需要重写。2.3 动画播放期的卡顿别在主线程里Sleep战斗动画的播放是这个项目里最容易卡死的地方。常见错误是有人为了方便在ACTION_ANIMATION里直接写Thread.sleep(800)来模拟招式释放的停顿。这在Swing里是灾难sleep会阻塞事件分发线程界面整个冻结按钮点不了窗口拖不动看起来就像程序崩溃了。正确的做法是把动画拆成帧用javax.swing.Timer驱动每帧更新画面时间到再切换状态。下面是一段在Swing里播放伤害飘字后切换回合的写法。import javax.swing.Timer; public class BattleView extends JPanel { private final BattleController controller; private Timer animTimer; private int animFrame 0; // 播放出招 - 飘字 - 收招三个阶段共1.2秒 public void playActionAnimation() { animFrame 0; if (animTimer ! null) animTimer.stop(); animTimer new Timer(40, e - { animFrame; repaint(); // 触发paintComponent画面按animFrame绘制 if (animFrame 30) { // 30帧 * 40ms 1.2秒 animTimer.stop(); controller.onAnimationFinished(); // 动画播完才切状态 } }); animTimer.start(); } }这里Timer的40ms是每帧间隔30帧是总帧数。想调整动画快慢就改这两个参数帧间隔决定流畅度总帧数决定时长。新手容易踩的坑是把总帧数写成30却忘了乘帧间隔改来改去动画时长总不准。把Timer回调里的逻辑想成一个单独的小循环它只负责画画面和计数不负责游戏逻辑逻辑切换交给onAnimationFinished回调这样UI和状态机就解耦了。3. 场景与碰撞用二维数组把御剑江湖的地图层叠起来3.1 瓦片地图的数据结构和碰撞判定的原则仙剑式RPG的场景不是一张大图而是用固定尺寸的格子拼出来的。每个格子对应一个地块类型比如0是草地、1是墙、2是水、3是传送点。地图数据在Java里最直白的存法就是二维数组int[][] map第一维是行第二维是列。这种结构的优势是读起来直观调试时打一个断点就能看整张地图而且迷宫编辑器做导出时也天然是这种格式。碰撞判定的核心原则是先探测再移动不是先移动再回退。很多模拟实现写成先更新玩家坐标然后检测是否撞墙撞了就减回去。这在低帧率下会出现角色卡在墙里疯狂抖动、或者看起来穿墙的现象因为坐标回退的时机不稳定。正确做法是算出目标格子的坐标先查这个格子能不能走能走才更新坐标。3.2 角色移动与碰撞检测的实现下面这段是地图类里最核心的两个方法可以直接用在Swing的键盘监听或JavaFX的AnimationTimer里。public class TileMap { private final int[][] map; // 地图数据0可走1不可走 private final int rows; private final int cols; private final int tileSize; // 每格像素常见32或48 public TileMap(int[][] map, int tileSize) { this.map map; this.tileSize tileSize; this.rows map.length; this.cols map[0].length; } // 判断目标格子是否可进入 public boolean canMoveTo(int row, int col) { if (row 0 || col 0 || row rows || col cols) { return false; // 超出地图边界视为不可走 } return map[row][col] 0; // 0是可走地块1是墙 } // 玩家每帧调用返回新的行/列位置 public int[] tryMove(int curRow, int curCol, int dirRow, int dirCol) { int targetRow curRow dirRow; int targetCol curCol dirCol; if (canMoveTo(targetRow, targetCol)) { return new int[]{targetRow, targetCol}; } return new int[]{curRow, curCol}; // 撞墙则保持原位 } }参数说明dirRow和dirCol是方向向量向上是{-1,0}向下是{1,0}向左是{0,-1}向右是{0,1}。tileSize一般32或者48选32在屏幕1280x720下能显示40x22个格子适合俯视迷宫选48角色比例更大适合室内场景。这两种尺寸不要混用一张地图里混用会导致角色走到某些位置突然矮半截这是常见的又一处翻车点。canMoveTo里的边界判断顺序有讲究先判row和col是否越界再查map数组。Java二维数组越界会抛ArrayIndexOutOfBoundsException而边界外的格子本身就该视为不可走所以顺序不能反。如果把map[row][col]放在前面角色走到地图边缘时程序直接崩溃。3.3 NPC对话和事件触发的坐标判定仙剑的地图里NPC站在固定位置玩家靠近后按交互键触发对话。坐标判定不需要精确到像素级碰撞只要判断玩家与NPC的格子距离是否为1。下面这个方法是常见的触发写法。public int findNearbyNPC(int playerRow, int playerCol, Npc[] npcs) { for (int i 0; i npcs.length; i) { int dx Math.abs(playerRow - npcs[i].row); int dy Math.abs(playerCol - npcs[i].col); if (dx dy 1) { // 曼哈顿距离为1即上下左右相邻 return i; // 返回NPC在数组中的下标 } } return -1; // 附近没有NPC }这里用曼哈顿距离而不是欧氏距离是因为瓦片地图的移动本身是四方向的玩家只能从上下左右四个方向靠近NPC。用Math.abs相加判断距离为1正好覆盖这四个相邻格。触发对话后要记得把玩家状态锁住比如设置一个isInDialog布尔变量在对话窗口关闭前不允许移动否则会出现一边说话一边走路的诡异画面。4. 从zip到能玩解压、编译、资源路径的三道坎4.1 先看目录结构再决定用哪条编译路线拿到zip后别急着双击先解压看目录。这类Java游戏项目通常分两种形态一种是Maven或Gradle工程根目录下有pom.xml或build.gradle适合直接用命令行打包另一种是纯Swing写的Eclipse或NetBeans工程没有构建脚本只有src文件夹和一个Main类。判断方法很简单看根目录有没有pom.xml。Maven工程的编译运行一条命令就能完成。需要注意编码参数Windows下源码文件可能是GBK而Maven默认用项目声明的编码如果pom.xml里没写UTF-8而代码里有中文对话编译会报乱码错误。# 解压zip unzip xianjian_game.zip -d xianjian_game cd xianjian_game # 查看目录结构确认有没有pom.xml ls -la # Maven工程打包并运行 mvn clean package -DskipTests java -jar target/xxx.jar # 纯源码工程手动编译-encoding指定源码编码 javac -encoding UTF-8 -d out src/com/game/Main.java java -cp out com.game.Main如果javac报编码GBK的不可映射字符说明源码是GBK编码把-encoding改成GBK再编译。如果编译成功但运行时提示找不到主类检查Main类的包名java -cp后面跟的类名必须带完整包路径。4.2 资源路径的坑用getResource而不是new File这个坑几乎每个Java游戏项目都有。图片、音频、地图配置文件放在res或resources目录下代码里用new File(res/icon.png)加载在IDE里跑得好好的一打包成jar就黑屏。原因是new File用的是相对路径依赖当前工作目录jar包运行时工作目录是用户启动命令的地方不是jar包内部。正确做法是用类加载器读取资源。下面这段代码把图片加载统一封装避免每个地方都写一遍。import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.InputStream; public class ResourceLoader { // 用类加载器读取资源文件放在src/main/resources/或classpath下 public static BufferedImage loadImage(String path) { try (InputStream in ResourceLoader.class.getResourceAsStream(path)) { if (in null) { throw new IllegalArgumentException(找不到资源: path); } return ImageIO.read(in); } catch (Exception e) { throw new RuntimeException(图片加载失败: path, e); } } }调用时路径要带前导斜杠ResourceLoader.loadImage(/images/hero.png)。前导斜杠表示从classpath根目录开始找不带斜杠则从当前类所在包开始找。这是新手最容易搞混的细节写错了不会报编译错误只会运行时抛NullPointerException然后整个画面一片空白。如果用IDE调试记得把resources目录标成Resources Root否则即使代码写对了IDE也不会把资源文件复制到输出目录。这个操作在IntelliJ里是右键文件夹 - Mark Directory as - Resources Root。4.3 版本不匹配导致的ClassNotFoundExceptionzip里的源码可能是用旧版JDK写的比如JDK 8而你本机装的是JDK 17或更高。编译时一般不会出问题但运行时会遇到一些类找不到或方法过期的现象。最典型的例子是老项目里用了javax.swing.JApplet这在现代JDK里已经被移除。遇到这种报错先查JDK版本而不是急着改代码。# 查看当前JDK版本 java -version # Linux/macOS下切换JDK版本按实际安装路径写 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH # Windows下设置当前会话的JAVA_HOME set JAVA_HOMEC:\Program Files\Java\jdk-8 set PATH%JAVA_HOME%\bin;%PATH%切换后再跑一次java -version确认。如果zip里有旧版JDK的本地库或依赖jar切到新JDK也救不了那就只能在旧JDK环境里跑。这一点在动手改代码之前就要确认不然后面改了半天发现环境根本不匹配白白浪费时间。5. 避坑笔记卡顿、穿墙、存档读取失败的5个现场5.1 战斗动画卡死整个窗口现象玩家点攻击后窗口冻结鼠标点击无响应几秒后恢复正常但画面直接跳到结算结果。 原因动画期间在事件分发线程里执行了Thread.sleep阻塞了Swing的UI线程导致所有界面事件排队等待。 解决把sleep拆成Timer逐帧驱动参考第2章的playActionAnimation写法。如果项目里已经用了java.util.Timer或ScheduledExecutorService可以替换Timer但要注意所有UI更新必须切回Swing事件线程跨线程直接修改组件会抛异常。5.2 角色撞墙后抖动或穿墙现象玩家按住方向键角色在墙边剧烈抖动偶尔还会穿透到墙的另一侧。 原因先移动坐标再检测碰撞撞墙后减回原位的做法在低帧率下不稳定。如果帧率波动减回操作可能发生在下一次移动计算之后。 解决改为先算目标格子调canMoveTo判断能走才更新坐标。注意dirRow和dirCol必须是整数步进不能出现0.5格这种数值否则碰撞判定会失效。5.3 图片加载NPE解压后运行黑屏现象编译一次通过运行时直接抛NullPointerException断点定位到ImageIO.read那一行。 原因资源路径用了new File(res/xxx.png)依赖当前工作目录。用命令行从别的目录启动程序时路径就失效了。 解决全部换成getResourceAsStream统一走ResourceLoader。排查时打印getResourceAsStream返回的InputStream是否为null为null就是路径写错了重点检查前导斜杠和目录层级。5.4 存档读取后角色属性全是默认值现象保存后重新读档角色的等级、血量、经验全变成初始值但地图坐标正常。 原因对象序列化时字段没有全部声明或者类结构变了。Java的ObjectOutputStream序列化依赖类的serialVersionUID一旦类里增删字段旧存档反序列化就会失败或静默丢失部分字段。 解决给存档类显式声明serialVersionUID并用版本号字段控制。更彻底的办法是换成JSON存档见第6章。5.5 按键一次移动两格现象键盘按住方向键角色明显比预期跑得快每次按下都跳两格。 原因keyPressed事件和游戏循环互相叠加。Swing的keyPressed在按住时会连续触发如果每触发一次就立即移动一格同时游戏循环也在按帧移动两个机制都在改坐标。 解决只在keyReleased或第一次keyPressed时设置方向标记真正的位移只在游戏循环里执行。这样键盘事件只负责告诉方向不负责执行移动两者就不会叠加了。6. 进阶改造把技能和怪物交给JSON存档才不会越改越乱仿仙剑项目的后期最痛苦的事不是写新功能而是改数值。每调整一次怪物血量就要找到对应的Java类改构造参数重新编译重新打包。这个循环跑几轮就让人想放弃。这个阶段值得做的一件事是数据驱动把技能、怪物、物品的数值抽出来放到json文件里Java代码只负责读取和执行规则不负责写死数值。JSON方案比Java序列化更适合作存档。原因是JSON是文本格式坏了一半还能手动修而ObjectOutputStream是二进制格式类结构一对不上整个存档直接报废。存档设计兜底思路存一个version字段每次更新存档结构时版本号1读取时按版本号走不同的解析逻辑。下面这段代码是最小可用的存档读写方案。import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class SaveManager { private static final Gson GSON new GsonBuilder().setPrettyPrinting().create(); private static final int SAVE_VERSION 3; // 存档结构版本 // 存档数据类 public static class SaveData { int version; int playerHp; int playerLevel; int mapRow; int mapCol; String currentMap; // 当前地图名称 } public static String serialize(SaveData data) { data.version SAVE_VERSION; return GSON.toJson(data); } public static SaveData deserialize(String json) { SaveData data GSON.fromJson(json, SaveData.class); // 版本校验版本号对不上就拒绝读取避免结构错位 if (data.version ! SAVE_VERSION) { throw new RuntimeException(存档版本不匹配: data.version); } return data; } }注意这个方案里我每次存新档都把version写成当前版本。将来游戏发布到第二个版本时如果加了当前任务ID字段就把SAVE_VERSION改成4读取时做一次兼容处理。这个版本号字段是血泪经验不加的话早期测试档全部报废玩家不会接受这种体验。技能和怪物配置同理。把招式伤害、消耗蓝量、特效类型写成json游戏启动时一次性加载进内存之后战斗逻辑从Map里取值。这样做的好处是调试平衡时不用重新编译改完json重启游戏就能生效。对仿仙剑这种以剧情和数值为核心的游戏数据驱动是性价比最高的架构改造。验证这个方向值不值得做有一个简单标准看一下zip里的代码如果怪物类里写满了魔法值、掉率、经验值的构造函数参数那就值得改。如果你的玩法已经稳定、也没打算再调平衡那保持现状也不丢人。我自己最初拿到这类项目时第一件事就是先跑起来第二件事就是加JSON存档。改了三天后所有数值调整都变得很快但也因为一开始没加version字段丢过一次花了四个小时打出来的进度。后来所有存档类第一行永远是version这个习惯救了我好几回。希望这篇能帮你少走这些弯路。本文还有配套的精品资源点击获取

相关新闻

Claude Opus 5.5 焚诀实战:Sub-agent、CLAUDE.md 与 effort 调优指南

Claude Opus 5.5 焚诀实战:Sub-agent、CLAUDE.md 与 effort 调优指南

1. 这次“焚诀”到底更新了什么Claude Opus 5.5 这个版本号一出来,我第一反应是去翻更新日志里跟日常写代码最相关的几个点。说实话,模型跑分涨了多少、榜单排第几,对天天用 Claude Code 干活的人来说意义不大,真正影响手感的是三…

2026/10/9 17:28:36 阅读更多 →
全屏视频背景HTML实现:播放、裁剪与性能优化

全屏视频背景HTML实现:播放、裁剪与性能优化

简介:这是一份面向网页前端初学者的全屏视频背景实现源码包,以超文本标记语言与层叠样式表为核心技术,解决网页视觉沉浸感与不同屏幕尺寸下的适配问题,适合个人网站与品牌落地页快速落地。资源共三个文件,包含一个mp4示…

2026/10/9 17:28:36 阅读更多 →
Python爬虫实战:B站弹幕与QQ音乐热评抓取全流程

Python爬虫实战:B站弹幕与QQ音乐热评抓取全流程

1. 从两个爬虫项目说起:为什么选B站弹幕和QQ音乐热评做爬虫的人都有一个共识:练手项目选得好,学习效率能翻倍。我前后带过不少刚入门的朋友,发现一个规律——凡是拿电商网站练手的,十有八九卡在登录态和验证码上&#…

2026/10/9 17:28:36 阅读更多 →

最新新闻

基于PyQt+YOLOv5+dlib的驾驶员行为监控系统实战

基于PyQt+YOLOv5+dlib的驾驶员行为监控系统实战

简介:这份课程设计资源面向计算机视觉与深度学习方向的本科生及自学者,提供一套基于PyQt5、YOLOv5与Dlib的驾驶员行为监控系统完整实现,可用于课程设计、毕业设计或视觉项目练手。系统通过摄像头实时采集视频流,结合YOLOv5完成目标…

2026/10/9 17:57:30 阅读更多 →
23k张道路病害XML数据集:VOC转YOLO训练指南与避坑实践

23k张道路病害XML数据集:VOC转YOLO训练指南与避坑实践

简介:道路病害检测数据集压缩包,面向计算机视觉与深度学习开发者,适用于道路病害识别模型的数据准备与工程落地,核心价值在于解决标注数据获取难的痛点。压缩包内共两千个文件,其中一千九百九十八个为XML格式的标注文件…

2026/10/9 17:57:30 阅读更多 →
从impeccable到可执行标准:如何打造无可挑剔的代码与交付物

从impeccable到可执行标准:如何打造无可挑剔的代码与交付物

1. 从一个词出发:为什么"impeccable"值得单独拿出来聊第一次看到"impeccable"这个词被单独拎出来当作一个项目标题,我的反应是愣了一下。这不是一个技术名词,也不是某个框架或者工具的名字,它就是一个英文形容…

2026/10/9 17:57:30 阅读更多 →
终端AI编码助手魔改实战:从配置加载到钩子脚本的完整定制指南

终端AI编码助手魔改实战:从配置加载到钩子脚本的完整定制指南

前阵子有几个做开发的朋友不约而同来问我同一个问题:网上到处都在说终端里的 AI 编码助手可以魔改,改完之后能自动生成提交信息、自动带项目上下文、自动调用团队工具链,到底是怎么做到的?说实话,我刚接触这个玩法的时…

2026/10/9 17:57:29 阅读更多 →
历年数学建模竞赛真题高效刷题与建模流程避坑指南

历年数学建模竞赛真题高效刷题与建模流程避坑指南

简介:《历年数学建模竞赛试题及参考答案》是一份面向数学建模竞赛参赛者、高校指导教师和自学者的rar压缩包,汇集了一九九四年至二〇〇三年以及二〇〇五年的全国竞赛试题,并纳入国内多所高校的竞赛自命题,同时配有参考答案与讲解幻…

2026/10/9 17:56:28 阅读更多 →
YOLOv5生活垃圾分类系统:从数据噪声建模到树莓派实时部署

YOLOv5生活垃圾分类系统:从数据噪声建模到树莓派实时部署

简介:本资源是一套基于YOLOv5实现的智能生活垃圾分类系统完整工程,面向人工智能与深度学习初学者、本科毕业设计及课程设计学生,解决实际场景中垃圾图像识别与分类落地难题。项目含76个文件,以40个Python源码(涵盖dete…

2026/10/9 17:56:28 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →