C++文字探险游戏开发:状态机、随机地图与存档调参实践
“C摸金1.0普通版”是我最近用空闲时间写完的一个控制台文字探险游戏。没有图形界面没有声音连鼠标都不需要所有交互都在黑色窗口里敲数字和字母完成。玩法概括起来就是你进入一座随机生成的虚构地宫在有限的体力下探索房间、破解机关、开启藏宝箱遇到未知生物就战斗最后带着战利品从出口撤离。是的听起来很像“考古探险题材的小游戏”但把它用C纯手写一遍涉及的远不止“写几个类”那么简单。这篇内容适合几类人看刚学完C语法、想找一个能练手还不会烂尾的课程设计想理解游戏循环、状态机、数据序列化这些概念在实际项目里怎么落地或者纯粹好奇一个文字游戏是如何在控制台里做出节奏感和随机性的。我会把我在这个“普通版”里的核心设计、代码思路、踩过的坑和调参过程都拆开讲尽量做到看完你也能自己复刻一版。1. 从标题拆解需求为什么是“1.0普通版”而不是“图形华丽版”很多人拿到一个项目标题就直接开写写着写着就失控。我的习惯是先拆标题C摸金1.0普通版这一行字其实已经规定了项目的语言、题材、版本阶段和野心边界。1.1 版本号的潜台词“1.0普通版”意味着这不是演示用的小片段而是一个有明确版本周期的产品。我给自己定的目标是完整可玩、规则闭环、存档可用、节奏不错但不做图形、不做网络、不做复杂剧情。普通版的价值是先把核心玩法打磨到“我愿意连续玩三遍不吐”后续才有资格谈“豪华版”。这个边界设置非常重要。文字游戏最容易烂尾的地方就是“想做的太多”。地图、战斗、背包、机关、剧情、对话、多结局全塞进去按我这种业余开发者的效率三星期后一定放弃。普通版的意义就是用最小功能集换一个能跑通的完整游戏。1.2 核心玩法循环我把摸金体验抽象成一条循环探索未知区域 - 遭遇事件/机关/藏宝室 - 消耗资源解决 - 获得奖励 - 继续探索 - 在地宫深处挑战 - 带着收获离开。这本质上就是“风险与收益”的博弈。体力是核心资源探索会消耗体力战斗会消耗血量开锁需要道具但地宫深处往往埋着更好的战利品。玩家需要决定什么时候见好就收。这个“见好就收”的张力是整个游戏乐趣的发动机。我在代码层面做的第一件事就是把这条循环拆成可表达的数据流玩家属性血量、体力、攻击力、防御力、当前层数、已获宝物数量地图单元通道、房间、机关点、宝箱点、怪物点、出口事件结果成功获得奖励 / 消耗资源 / 战斗结算这为后面的数据结构选型打好了底。1.3 “普通版”的三个功能取舍原则我总结了一套取舍原则现在回头看非常管用能文本表达的就绝不画图形。比如宝箱用[宝箱]表示战斗用文字描述加延迟输出制造紧张感。能做规则闭环的就不堆内容量。不是放三十种怪物而是把怪物强度、出现频率、掉落概率调到互相咬合。能存档的就不怕玩家死。普通版必须有保存/读取否则挫败感会让玩家第一局失败后直接关掉程序。这三个原则几乎决定了后面所有的技术选型。2. 地宫怎么生成随机性与可控性的平衡地宫生成是整个项目里第一个硬骨头。玩家期待每局地图都不一样但又不能乱七八糟导致无路可走。纯随机乱铺地板很可能出现全是死胡同或者关键道具出生在地图边缘的尴尬局面。2.1 地图模型二维数组是地基普通版我用了最简单的二维格子地图一个vectorvectorCell每个格子记录自己的类型和附加数据。enum class CellType : int { Wall 0, Floor, Entrance, Exit, Treasury, Trap, Monster, Puzzle }; struct Cell { CellType type CellType::Wall; bool explored false; int eventId -1; // 与机关/事件表关联 int itemId -1; // 可拾取物 };为什么不用更花哨的图结构或网格寻路因为普通版不需要。二维数组天然支持上下左右移动判断边界检查简单序列化也直观。对文字游戏来说玩家的空间感大多来自“东南西北某方向有扇门”这样的描述二维网格已经完全够用。2.2 随机数扔掉 rand()使用 mt19937很多教材还在教rand()但实际做游戏时会发现它不够用。rand()的随机质量差、分布偏而且在不同平台上的实现参差不齐。我用的是 C11 提供的random里的std::mt19937配合均匀分布std::mt19937 rng(seed); std::uniform_int_distributionint dist(0, 99); int roll dist(rng); if (roll 40) { cell.type CellType::Floor; } else if (roll 70) { cell.type CellType::Monster; } else if (roll 85) { cell.type CellType::Trap; } else { cell.type CellType::Treasury; }这里我特意把概率设计成了“累积区间”40 / 70 / 85 / 100的写法一眼就能看出概率权重改起来也方便。后期调参时只需要改数字不用改逻辑。提示随机种子支持外部传入非常重要。我在程序里加了--seed 20250101这样的命令行参数这样每次遇到一个难复现的 bug都可以用同一把种子重新生成完全一致的地图来排查。2.3 保底规则不能让玩家出生即绝望纯随机生成会导致三种致命情况出生点旁边全是墙、出口太远、或者关键道具刷在完全无路可通的孤岛上。我的处理方式是“先生成骨架再填充内容”。骨架阶段先规定好入口和出口的相对位置比如入口在左上、出口在右下然后用一种随机游走打通一条从入口到出口的“主通道”。主通道上的格子强制设为Floor保证游戏至少有一条路可以走通。接着在剩余区域填充房间和事件再用启发式规则清理孤立区域如果一个Floor格子的上下左右没有任何其他Floor格子就把它改成墙或者额外开一条通道接上去。这一步把“死胡同地狱”从根上掐死了。2.4 移动与探索的状态机文字游戏的核心交互是“输入命令 - 状态变化 - 输出反馈”。我用一个简单的状态枚举来组织逻辑enum class GameState { MainMenu, Exploring, Fighting, Puzzle, Inventory, GameOver, Victory };玩家在Exploring状态下输入移动命令如果踩到怪物格子就切到Fighting踩到机关就切到Puzzle。状态机的价值在于任何时刻代码都明确知道当前能做什么、不能做什么玩家不会出现“边战斗边开背包”这种逻辑混乱。GameState nextState GameState::Exploring; switch (currentState) { case GameState::Exploring: nextState handleExploreCommand(cmd, map, player, rng); break; case GameState::Fighting: nextState handleFightRound(cmd, player, monster, rng); break; case GameState::Puzzle: nextState handlePuzzleInput(cmd, puzzle, player, rng); break; default: break; } currentState nextState;这段代码是整个游戏循环的核心骨架。它简单、可靠、容易加新状态普通版后期加“背包查看”状态只花了二十分钟。3. 角色、背包与机关谜题的数据结构设计有了地图和移动接下来要往里塞“游戏性”。普通版的玩法由三块构成角色成长、道具收集、谜题机关。它们各自都需要趁手的数据结构。3.1 玩家属性用结构体分组管理我建了一个Player结构体但属性多到一定程度后容易乱。比如血量和体力是“生命相关”攻击防御是“战斗相关”采集工具是“探索相关”。我做了分组struct Player { // 生命与状态 int maxHp 100; int hp 100; int maxStamina 100; int stamina 100; // 战斗 int attack 12; int defense 5; // 探索专用 int rope 3; // 绳索可用于跨越断崖类机关 int torchTimer 5; // 火把剩余回合 int treasures 0; // 带出的宝物数 int floor 1; // 当前层数 };这里有个经验如果属性只有一个数字初始用常量表集中定义而不是散落在结构体各处。我单独建了config.h统一管理初始值。这样做的好处是调平衡时不用CtrlF到处搜魔数。3.2 背包容器用枚举做物品类型普通版背包不需要花哨的装备栏、合成系统。我只需要一个能装杂物的容器于是用了最简单的方式每种物品在背包里有一个数量计数。enum class ItemType { Herb, // 回血 Torch, // 增加探索时长 Lockpick, // 开宝箱 Charm, // 机关护符抵消一次陷阱伤害 Relic // 通关结算宝物 }; std::arrayint, 5 backpack {0, 0, 0, 0, 0};用数组索引对应ItemType枚举比mapItemType, int更高效序列化也更简单。很多新手喜欢用std::unordered_map存背包但普通版里枚举范围固定且极小数组完全够用而且写存档时只需连续输出五个数字读档时也不会出现键不存在的情况。收集道具的规则也不复杂玩家进入宝箱格时按宝箱权重随机掉落物品种类和数量。掉率表同样做成配置struct LootEntry { ItemType item; int weight; int minCount; int maxCount; }; std::vectorLootEntry treasuryLootTable { {ItemType::Herb, 35, 1, 2}, {ItemType::Lockpick, 25, 1, 1}, {ItemType::Torch, 20, 1, 1}, {ItemType::Charm, 15, 1, 1}, {ItemType::Relic, 5, 1, 1} };掉落逻辑就是常见的按权重掷骰权重总和约简后做一次uniform_int_distribution。这个表后期容易扩展加新物品时改一两行就行。3.3 机关谜题数据与逻辑分离普通版的谜题我不打算做特别复杂的推理题而是设计了几种可复用的机关模板石门密码、断崖绳索、符文刻印、锁链宝箱。每种机关共用一个通用接口struct Puzzle { int puzzleId; std::string prompt; // 给玩家的描述文本 int conditionItemId; // 需要消耗的道具-1表示不需要 int successDamage; // 成功时可能扣的体力/血量 int failDamage; // 失败时承受的代价 int rewardItemId; // 成功奖励 };这里的关键设计是所有的机关数据都写成表不写在 if-else 里。我在代码里维护了一份puzzleTable每个谜题有一条记录。触发机关时只根据puzzleId查找记录然后统一走一套处理流程。机关ID描述场景条件道具成功结果失败结果奖励1001石门刻着四行数字无体力-5进入密室血量-15门不开火焰符文1002断崖上的独木桥绳索体力-8通过血量-30退回原地古代钱币1003锁链缠住的宝箱撬锁器无伤开箱触发警报引来怪物随机宝物1004地上一排滚动圆石护符无损通过血量-25被逼回上格无这样后期新增谜题只需要在表里加一行完全不用改逻辑。对普通版来说这种数据驱动思想是我认为最值得学的一点。3.4 交互到底怎么设计才像“摸金”“摸金”的体验不能只是瞎试。我每个机关都给了至少两条线索一条在当前房间的文字描述里另一条在之前的某个墙壁刻印或怪物掉落物里。玩家需要把信息串起来才能找到正确答案。比如石门密码谜题我不会直接问“密码是多少”而是给一段描述地面散落四枚铜钱正反面的数量揭示了开门的顺序。玩家输入的是“正正反反”这样的字符串程序只比对答案不展示答案。这样文字游戏的信息收集价值就体现出来了。4. 回合制战斗与“屏幕外的紧张感”文字游戏的战斗很难做难在既要有过程、又不能太拖沓。普通版里我采用回合制玩家和怪物轮流行动每回合玩家选择攻击、防御、使用道具或尝试逃跑。为了让战斗不变成枯燥的数字对撞我主要靠三样东西速度先手、文字反馈的节奏、以及战斗后的消耗管理。4.1 速度先手与数值模型每个怪物有个speed属性玩家也有speed。谁速度快谁先手。速度差值越大先手概率越高但不是绝对先手防止一锤定音。我用了“保底随机”int roll dist(rng); // 0-99 int threshold 50 (player.speed - monster.speed) * 4; bool playerFirst roll std::clamp(threshold, 20, 85);阈值范围被限死在20到85之间意思是就算玩家速度碾压怪物也最多只有85%先手率反过来也不会完全丧失先手机会。这个“永远有意外”的设计让战斗保持着微妙的悬念感。4.2 输出反馈让黑窗口动起来战斗输出不可能像图形游戏那样有动画但我可以用文字和延迟制造节奏。每打出一击控制台打印一行描述然后用std::this_thread::sleep_for停顿一小段时间。auto printSlow [](const std::string text, int ms) { std::cout text std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(ms)); }; printSlow(你握紧火把朝暗处的轮廓走去。, 300); printSlow(怪物低吼一声扑了上来, 400); printSlow(你挥出手中的匕首造成 8 点伤害。, 200);这个技巧成本极低但效果立竿见影。同样的文字一次性输出和一行一行停顿输出玩家体验完全不一样。后者会让人不自觉地屏住呼吸。我后来把所有关键事件输出都换成了这种节奏化打印。4.3 顶栏 HUD不刷屏的状态面板玩家在探索中需要时刻知道自己的体力和血量。普通版里我没有做单独的“状态界面”而是在地图显示区域上方放了一个常驻HUD行void printHud(const Player p, int floor) { std::cout [第 floor 层] 生命 p.hp / p.maxHp | 体力 p.stamina / p.maxStamina | 宝物 p.treasures | 火把 p.torchTimer std::endl; }火把时间是个普通版里很有用的设计它既是资源倒计时也是探索紧迫感的来源。火把熄灭后视野描述会从“明亮的石室”变成“伸手不见五指的黑暗”怪物闪避率和陷阱伤害都会提升。这个“规则带来的压迫感”比单纯堆怪物数值更高级。4.4 反复刷战斗恢复道具的漏洞这是我在测试中被自己发现的玩家可以在某个怪物房间反复进出靠战斗掉落刷满血瓶然后再深入。这严重破坏节奏。普通版的解法是每个怪物格子被击杀后变成Cleared状态不再刷新。恢复道具使用后需要一个“休息动作”消耗体力不能无限磕药。体力不足时所有恢复道具的效果减半。这三个限制几乎没有增加代码量但彻底封死了刷道具的路。调平衡很多时候不是加系统而是给现有规则加约束。5. 存档读档看似简单实际全是细节文字游戏一个晚上可能打不完存档功能是从“demo”变成“普通版”的关键一步。但存档的坑比我想象的多得多。5.1 文本存档还是二进制存档普通版我选了文本存档理由是容易调试、容易手工修复、对版本升级更友好。二进制虽然快但一旦结构体布局变化老存档就彻底作废。文本格式大概是这样的SAVE_VERSION 1 SEED 20250101 MAP_W 8 MAP_H 8 PLAYER_HP 73 PLAYER_STAM 22 PLAYER_ATTACK 12 ...地图部分把每个格子按二维顺序输出成字符串W表示墙F表示地板M表示怪物X表示出口以此类推。读档时按相同顺序解析回Cell结构体。这里有个重要的设计存档里必须保存随机数种子而不是保存已经生成好的所有随机事件结果。因为只要种子一样重新生成的地图就完全一样而地图上那些被打过的怪物、开过的箱子则单独保存一个“已清除坐标集合”。读取时先重建全图然后把已清除的坐标重新标记为Cleared。这样存档体积小且逻辑一致性强。5.2 非法存档处理读档不崩溃是底线玩家不会乖乖改存档就算普通版也一样。我遇到过有人把存档改成满血满道具、也有人手滑删了半个文件。所以读档必须做防御bool loadGame(const std::string path, GameSave outSave) { std::ifstream fin(path); if (!fin.is_open()) return false; std::string line; std::mapstd::string, int values; while (std::getline(fin, line)) { if (line.empty()) continue; auto pos line.find( ); if (pos std::string::npos) continue; std::string key line.substr(0, pos); try { int v std::stoi(line.substr(pos 1)); values[key] v; } catch (...) { return false; } } // 检查关键字段是否存在 if (values.find(SEED) values.end() || values.find(PLAYER_HP) values.end()) { return false; } // 数值范围钳制 outSave.player.hp std::clamp(values[PLAYER_HP], 1, outSave.player.maxHp); return true; }用try/catch包住解析是必须的因为一个坏存档可能让stoi直接抛异常。将所有超出范围的数值用clamp拉回合法区间能防止后续访问数组越界。这个习惯让我省了不知道多少崩溃排查时间。5.3 存档防作弊要防到什么程度普通版我决定不做强校验。给每个存档生成一个简单的异或校验值防止文件被整体截断或误改但不做任何加密或重量级防篡改。因为这是单人游戏作弊最终影响的是玩家自己的体验。我反而在文档里明说“如果你一定要改存档请至少保证数值在合理范围内不然程序有权拒绝读取”。这种处理很务实。普通版的定位是完整可玩的作品不是对抗破解的工具。与其花大量时间做防作弊不如把时间花在让玩家根本不想要作弊。5.4 保存时机的设计我不提供随时存档。玩家只能在“营地”或“地宫入口”处存档。这个限制看起来不方便实际上让每次深入都更有仪式感你走进地宫的那一刻就要为之后的每一步负责任。这个“存档点安全边界”的设计非常适合这种题材也给游戏增加了一丝紧张感。6. 普通版上线前踩过的坑和调参心得前五章讲的是“设计怎么做”这一章聊聊真正开发中那些让程序员抓狂的瞬间以及我最终是怎么绕过去的。6.1 死胡同地狱看似可以走实则无路可去我第一次写完地图生成后连续试了几局发现经常出现一条三格长的小路通向死墙而真正有价值的宝箱全在死角里。后来我加了一个检查步骤每次生成完地图后从入口做一次广度优先搜索统计能到达的格子数如果比例低于80%就用固定种子重新生成直到达到目标。bool validateMap(const Map map) { int reachable floodFillCount(map, map.entrancePos); int total map.floorCount; double ratio static_castdouble(reachable) / total; return ratio 0.8; }这个方法非常简单粗暴但效果极好。它不追求地图生成算法多高级而是用一次事后验证保证体验下限。对普通版来说这就足够了。6.2 控制台中文乱码与编码问题文字游戏大量使用中文描述控制台输出乱码是个绕不开的坑。不同系统的控制台默认代码页不同中文可能显示成“锟斤拷”之类的字符。我的处理方式是源码统一保存为 UTF-8。程序启动时设置控制台输出代码页为 UTF-8并通过一个全局函数切换显示模式。所有字符串尽量使用英文标点避免全角字符在某些终端下错位。这个坑看起来小但会让第一印象直接崩塌。玩家一进来看到的全是乱码再好的玩法都没有意义。我在发布前特意找了几台不同系统的电脑做测试确认无乱码才放心。6.3 随机种子的调试价值有一段时间我遇到一个概率很低的崩溃偶尔进入某个格子时数组越界。这种问题最怕“不能稳定复现”。后来我把--seed参数加进去配合每次运行在开头打印种子号崩溃时玩家只需要把这个数字发给我我就能用完全一致的地图复现问题。int seed std::random_device{}(); if (argc 3 std::string(argv[1]) --seed) { seed std::stoi(argv[2]); } std::cout [调试] 本局种子: seed std::endl;这个做法在游戏开发里价值极高。没有它我只能靠玩家口述“我走啊走突然崩了”这种完全无法定位的信息有了它问题变成“种子 20250101 第 3 层第 12 个格子触发怪物时越界”几行日志就能定位。6.4 手感调参探索节奏的隐形工作量普通版里有超过三十个数值参数比如每走一步消耗多少体力、战斗获得多少掉落、怪物强度曲线。调这些数值没有任何公式可套全靠一遍遍试玩。我的经验是先定“玩家从入口到出口的预期时间”再倒推步数、体力和战斗次数。假设我希望一局控制在20分钟地图8x8玩家大概走60步战斗4次每次战斗3回合。那么初始体力100意味着每步消耗约1.5战斗每回合消耗体力2这样玩家到出口时体力见底但刚好够用。这个“刚好够用”的边界感就是游戏手感的一部分。我调整了不下十轮才让绝大多数玩家在通关时只剩5到15点体力。提示数值调参最少要测试三种打法莽夫流一路打过去、盗贼流尽量绕开战斗、收集流每间屋子都搜遍。每种流派的体验都要控制在“能玩但有代价”的范围内不能让某一种明显最优。6.5 发布前的内容安全自查我在最后阶段把游戏里所有描述文本过了一遍去掉有争议的用词确保这是一个纯粹的虚构地宫探险游戏不涉及任何现实历史或地点。这也是一个独立开发者的基本素养游戏可以惊险但立场要清澈。最后再分享两个小技巧第一个是“配置表驱动一切”。普通版里几乎所有可调数值都被集中到config.h和几张初始化表里地图参数、掉落权重、怪物属性、机关数据都是数据不是代码。这让我在后期改平衡时完全不用动逻辑代码改完数据重新编译即可。数据驱动的思想哪怕在这么小的项目里也极其有用。第二个是“留一个 debug 快捷键”。我在游戏里藏了一个开发用命令--debug打开后可以查看当前位置的格子类型、随机数状态、已触发事件ID。这个命令不发给普通玩家但对测试人员来说省了无数时间。其实很多看似“没头没尾”的崩溃只要给了调试工具十分钟就能查到根因。说实话写完这个C摸金1.0普通版我自己最大的收获不是游戏本身而是在一个小到不用维护、大到能练习架构的项目里把所有C面向对象、数据结构、状态机、序列化这些零散知识点缝成了一条线。普通版之所以叫普通版是因为它有不普通的基础未来如果我要加迷宫可视化、更复杂的中层机关、甚至多周目随机事件这个地基都不用推倒重来。

相关新闻

Oracle EBS财务模块详解:从手工账本到中央账务处理器

Oracle EBS财务模块详解:从手工账本到中央账务处理器

简介:Oracle EBS财务模块学习资料,面向ERP初学者、财务信息化从业者及企业财务管理人员,帮助系统理解Oracle电子商务套件在财务管理领域的核心功能与实施思路。资料以docx文档形式呈现,压缩包内共1个文件,大小约32KB&a…

2026/10/17 23:42:42 阅读更多 →
拆解Qwen-Image-2.1-mflux-q4目录结构:text_encoder、transformer、vae与processor各司其职

拆解Qwen-Image-2.1-mflux-q4目录结构:text_encoder、transformer、vae与processor各司其职

【免费下载链接】Qwen-Image-2.1-mflux-q4 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Qwen-Image-2.1-mflux-q4 点击查看 免费下载 Qwen-Image-2.1-mflux-q4 是一个面向 Apple 芯片的文生图(text-to-image)模型仓库&#…

2026/10/17 23:42:42 阅读更多 →
5分钟快速上手GNM:从零安装到渲染你的第一个3D头部网格(新手教程)

5分钟快速上手GNM:从零安装到渲染你的第一个3D头部网格(新手教程)

【免费下载链接】gnm-v3 项目地址: https://ai.gitcode.com/hf_mirrors/google/gnm-v3 点击查看 免费下载 本教程带你用 GNM(Generative aNthropometric Model,生成式人体测量模型)快速渲染出第一个 3D 头部网格(3D h…

2026/10/17 23:42:42 阅读更多 →

最新新闻

抖音MCP跳转链接能力完整接入(Node.js + Express + TypeScript)

抖音MCP跳转链接能力完整接入(Node.js + Express + TypeScript)

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

2026/10/18 0:33:19 阅读更多 →
ORA-6544[pevm_peruws_callback-1][604] 报错溯源:从 open_cursors 到 ORA-1000 的排查路径与 TaoToken 统一 Key 通道实践

ORA-6544[pevm_peruws_callback-1][604] 报错溯源:从 open_cursors 到 ORA-1000 的排查路径与 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/18 0:33:19 阅读更多 →
具身智能落地指南:陪伴机器人四代演进路线与技术栈拆解

具身智能落地指南:陪伴机器人四代演进路线与技术栈拆解

如果让我说2024到2025年这轮具身智能浪潮里最被低估的方向,一定不是人形机器人炫技式的后空翻,而是那些正在从"电子宠物"进化为"准家庭成员"的陪伴机器人。所谓具身智能,核心就一句话:让AI不只是活在对话框里…

2026/10/18 0:33:19 阅读更多 →
我用 OpenClaw 搭了一套多Agent对抗式开发流水线,一个需求2.5小时出可运行代码:Harness 配置与验证全记录

我用 OpenClaw 搭了一套多Agent对抗式开发流水线,一个需求2.5小时出可运行代码:Harness 配置与验证全记录

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

2026/10/18 0:33:19 阅读更多 →
从零到实战:Agent Demo一天搞定,但要上线,你需要收藏这份架构指南(TaoToken 统一 Key 接入版)

从零到实战:Agent Demo一天搞定,但要上线,你需要收藏这份架构指南(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/18 0:33:19 阅读更多 →
推理提速秘籍:gemma-1.1-2b-it的Flash Attention 2与bfloat16精度优化技巧清单

推理提速秘籍:gemma-1.1-2b-it的Flash Attention 2与bfloat16精度优化技巧清单

大模型基础模型 【免费下载链接】gemma-1.1-2b-it 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/gemma-1.1-2b-it 点击查看 免费下载 想在本地快速跑起 gemma-1.1-2b-it 大模型吗?这篇清单给你 5 个关键优化点:用 bfloat16 精度…

2026/10/18 0:32:18 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →