Unity C#战棋游戏源码解析:网格寻路与回合调度实战
简介这是一份面向计算机、通信、自动化等相关专业学生与开发者的C#毕业设计项目源码基于Unity引擎实现一款小型战棋游戏适合作为期末课程设计、课程大作业或毕业设计参考也可供初学者与进阶者学习借鉴。压缩包共约2000个文件整体约135.37MB涵盖30个cs脚本、18个prefab预制体、19个asset资源、5个unity场景、5个mat材质、206张png贴图及若干json、xml、md说明文档完整保留了Unity工程的资源与配置结构便于直接导入编辑器运行调试。项目为个人毕设成果答辩评审分达98分代码经过调试测试可正常运行。已有244人学习关注。读者可从中了解战棋类游戏的回合逻辑、角色移动与战斗判定、场景与预制体组织方式并在此基础上修改调整实现不同玩法功能具备较高的学习与借鉴价值。1. 从一份 98 分毕设说起这套 C# 战棋源码到底能跑出什么如果你正在为期末大作业或者毕业设计找方向又恰好对 SLG 战棋品类有点兴趣那这套基于 Unity 的 C# 战棋游戏项目源码值得花时间拆一遍。它不是那种只有空壳场景的演示工程而是把战棋的核心循环——网格寻路、回合调度、单位属性、攻击判定、胜负条件——都落到了可运行的代码里。答辩能拿到 98 分说明至少在功能完整度和代码规范上经得起追问。适合三类人一是需要快速搭出战棋原型的学生开发者二是想拿一套完整 C# 工程练手 Unity 架构的进阶新手三是导师要求“有实际交互逻辑”而非纯理论堆砌的课程设计场景。下面我按实际拆包和跑通的顺序把这份资源从环境配置到核心模块再到常见翻车点完整过一遍。2. 环境准备与工程结构把 zip 跑起来要几步2.1 Unity 版本选择与项目导入拿到 zip 之后第一件事不是急着双击打开而是先确认 Unity 版本。战棋类项目对版本不算特别敏感但如果你用的版本比工程创建时低太多部分 API 会报错。常见做法是看ProjectSettings/ProjectVersion.txt里记录的版本号然后用相同大版本或更高一档的 LTS 版本打开。我一般会选 Unity 2021.3 LTS 或 2022.3 LTS这两个版本对 C# 脚本兼容性好Asset Store 依赖也稳。导入步骤不复杂但顺序有讲究# 1. 解压到一个纯英文、无空格的路径下 # 比如 D:/UnityProjects/TacticsGame # 中文路径或带空格的路径容易导致 Unity 找不到资源 # 2. 打开 Unity Hub点击 Add - 选择解压后的根目录 # 注意是选包含 Assets 和 ProjectSettings 的那一层 # 3. 用 LTS 版本打开等待首次导入完成 # 首次导入会编译脚本、生成 Library 缓存视机器性能等 2-5 分钟这里有个细节如果解压后看到的是嵌套了两层的文件夹比如TacticsGame/TacticsGame/Assets那在 Unity Hub 里要选内层那个。选错了会提示“不是有效的 Unity 项目”。导入完成后先别急着点 Play。打开Assets/Scenes目录看看有没有主场景文件。常见命名是Main.unity或Battle.unity。双击加载场景检查 Hierarchy 面板里有没有报错丢失的脚本引用。如果 Inspector 里出现Missing (Mono Script)说明脚本编译没通过得先解决编译错误。2.2 目录结构与核心脚本定位这套工程的目录组织比较典型拆开看大致是这么几层目录作用重点关注文件Assets/Scripts/Core游戏主循环与状态机GameManager.cs、TurnManager.csAssets/Scripts/Units单位属性与行为Unit.cs、UnitStats.csAssets/Scripts/Grid网格系统与寻路GridMap.cs、Pathfinding.csAssets/Scripts/Combat攻击与伤害计算CombatSystem.cs、DamageCalc.csAssets/Scripts/UI界面交互BattleUI.cs、UnitPanel.csAssets/Prefabs单位与场景预制体Unit_Infantry.prefab等Assets/Scenes场景文件Main.unityGameManager.cs是整个工程的入口负责初始化网格、生成单位、切换游戏状态。TurnManager.cs管回合流转区分玩家回合和敌方回合。GridMap.cs里存了地图的二维数组每个格子记录地形类型和占用状态。Pathfinding.cs实现的是 A* 或者 BFS具体用哪种得看代码里的openList和closedList怎么维护。我一般会先打开GameManager.cs扫一眼Awake和Start方法看它初始化了哪些系统、按什么顺序。这比从头读所有脚本快得多能快速建立调用链的全局印象。2.3 首次运行与基础配置检查点 Play 之前有几个配置项值得先确认// 在 GameManager.cs 或 GridMap.cs 里常见的地图尺寸配置 public int mapWidth 10; // 地图横向格子数 public int mapHeight 8; // 地图纵向格子数 public float cellSize 1.0f; // 每个格子的世界坐标尺寸 // 单位移动力配置通常在 UnitStats.cs 里 public int moveRange 4; // 单位每回合可移动的格子数 public int attackRange 1; // 攻击距离1 表示近战如果运行后发现单位生成位置不对或者格子对不齐优先检查cellSize和预制体的localScale是否匹配。常见情况是格子尺寸设了 1.0但预制体缩放是 0.8导致视觉上错位。另外确认 Camera 的投影方式战棋一般用 Orthographic 正交视角透视相机在网格对齐上容易出玄学问题。运行起来后先测试几个基础操作点击单位能否选中、选中后能否显示移动范围、移动后回合能否正常切换。这几个走通了说明工程的核心链路是完整的。3. 战棋核心机制拆解网格、寻路与回合调度3.1 网格系统与坐标转换战棋的地图本质是一个二维数组每个元素代表一个格子。GridMap.cs里通常会有类似这样的结构public class GridMap : MonoBehaviour { public TileType[,] tiles; // 二维数组存地形类型 public int width; public int height; // 世界坐标转格子坐标 public Vector2Int WorldToGrid(Vector3 worldPos) { int x Mathf.FloorToInt(worldPos.x / cellSize); int y Mathf.FloorToInt(worldPos.z / cellSize); return new Vector2Int(x, y); } // 格子坐标转世界坐标取格子中心 public Vector3 GridToWorld(Vector2Int gridPos) { float x gridPos.x * cellSize cellSize * 0.5f; float z gridPos.y * cellSize cellSize * 0.5f; return new Vector3(x, 0, z); } }这段代码的关键在于FloorToInt和 cellSize * 0.5f的配合。FloorToInt保证世界坐标落在哪个格子区间就归哪个格子加半格偏移是为了让单位站在格子正中间而不是边角。如果发现点击格子时选中的是隔壁大概率是这里偏移量算错了。地形类型TileType一般是个枚举常见值有Plain、Forest、Mountain、Water。不同地形影响移动消耗和防御加成。比如森林消耗 2 点移动力、提供 20% 闪避山地不可通行。这些数值通常在TileType对应的配置表里改起来直接调参数就行。3.2 A* 寻路在战棋中的落地战棋的移动范围计算和路径查找是两件事。移动范围是“能走到哪些格子”路径是“走到目标格子的具体路线”。这套工程里Pathfinding.cs大概率用的是 A*因为要支持不同地形的移动消耗。A* 的核心逻辑不复杂但战棋场景有几个特殊处理// 简化的 A* 节点评估 public ListVector2Int FindPath(Vector2Int start, Vector2Int target, Unit unit) { var openList new ListNode(); var closedSet new HashSetVector2Int(); var startNode new Node(start, null, 0, Heuristic(start, target)); openList.Add(startNode); while (openList.Count 0) { // 取 F 值最小的节点 var current openList.OrderBy(n n.F).First(); if (current.Pos target) return RetracePath(current); openList.Remove(current); closedSet.Add(current.Pos); foreach (var neighbor in GetNeighbors(current.Pos)) { if (closedSet.Contains(neighbor)) continue; if (!IsWalkable(neighbor, unit)) continue; // 地形和单位占用检查 int moveCost GetMoveCost(neighbor, unit); // 不同地形消耗不同 int newG current.G moveCost; // ... 更新 openList } } return null; // 无路径 }IsWalkable里要同时判断两件事地形是否可通行、格子上有没有其他单位。常见翻车点是只判断了地形没判断单位占用导致两个单位叠在同一格。GetMoveCost返回的是进入该格子的消耗平原 1 点、森林 2 点、道路 0.5 点这些数值决定了移动范围的形状。移动范围的可视化通常是另一套逻辑从单位当前位置做 BFS把所有消耗小于等于moveRange的格子高亮出来。BFS 比 A* 更适合做范围计算因为不需要目标点只要遍历到消耗超限为止。3.3 回合管理与状态机设计回合制战棋的节奏全靠TurnManager.cs撑着。一个完整的回合流转大概是玩家回合开始 → 刷新玩家单位状态 → 玩家操作 → 玩家结束回合 → 敌方回合开始 → AI 执行 → 敌方结束回合 → 回到玩家回合。public enum GameState { PlayerTurn, EnemyTurn, Victory, Defeat } public class TurnManager : MonoBehaviour { public GameState currentState; public int turnCount 1; public void EndPlayerTurn() { currentState GameState.EnemyTurn; StartCoroutine(EnemyTurnRoutine()); } IEnumerator EnemyTurnRoutine() { foreach (var enemy in enemyUnits) { yield return StartCoroutine(enemy.AITakeAction()); } turnCount; currentState GameState.PlayerTurn; OnPlayerTurnStart?.Invoke(); } }这里用协程是为了让 AI 行动有间隔不然敌方所有单位瞬间动完玩家看不清发生了什么。yield return new WaitForSeconds(0.5f)这种延迟在调试时很有用但正式发布前记得调短或做成可配置项。状态机的关键是不允许跨状态操作。比如敌方回合时玩家点击自己的单位不应该有反应。常见做法是在Unit.OnMouseDown里加一层if (TurnManager.currentState ! GameState.PlayerTurn) return;。漏了这层判断就会出现敌方回合玩家还能移动单位的 bug。4. 单位、战斗与 AI让战棋真正“打起来”4.1 单位属性与伤害计算单位属性通常拆成基础值和成长值两块。UnitStats.cs里常见字段包括生命值、攻击力、防御力、移动力、攻击范围、暴击率。伤害公式一般不会太复杂毕设级别常见的是减法或乘法模型public int CalculateDamage(Unit attacker, Unit defender) { // 基础伤害 攻击力 - 防御力保底 1 点 int baseDamage Mathf.Max(1, attacker.attack - defender.defense); // 地形防御加成 float terrainBonus GetTerrainDefenseBonus(defender.currentTile); baseDamage Mathf.RoundToInt(baseDamage * (1 - terrainBonus)); // 暴击判定 if (Random.value attacker.critRate) baseDamage Mathf.RoundToInt(baseDamage * 1.5f); return baseDamage; }Mathf.Max(1, ...)这个保底很重要。没有它的话高防御单位可能完全免伤战斗会陷入僵局。地形加成让站位的意义凸显出来——站在森林里比站在平原上更抗打这是战棋策略深度的来源之一。暴击用Random.value做概率判定简单直接。但要注意Random.value返回的是 0 到 1 之间的浮点数critRate要设成 0.1 表示 10% 而不是 10。这个单位问题新手经常搞混。4.2 攻击判定与战斗流程攻击流程比伤害计算多几步选中攻击者 → 显示可攻击范围 → 选择目标 → 播放攻击动画 → 结算伤害 → 判断死亡 → 判断胜负。public void ExecuteAttack(Unit attacker, Unit defender) { // 1. 检查攻击距离 int distance ManhattanDistance(attacker.GridPos, defender.GridPos); if (distance attacker.attackRange) return; // 2. 结算伤害 int damage CalculateDamage(attacker, defender); defender.TakeDamage(damage); // 3. 反击判定如果防守方存活且在反击范围内 if (!defender.IsDead distance defender.attackRange) { int counterDamage CalculateDamage(defender, attacker); attacker.TakeDamage(counterDamage); } // 4. 清理死亡单位 CheckDeaths(); CheckVictoryCondition(); }ManhattanDistance在四方向移动的战棋里用得多如果是八方向或者六边形网格距离算法要换。反击机制是战棋的经典设计让进攻方不能无脑冲得考虑对方能不能打回来。CheckVictoryCondition一般判断两种结束条件敌方全灭则胜利我方全灭则失败。有些设计还会加“占领据点”或“存活 N 回合”的额外条件这套工程里有没有得看GameManager里的具体实现。4.3 敌方 AI 的行为逻辑毕设级别的 AI 通常不会太复杂常见的是有限状态机或者简单的行为树。核心逻辑就几条如果攻击范围内有敌人 → 攻击否则如果移动后能攻击到敌人 → 移动并攻击否则 → 向最近的敌人移动。public IEnumerator AITakeAction() { // 1. 找攻击范围内血量最低的敌人 Unit target FindBestTarget(); if (target ! null) { ExecuteAttack(this, target); yield return new WaitForSeconds(0.5f); yield break; } // 2. 找移动后能攻击到的位置 Vector2Int? bestPos FindBestMovePosition(); if (bestPos.HasValue) { yield return StartCoroutine(MoveTo(bestPos.Value)); target FindBestTarget(); if (target ! null) ExecuteAttack(this, target); } else { // 3. 向最近敌人移动 Unit nearest FindNearestEnemy(); if (nearest ! null) yield return StartCoroutine(MoveTo(nearest.GridPos)); } }FindBestTarget的评估函数决定了 AI 的“智商”。只按血量最低选AI 会集火残血单位显得比较聪明。如果按距离最近选AI 会无脑冲最近的容易被风筝。想提升 AI 表现可以在评估函数里加权血量权重 0.6、距离权重 0.3、单位类型权重 0.1。FindBestMovePosition遍历所有可移动格子对每个格子计算“移动后能否攻击到目标”取最优。这个计算量在 10x8 的地图上完全可接受不需要做性能优化。5. 避坑与排查跑这套源码时最容易翻车的几个点5.1 脚本编译报错命名空间与 API 版本现象Unity 控制台一片红提示The type or namespace name XXX could not be found。原因常见两种情况。一是工程用了新输入系统InputSystem但你的项目设置里还是旧输入系统。二是某些 API 在高版本 Unity 里被标记为过时或移除比如Application.LoadLevel在新版本里应该用SceneManager.LoadScene。解决先看报错的具体命名空间。如果是UnityEngine.InputSystem去Package Manager里装Input System包然后在Player Settings里把Active Input Handling改成Both。如果是 API 过时全局搜索替换成新 API 即可。改之前建议先备份一份原始工程。5.2 单位点击无反应碰撞体与射线检测现象运行后点击单位没反应选不中。原因战棋的点击选中通常靠射线检测Physics.Raycast。如果单位预制体上没有Collider或者Collider的Is Trigger勾上了但代码里没处理 Trigger射线就打不中。另一个常见原因是 UI 面板挡住了射线EventSystem把点击事件拦截了。解决检查单位预制体上有没有BoxCollider或CapsuleCollider大小是否覆盖了模型。然后在点击代码里加if (EventSystem.current.IsPointerOverGameObject()) return;排除 UI 遮挡。如果用的是OnMouseDown回调确认单位上有 Collider 且相机能照射到。5.3 移动范围显示错位格子坐标与世界坐标不匹配现象高亮显示的移动范围和实际能走的格子对不上偏了半格或一整格。原因WorldToGrid和GridToWorld的偏移量不一致。比如一个用了FloorToInt另一个用了RoundToInt或者一个加了半格偏移另一个没加。解决统一坐标转换逻辑。建议在GridMap里只保留一套转换方法所有需要转换的地方都调这两个方法不要在各处自己算。另外确认地图原点是 (0,0) 还是 (0.5,0.5)原点位置决定了偏移量的正负。5.4 回合切换卡死协程未正确结束现象玩家结束回合后敌方单位动了一下就卡住了游戏无法继续。原因敌方 AI 的协程里某个yield return的条件永远没满足比如等待一个动画播放完成但动画事件没触发或者WaitForSeconds的时间设成了 0 导致逻辑跳过。解决在EnemyTurnRoutine里加超时保护。比如等待动画时设一个最大等待时间超时就直接跳过。另外检查foreach循环里有没有yield break提前退出导致后续单位没执行。调试时可以在每个 AI 行动前后打Debug.Log看卡在哪个单位上。5.5 打包后运行异常资源路径与平台差异现象在编辑器里跑得好好的打包成 exe 或 apk 后黑屏、报错、资源丢失。原因编辑器里能用Resources.Load或AssetDatabase动态加载打包后AssetDatabase不可用。另外文件路径大小写敏感Windows 上不区分但 Android 和 iOS 区分。解决所有运行时加载的资源要么放在Resources文件夹里用Resources.Load要么用Addressables系统。检查代码里有没有AssetDatabase的调用有的话必须替换。路径统一用Path.Combine拼接避免手写斜杠。6. 二次开发与验证把这套源码变成你自己的东西跑通只是第一步真正让这套源码产生价值的是在上面改出你自己的东西。我一般会从三个方向入手数值调整、机制扩展、表现优化。数值调整是最快见效的。打开UnitStats.cs或者对应的 ScriptableObject 配置文件把移动力从 4 改成 5攻击范围从 1 改成 2立刻能感受到节奏变化。建议每次只改一个参数跑一局看效果不然出了问题不知道是哪个改动导致的。我习惯在改之前把原始数值截图存一份翻车了能快速回滚。机制扩展方面比较适合毕设加分的几个方向加一个“技能系统”让单位除了普攻还能放技能加一个“装备系统”单位可以携带道具改变属性加一个“战争迷雾”未探索区域不可见。这三个方向任意一个做出来答辩时都能讲出足够的技术细节。技能系统的核心是定义一个Skill基类然后派生DamageSkill、HealSkill、BuffSkill在CombatSystem里根据技能类型走不同结算逻辑。表现优化是最容易被忽视但答辩时最加分的。加个简单的 DOTween 动画让单位移动平滑过渡攻击时加个屏幕震动伤害数字飘出来。这些不需要改核心逻辑只在表现层加脚本就行。但视觉效果提升很明显评审看了会觉得“这项目做得完整”。验证方法上我建议跑三个场景正常对局打到胜利、正常对局打到失败、中途退出再重进。这三个场景覆盖了状态机的所有分支。如果都正常说明工程的核心稳定性没问题。另外把地图尺寸改成 20x20 跑一次看寻路性能有没有明显下降。如果卡顿说明 A* 的openList用了List而不是优先队列排序开销随节点数增长太快。换成PriorityQueue或者自己维护一个二叉堆性能会好很多。从那以后我每次拿到一套新源码都强制走一遍“导入 → 跑通 → 改一个参数 → 打包验证”的完整流程确认每个环节都可控再往下做。这套战棋源码在这条流程里表现是合格的核心模块清晰、依赖干净、没有藏得太深的黑匣子。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

毛绒玩具打样不满意?毛绒绒平台的样品修改服务说明

毛绒玩具打样不满意?毛绒绒平台的样品修改服务说明

收到样品后发现与预期存在差距,是定制流程中的常见情况。毛绒绒平台为每位客户提供样品修改服务,支持针对脸型、配色、毛感等细节进行调整,基础修改包含在打样服务费用内。这项服务的边界在哪里,哪些调整属于基础范围,…

2026/10/10 16:45:11 阅读更多 →
Python+OpenCV手势识别源码实战:从环境搭建到手指计数避坑指南

Python+OpenCV手势识别源码实战:从环境搭建到手指计数避坑指南

简介:这份资源面向计算机视觉入门者与课程设计学生,提供一套基于Python与OpenCV的手势识别算法完整源码,帮助解决从摄像头采集到手势判定的全流程实现问题。压缩包共67个文件,约42.46MB,以30个py源码与26个pyc编译文件…

2026/10/10 16:45:11 阅读更多 →
混合模型时间序列预测实战:组合方式、参数边界与避坑指南

混合模型时间序列预测实战:组合方式、参数边界与避坑指南

简介:一份面向时间序列预测入门及进阶学习者的 LSTMTransformer 混合模型实战资源,适合具备一定 Python 与深度学习基础、希望将序列建模落地到金融、气象、销量等场景的开发者。压缩包共13个文件、约1.74MB,主体包含2个CSV数据集、2个Python…

2026/10/10 16:45:11 阅读更多 →

最新新闻

打家劫舍动态规划解法精讲:从状态定义到空间优化

打家劫舍动态规划解法精讲:从状态定义到空间优化

在力扣(LeetCode)的动态规划入门题单里,198. 打家劫舍几乎是每个人绕不开的第一道经典题。题目给了一排房屋,每间房里有不同数额的现金,但相邻的两间房连接着警报系统,只要同一晚闯入两间相邻房屋就会触发报…

2026/10/10 20:35:20 阅读更多 →
手写C++ string:从内存管理到增删查改的完整实现

手写C++ string:从内存管理到增删查改的完整实现

说实话,接触C这么多年,我一直有一种“被STL惯坏”的感觉。尤其是std::string,用起来太顺手了,、find、substr、replace,想怎么拼就怎么拼,以至于我从来没认真想过,这个类在底层到底是怎么管理内…

2026/10/10 20:35:19 阅读更多 →
Spec Kit 是神药还是新负担?「规范驱动开发」把写文档重新抬上神坛,中小团队跟不跟

Spec Kit 是神药还是新负担?「规范驱动开发」把写文档重新抬上神坛,中小团队跟不跟

Spec Kit 是神药还是新负担?「规范驱动开发」把写文档重新抬上神坛,中小团队跟不跟 【免费下载链接】spec-kit 💫 Toolkit to help you get started with SDD or any other process! 项目地址: https://gitcode.com/GitHub_Trending/sp/spe…

2026/10/10 20:35:19 阅读更多 →
Pandoc 老将 vs MarkItDown 新王:AI 数据流水线到底该选谁?

Pandoc 老将 vs MarkItDown 新王:AI 数据流水线到底该选谁?

Pandoc 老将 vs MarkItDown 新王:AI 数据流水线到底该选谁? 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 把一份 50 页的 PD…

2026/10/10 20:34:19 阅读更多 →
微电网日前经济调度Matlab建模:储能与需求响应详解

微电网日前经济调度Matlab建模:储能与需求响应详解

前段时间我在做微电网日前经济调度相关课题的时候,把风电、光伏、储能和需求响应全部塞进了同一个24小时优化模型里,用Matlab完成建模和求解。说实话,刚接触这类题目时,很多人会觉得无非就是列约束、调求解器,但真正把…

2026/10/10 20:34:19 阅读更多 →
Flask+Vue构建医院康复预约系统:设计与实现

Flask+Vue构建医院康复预约系统:设计与实现

1. 项目概述与整体设计思路1.1 医院康复预约到底在解决什么问题康复科这个场景很有意思,它跟普通门诊挂号有本质区别。普通挂号只需要科室、医生、时间三个信息;康复预约则多出了"项目归属"和"疗程连续性"。一个脑卒中恢复期的患者&…

2026/10/10 20:34:19 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 11:14:25 阅读更多 →
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/10 1:36:08 阅读更多 →
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/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →