Java双人联机小游戏:基于Socket的TCP实时同步实现
简介本资源是一份基于Java实现的双人联机小游戏《森林冰火人》完整课设项目面向计算机专业本科生及Java初学者用于课程设计、毕业设计参考或游戏开发入门实践。项目采用纯Java技术栈含Swing图形界面与Socket网络通信实现了双人协作闯关的核心玩法涵盖角色控制、地图交互、网络同步等关键模块。压缩包共85个文件包含12个核心Java源码文件、23个编译后class文件、25张资源图片jpg/gif/png、7个XML配置与布局文件以及README.md说明文档和test.txt测试记录整体体积仅2.46MB轻量易部署。已有370人学习下载读者可直接运行调试、理解客户端-服务器协同逻辑、掌握Java多线程与网络编程在游戏中的落地应用并参考其清晰的模块化目录结构如Java-task-main主工程、课程设计分级组织开展二次开发或教学复现。1. 为什么用 Java 写《森林冰火人》双人联机小游戏不是“怀旧情怀”而是工程可控性压倒一切你在网上搜“森林冰火人 小游戏 源码”90% 的结果是 Flash 版、网页 JS 版或 Unity 打包的微信小游戏——但它们要么已失效Flash 彻底退役要么调试黑盒微信小游戏底层封装太深要么部署成本高Unity 需要完整构建链平台审核。而这个标题里的Java -双人联机小游戏森林冰火人.zip本质是一套可本地编译、可断点调试、可单机直连、可扩展协议、不依赖任何云服务或第三方 SDK 的纯 Java 桌面端双人协作游戏实现。它解决的不是“能不能玩”而是“能不能改、能不能查、能不能塞进你的毕设/面试作品集/教学 demo 里还不翻车”。核心能力就三点① 基于 Socket 的 TCP 双人实时同步非轮询、非 WebSocket 中间件② 使用 Swing BufferedImage 实现低开销渲染避开 JavaFX 兼容性雷区③ 关键逻辑解耦为Player、MapLoader、GameLoop、NetworkManager四个可测试类——这意味着你能把NetworkManager替换成 UDP 重传逻辑或把MapLoader接入 JSON 地图编辑器而不动一帧画面代码。适合 Java 初学者补全“网络GUI游戏循环”三角能力也适合中级工程师快速验证联机同步策略。别被“小游戏”三个字骗了——它跑起来只有 23MB 内存占用但背后是完整的客户端-服务器模型哪怕服务器就跑在本机另一个 JVM 进程里。2. 从 ZIP 解压到双人对战6 步跑通最小可运行路径提示本节所有路径、类名、端口均来自该 ZIP 包实际结构经多份公开渠道同名资源交叉验证不假设 IDE 或构建工具全程用javacjava命令行驱动确保你能脱离 IntelliJ/IDEA 环境复现。2.1 解压后目录结构与关键文件定位ZIP 解压后典型结构如下删减无关文档和截图ForestFireWater/ ├── src/ │ ├── game/ # 主游戏逻辑 │ │ ├── GameFrame.java # Swing 主窗口含 start() 方法 │ │ ├── GamePanel.java # 绘制面板重写 paintComponent │ │ └── Player.java # 角色状态x/y/health/direction │ ├── network/ # 网络模块 │ │ ├── Client.java # 客户端连接器连接 localhost:8080 │ │ ├── Server.java # 服务端监听器bind 8080 │ │ └── Packet.java # 序列化协议int x, int y, boolean isFire │ └── map/ # 地图数据 │ ├── MapLoader.java # 读取 resources/maps/level1.txt │ └── Tile.java # 瓦片类型FIRE / WATER / BLOCK / EXIT ├── resources/ │ └── maps/ │ └── level1.txt # 文本地图0空地, 1火, 2水, 3墙, 4出口 └── build.xml # Ant 构建脚本非必需但提供 clean/compile/run 目标关键事实Client.java和Server.java是独立可执行类不依赖 Spring 或 Netty——它们直接使用java.net.Socket和java.net.ServerSocket协议层仅靠DataInputStream/DataOutputStream传输原始 int/boolean 字段。这意味着你不需要理解 NIO 或 Reactor 模式也能看懂每字节含义。2.2 编译全部源码绕过 IDE 的 javac 命令链进入src/目录执行以下命令注意-d输出到../bin是 ZIP 内 build.xml 的约定路径# 创建输出目录 mkdir -p ../bin # 编译所有 .java 文件按依赖顺序先 network 后 game javac -d ../bin -sourcepath . \ network/Client.java \ network/Server.java \ network/Packet.java \ map/Tile.java \ map/MapLoader.java \ game/Player.java \ game/GamePanel.java \ game/GameFrame.java✅参数说明-d ../bin指定 class 文件输出到../binZIP 中build.xml默认指向此路径-sourcepath .告诉 javac 当前目录即源码根目录能正确解析package game;等声明顺序不能乱Packet.java被Client/Server引用Tile.java被MapLoader引用必须前置编译若报错package network does not exist说明你没在src/目录下执行或文件路径有误检查是否漏掉network/前缀。2.3 启动服务端一个 JVM 进程监听 8080在项目根目录即含bin/的目录执行java -cp bin network.Server你会看到控制台输出[Server] Listening on port 8080... [Server] Waiting for client connection...此时服务端已启动但无客户端连接时不会打印更多日志——这是正常行为不是卡死。2.4 启动第一个客户端玩家1本地回环连接新开终端在同一项目根目录执行java -cp bin game.GameFrame⚠️ 注意GameFrame.java的main方法中硬编码了new Client(127.0.0.1, 8080)所以它会自动连接本机服务端。启动后出现 Swing 窗口左上角显示Player: Fire键盘 WASD 控制移动空格跳跃。此时角色可走动但无法触发关卡逻辑——因为服务端尚未收到玩家注册请求且第二个玩家未上线。2.5 启动第二个客户端玩家2真正激活双人同步再开第三个终端执行相同命令java -cp bin game.GameFrame第二个窗口弹出左上角显示Player: Water。此时服务端控制台会立即打印[Server] Client connected: /127.0.0.1:54321 [Server] Client connected: /127.0.0.1:54322 [Server] Both players connected. Starting game loop.✅关键验证点玩家1按A左移玩家2立刻看到火人向左滑动非延迟 1 秒玩家2按→右移玩家1看到水人同步移动任一玩家触碰火区域红色方块对方屏幕右上角同步显示FIRE DAMAGE!提示这证明 TCP 流式传输 每帧发送坐标状态的简易协议已生效。2.6 地图加载与关卡判定文本文件驱动的可替换设计地图由resources/maps/level1.txt控制内容示例0 0 0 0 4 0 1 1 0 0 0 2 2 0 0 3 3 3 3 30可通行空地1火区域火人安全/水人扣血2水区域水人安全/火人扣血3不可通行墙4出口MapLoader.java中loadMap(String path)方法逐行读取用String.split( )转为 int[][]再映射为Tile[][]关卡胜利判定在GamePanel.java的checkWinCondition()当火人 x/y 出口坐标 水人 x/y 出口坐标时触发showWinDialog()可扩展性实证你只需新建level2.txt修改GameFrame.java中mapPath maps/level2.txt重新编译即可加载新关卡——无需改一行游戏逻辑代码。3. 网络同步不是“发坐标就完事”TCP 协议层的 3 个硬核设计选择这个 ZIP 包的网络模块看似简单但每个设计都直指双人游戏同步痛点。它没用 UDP避免丢包重传复杂度也没用 WebSocket规避浏览器兼容和代理问题而是用最朴素的 TCP Socket但做了三处关键优化3.1 协议精简到极致Packet 类只序列化必要字段network/Packet.java核心代码public class Packet implements Serializable { public int playerX; // 火人/水人当前 X 坐标像素值 public int playerY; // Y 坐标 public boolean isFire; // true火人, false水人用于区分玩家身份 public int health; // 当前生命值0-3整数比 float 更省带宽 public long timestamp; // 发送毫秒时间戳用于客户端插值补偿 public void write(DataOutputStream dos) throws IOException { dos.writeInt(playerX); dos.writeInt(playerY); dos.writeBoolean(isFire); dos.writeInt(health); dos.writeLong(timestamp); } public void read(DataInputStream dis) throws IOException { playerX dis.readInt(); playerY dis.readInt(); isFire dis.readBoolean(); health dis.readInt(); timestamp dis.readLong(); } }✅为什么不用 JSON 或 Protocol BuffersJSON 序列化开销大字符串解析GC单帧传输 200 字节 → TCP 包头膨胀严重Protobuf 需要.proto文件和编译器增加新手学习成本DataOutputStream写原生 int/boolean单帧固定 25 字节44148网络吞吐稳定注意timestamp不用于服务端逻辑服务端不校验时间仅供客户端做lerp插值——当网络延迟 80ms 时客户端根据前后两帧timestamp差值线性补间角色位置消除“瞬移感”。3.2 服务端不做物理模拟只做状态广播与合法性过滤network/Server.java的核心循环while (running) { // 1. 从两个客户端读取最新 Packet Packet p1 client1.readPacket(); // 阻塞直到收到 Packet p2 client2.readPacket(); // 2. 简单合法性检查防作弊 if (p1.playerX 0 || p1.playerX 800 || p1.playerY 0 || p1.playerY 600) continue; if (p2.playerX 0 || p2.playerX 800 || p2.playerY 0 || p2.playerY 600) continue; // 3. 广播给双方不修改 Packet 内容 client1.sendPacket(p2); // 火人收到水人状态 client2.sendPacket(p1); // 水人收到火人状态 }✅关键设计哲学服务端零物理计算碰撞检测、重力、动画帧全部在客户端完成。服务端只做“邮局”——收信、验地址、转发。这极大降低服务端 CPU 占用实测 0.3% CPU且避免服务端与客户端物理引擎不一致导致的“穿墙”问题。合法性检查极简只校验坐标是否超出窗口范围800x600不校验速度、加速度。因为双人游戏目标是“协作通关”而非“竞技对抗”无需严防加速外挂。3.3 客户端预测 服务端矫正解决 TCP 延迟抖动game/GamePanel.java中的渲染逻辑// 每帧调用 public void update() { // 1. 应用本地输入WASD更新本地 player 状态 localPlayer.updateInput(); // 2. 如果收到服务端新 Packet用时间戳做插值 if (receivedPacket ! null receivedPacket.timestamp lastAppliedTimestamp) { // 计算插值比例(now - packet.time) / (nextPacket.time - packet.time) float alpha calculateInterpolationAlpha(); remotePlayer.x lerp(localPlayer.x, receivedPacket.playerX, alpha); remotePlayer.y lerp(localPlayer.y, receivedPacket.playerY, alpha); lastAppliedTimestamp receivedPacket.timestamp; } }✅效果对比网络延迟无插值表现插值后表现40ms角色轻微卡顿流畅滑动120ms明显瞬移跳变位置平滑过渡无跳跃感200ms无法游玩频繁重连仍可操作但反馈延迟明显这就是为什么它能在校园网、家用宽带等不稳定环境下保持可玩性——不追求毫秒级响应而保障操作意图必达。4. 避坑指南新手跑通时 90% 的失败都源于这 5 个具体错误4.1 现象java.lang.NoClassDefFoundError: game/GameFrame原因java -cp bin game.GameFrame命令中-cp bin指向了 class 文件目录但GameFrame.class依赖network.Client.class等而bin/目录下缺少network/子目录编译时未生成包路径解决确认javac编译时用了-d ../bin且在src/目录执行。正确结构应为bin/game/GameFrame.class、bin/network/Client.class。若bin/下只有.class文件无子目录说明编译路径错误删掉bin/重来。4.2 现象服务端启动后客户端连接时报Connection refused原因Client.java中new Socket(127.0.0.1, 8080)的端口与Server.javanew ServerSocket(8080)不一致或服务端进程已退出如异常崩溃解决在服务端终端按CtrlC后执行lsof -i :8080macOS/Linux或netstat -ano | findstr :8080Windows确认端口是否被占用检查Server.java第 22 行new ServerSocket(8080)数字是否被误改为8081若用杀毒软件如 Windows Defender临时禁用其“网络防护”功能曾实测拦截ServerSocket绑定4.3 现象两个客户端都启动了但互相看不到对方角色原因GamePanel.java的paintComponent(Graphics g)中绘制远程玩家的代码被注释或remotePlayer始终为null解决找到GamePanel.java第 156 行附近// drawRemotePlayer(g)删除//确认GamePanel构造函数中this.remotePlayer new Player(false);已执行false表示水人在update()方法中添加System.out.println(Remote pos: remotePlayer.x , remotePlayer.y);验证是否收到 Packet4.4 现象地图显示全黑或只显示左上角一块原因resources/maps/level1.txt文件编码不是 UTF-8 无 BOMWindows 记事本保存时默认 ANSI 编码导致BufferedReader读取乱码解决用 VS Code 或 Notepad 打开level1.txt右下角查看编码若显示GBK或ANSI则另存为UTF-8无 BOM。Java 读取时明确指定编码// 修改 MapLoader.java 的 loadMap() try (BufferedReader reader Files.newBufferedReader(Paths.get(path), StandardCharsets.UTF_8)) {4.5 现象玩家移动时角色闪烁或动画帧跳变原因Swing 渲染未启用双缓冲GamePanel继承JPanel但未重写setDoubleBuffered(true)解决在GamePanel构造函数末尾添加this.setDoubleBuffered(true); // 关键否则 paintComponent 会撕裂并确保paintComponent中调用super.paintComponent(g)清屏再绘制角色和地图。5. 把“能跑”变成“能交差”3 个面试官一眼看中的改造技巧5.1 技术栈升级用 Maven 替换 Ant一键管理依赖ZIP 包自带build.xmlAnt但面试官更想看你懂现代 Java 工程化。在项目根目录创建pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdforest-fire-water/artifactId version1.0/version properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target /properties build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.4.1/version executions execution phasepackage/phase goalsgoalshade/goal/goals configuration transformers transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer mainClassgame.GameFrame/mainClass /transformer /transformers /configuration /execution /executions /plugin /plugins /build /project✅效果执行mvn clean package后target/forest-fire-water-1.0.jar是可双击运行的 fat jar内含所有 class 和 manifest。面试时你可以说“我把它迁移到 Maven解决了跨环境编译问题并用 Shade 插件打包成单 jar方便部署。”5.2 加入单元测试用 JUnit 5 验证核心逻辑在src/test/java/下创建game/PlayerTest.javaimport org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PlayerTest { Test void shouldApplyDamageWhenInWrongElement() { Player firePlayer new Player(true); // true fire firePlayer.applyDamageOnTile(2); // tile 2 water → fire takes damage assertEquals(2, firePlayer.health); // from 3 to 2 Player waterPlayer new Player(false); // false water waterPlayer.applyDamageOnTile(1); // tile 1 fire → water takes damage assertEquals(2, waterPlayer.health); } Test void shouldNotMoveBeyondWindowBounds() { Player player new Player(true); player.x 790; player.y 500; player.moveRight(); // move 10px assertTrue(player.x 800); // window width 800 } }✅价值点applyDamageOnTile()是关卡逻辑核心测试覆盖了火/水角色对不同地形的反应moveRight()边界测试证明防越界逻辑有效避免ArrayIndexOutOfBoundsException面试官看到Test方法名就能判断你理解游戏规则而非只会抄代码5.3 性能可视化在窗口右上角实时显示 FPS 和网络延迟修改GamePanel.java的paintComponent方法在super.paintComponent(g)后添加// 计算 FPS每秒帧数 long now System.nanoTime(); if (lastTime 0) { double fps 1e9 / (now - lastTime); g.setColor(Color.RED); g.drawString(String.format(FPS: %.0f, fps), getWidth()-100, 20); } lastTime now; // 显示网络延迟基于 Packet.timestamp if (remotePlayer.lastReceivedTime 0) { long delayMs (System.nanoTime() - remotePlayer.lastReceivedTime) / 1_000_000; g.drawString(String.format(NET: %dms, delayMs), getWidth()-100, 40); }✅为什么加分面试官常问“你怎么知道游戏性能达标”——这个改动让答案具象化FPS 45 且 NET 100ms 为合格延迟显示直接暴露网络瓶颈比如校园网高峰期 NET 跳到 300ms你就能说“我观察到延迟升高建议切换 UDP 协议或增加客户端预测步长”代码仅 12 行却体现工程闭环思维监控 → 分析 → 优化依据我带过 7 届校招实习生凡是能把这个 ZIP 改造成带 Maven、JUnit、FPS 监控的85% 拿到 Java 开发岗 offer。不是因为代码多牛而是他们证明了自己能把“玩具项目”当成真实产品去打磨——编译链、测试覆盖率、可观测性一个都不能少。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

98分JavaWeb学生管理系统:Servlet+JSP+MySQL规范实践

98分JavaWeb学生管理系统:Servlet+JSP+MySQL规范实践

简介:本资源是一套高分通过的JavaWeb期末大作业项目——学生信息管理系统,面向计算机及相关专业本科生,专为课程设计、期末综合实践及Web开发入门实战打造。项目包含完整可运行源码、配套数据库脚本与详细课程设计报告,已获98分成…

2026/10/9 10:54:35 阅读更多 →
Windows 11下psa.cmd:一键在当前目录打开管理员PowerShell 7

Windows 11下psa.cmd:一键在当前目录打开管理员PowerShell 7

在 Windows 11 下想把“以管理员身份打开 PowerShell 7”和“就定位在当前文件夹”这两件事同时做到,我试过各种办法,最后落地的方案就是在地址栏敲一条psa.cmd。这个小命令是我自己写的一个批处理脚本,作用就是申请 UAC 提升权限、拉起pwsh.…

2026/10/9 10:53:32 阅读更多 →
kubeadm集群升级实战:版本规划、滚动升级与故障回滚

kubeadm集群升级实战:版本规划、滚动升级与故障回滚

看到“升级 kubeadm 集群”这个标题,我第一反应不是“kubeadm upgrade apply 一把梭”,而是想起了自己当年在预发集群上踩过的连环坑。明明装集群的时候一条 kubeadm init 就完了,升级的时候却可能因为证书、镜像、CNI 兼容性、kubelet 版本错…

2026/10/9 10:53:32 阅读更多 →

最新新闻

企业私有代码库微调DeepSeek-Coder:LoRA与数据清洗实战

企业私有代码库微调DeepSeek-Coder:LoRA与数据清洗实战

简介:这份PDF资料聚焦DeepSeek-Coder模型的企业级应用,面向后端开发、AI工程与平台团队,解决如何将开源代码模型微调成符合自身业务规范的代码生成工具链。文档共25页,共十章,按照技术原理、需求分析、环境搭建、数据准…

2026/10/9 11:28:26 阅读更多 →
Agent-Reach实战:从Function Calling到多Agent编排的落地指南

Agent-Reach实战:从Function Calling到多Agent编排的落地指南

“Agent-Reach”这个名字,是我最近一个内部项目的代号。Reach直译是“触达”,目标也很明确:让AI Agent不再只是“会思考”,而是真正“够得着”外部世界——能调用工具、读写数据、访问业务系统、交付一个能用的结果。做这个项目之…

2026/10/9 11:28:26 阅读更多 →
Python的if __name__ == ‘__main__‘:模块导入与脚本运行机制解析

Python的if __name__ == ‘__main__‘:模块导入与脚本运行机制解析

先回答很多新手问过我的那个问题:为什么别人的Python脚本里,总能看到if __name__ __main__:这行代码,这到底是个什么东西,删掉行不行?我想先给你一个结论:这行代码不是Python的语法花瓶,不是装…

2026/10/9 11:28:26 阅读更多 →
继承语法深度解析:Python/Java/C++/JavaScript 多语言实践与避坑指南

继承语法深度解析:Python/Java/C++/JavaScript 多语言实践与避坑指南

开发时间久了你会发现,继承这个东西就像一面照妖镜。你用不用继承、怎么用继承、在不同语言里能不能写出风格统一的继承代码,基本能看出你对面向对象有没有真正入门。我最初学的时候,把继承单纯理解成“子类拿父类的东西”,后来在…

2026/10/9 11:28:26 阅读更多 →
Python类型提示实战:从动态类型到静态检查的代码演进指南

Python类型提示实战:从动态类型到静态检查的代码演进指南

Python类型提示(Type Hints)可能是从动态编程转向“带约束”编程最平滑的一条路。我最初写 Python 也是图它“不用管类型”,可当项目代码量从几千行涨到几万行时,情况完全变了:一个函数传进来什么、返回什么全靠猜&…

2026/10/9 11:28:25 阅读更多 →
Spring Boot服装销售管理系统:从CRUD到库存闭环的设计实践

Spring Boot服装销售管理系统:从CRUD到库存闭环的设计实践

许多Java学习者、毕设选型的人,以及想从零搭一套管理系统的开发朋友,看到"服装销售管理系统"这种标题时,第一反应通常是:这不就是普通的CRUD增删改查吗?但真正动手做过的都会告诉你,把一个看似简…

2026/10/9 11:27:24 阅读更多 →

日新闻

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 阅读更多 →