Qt C++塔防游戏源码拆解:信号槽、多线程与事件循环实战
简介一份基于Qt/C框架编写的简易植物大战僵尸游戏源码包适合正在学习Qt图形界面编程与C面向对象设计的开发者参考。压缩包共36个文件包含17个cpp实现文件、16个h头文件以及pro工程文件、qrc资源文件等核心代码涉及植物卡片、子弹射击、僵尸AI、阳光收集等模块整体仅33KB结构紧凑便于逐文件阅读。已有199人学习该资源说明其对同类学习者有一定参考价值。借助该源码可理解Qt的信号槽机制、QGraphicsView场景动画、多线程处理游戏逻辑等关键知识点也能看到如何用类与继承组织植物、僵尸等游戏对象适合作为课堂作业或入门小游戏的模仿范本。1. 一个 Qt 写出来的塔防游戏骨架值不值得拆看到「植物大战僵尸」这几个字很多人第一反应是「又是练手仿品」。但这份基于 QtC 框架的工程不一样它不追求贴图精美、不堆玩法而是把一个塔防游戏最核心的骨架——植物种植、僵尸生成与移动、子弹碰撞、阳光经济、铲子回收、小车保底——全部用 Qt 的信号槽和事件循环串了起来。你下载下来的不是一份能直接玩的成品而是一份「怎么用 C 面向对象去组织一个实时策略游戏」的完整答案。适合两类人一是刚学完 Qt 基础、想看看一个成型工程该有哪些类和文件的新手二是要在 Qt 里做仿真、交互式界面需要参考多线程和对象管理模式的开发者。我拆完整包后最直观的感受是代码量不大但类划分极清晰值得当范本读。2. 游戏循环与 Qt 事件驱动别用 while(1) 写游戏2.1 为什么 Qt 游戏不能像控制台程序那样写主循环很多第一次用 Qt 做游戏的人会踩同一个坑在 main 函数里写一个 while(1) 循环不断更新游戏状态、重绘界面。这种做法在纯控制台程序里没问题但到了 Qt 里你会立刻发现界面卡死、按钮无响应、窗口拖不动。原因在于 Qt 的事件循环机制——app.exec()启动后所有用户操作、定时器、网络消息都变成事件进入队列由事件循环统一分发。如果你在 Qt 的 GUI 线程里跑死循环事件队列永远不被处理界面就冻结了。这份代码的聪明之处在于它完全顺应 Qt 的模型用定时器QTimer驱动游戏推进而不是自己写循环。我在代码里看到plantthread.h和plantthread.cpp说明作者把植物的动作逻辑放到独立线程里。主界面线程保持响应后台线程负责植物攻击判定和僵尸状态更新两者通过 Qt 的信号槽进行通信。这是 Qt 写实时游戏的标准解法也是新手最需要学习的部分。2.2 关键类拆解mainwidget 是心脏但不是大脑整个工程里mainwidget类承担了最高的协调职责但它更像一个交互入口真正决定游戏规则的是gamemap、plants、zombies、peas这几个类。从文件结构看gamemap.h/cpp管理草坪网格坐标每个格子能种什么植物、是否能种植都由它判断。plants.h/cpp植物基类派生类通过setplants里注册的类型区分向日葵、豌豆射手、坚果墙等。zombies.h/cpp僵尸基类内部处理僵尸的血量、移动速度、攻击力。peas.h/cpp子弹类负责飞行位置更新、碰撞检测。sunshine.h/cpp和cooldowndark.h/cpp阳光生产与冷却遮罩这两块直接决定游戏节奏比植物本身血量还重要。shootbox.h/cpp射击盒实际上是豌豆射手逻辑的封装内部持有计时器控制射击间隔。我第一次翻开这套代码时印象最深的是每个类都「只管自己的事」。plants只关心自身状态不知道僵尸具体在哪个格子上gamemap只负责占位和查询不直接执行攻击peas飞到哪里、碰没碰到僵尸由场景的碰撞逻辑判定。这种松耦合设计是 Qt 工程中非常标准的做法你完全可以直接套用到自己的项目里。2.3 从 PVZ.pro 看工程依赖关系打开PVZ.pro文件可以看到整个工程的模块划分。这个文件本身就值得逐行研究它告诉你哪些类是互相编译依赖的QT core gui widgets TARGET PlantsVsZombies TEMPLATE app SOURCES \ main.cpp \ mainwidget.cpp \ gamemap.cpp \ plants.cpp \ zombies.cpp \ peas.cpp \ sunshine.cpp \ spade.cpp \ smallcar.cpp \ setplants.cpp \ cooldowndark.cpp \ shootbox.cpp \ plantthread.cpp HEADERS \ mainwidget.h \ gamemap.h \ plants.h \ zombies.h \ peas.h \ sunshine.h \ spade.h \ smallcar.h \ setplants.h \ cooldowndark.h \ shootbox.h \ plantthread.h RESOURCES res.qrc编译依赖关系很明确mainwidget依赖gamemap、setplants、plantthreadplants和zombies是平级实体类不互相 includepeas被shootbox调用shootbox又被setplants在种植时创建。这种分层意味着你可以单独抽出plants或zombies类放到其他项目里复用这是模块化设计带来的直接好处。TEMPLATE app告诉 qmake 生成可执行文件而不是库RESOURCES res.qrc把图片、音频资源编译进二进制里避免运行时找不到资源的错误。这里有个细节游戏资源全部打包进 exe部署时只需要带一个文件省去了管理散落图片的麻烦。3. 游戏对象建模从继承到多态的实战范本3.1 植物类如何用多态区分豌豆射手和向日葵植物在游戏中是一个天然的继承体系——所有植物都有生命值、种植冷却、所属行和列但行为完全不同。代码中plants作为基类只存储公共字段和纯虚接口// plants.h 中的核心接口 class Plants { public: Plants(int row, int col, int hp, int cost); virtual ~Plants() {} virtual void update() 0; // 每帧更新逻辑 virtual QString getTypeName() const 0; // 用于 UI 显示 virtual int getCost() const { return m_cost; } int getRow() const { return m_row; } int getCol() const { return m_col; } int getHp() const { return m_hp; } void takeDamage(int damage) { m_hp - damage; } protected: int m_row, m_col; int m_hp; int m_cost; };派生类各自实现update()向日葵调用sunshine类的接口生产阳光豌豆射手调用shootbox创建子弹坚果墙的update()是空函数——它真的就只是站着挨打。种植时setplants.cpp里有一个工厂函数根据玩家选中的卡片类型new出对应的派生类对象返回Plants*指针交给gamemap存管。这种设计的价值在后期扩展时体现得特别明显。如果你想加一个新植物只需要继承Plants实现update()和一个类型名称然后在setplants的工厂函数里加一个分支。不需要改动任何现有类的内部逻辑这就是开闭原则的直接应用。3.2 僵尸类的状态与行为移动、啃食、死亡僵尸相对植物要简单一些它的核心状态是「移动」和「啃食」。走到植物面前时咬住不放植物消失后再继续向前。代码里zombies.h定义了这些状态枚举和速度字段class Zombies { public: enum ZombieState { Walking, // 正常前进 Attacking, // 正在啃植物 Dead // 已死亡 }; Zombies(int row, int startX); void update(); // 由 gamemap 每帧驱动 void setState(ZombieState state); void takeDamage(int damage); private: int m_row; int m_x; // 沿 x 轴移动的当前位置 int m_speed; // 像素/帧 int m_hp; int m_attackDamage; int m_attackInterval; ZombieState m_state; };注意m_speed的单位是「像素/帧」而不是「像素/秒」。这与定时器的触发频率强相关如果需要调整僵尸速度直接改这个字段数值就行。m_attackInterval是两次啃食之间的帧数用于保证僵尸不会每帧都咬掉植物血。这两个参数是平衡点的精髓——调得太快游戏难度暴增调得太慢玩家堆起阵型就无脑随便过。我在拆这份代码时把这两个值单独抽出来打印了一遍确认它们确实在zombies.cpp的构造函数里赋值才明白整个游戏难度曲线是可以在不改代码的情况下单纯靠调参数实现的。3.3 碰撞检测不追求物理精确只追求「手感正确」子弹和僵尸的碰撞代码里没有用 Qt 自带的QGraphicsItem::collidesWithItem而是手写判断。原因很简单子弹是高速物体一帧就可能穿过目标依赖图形项的碰撞检测容易漏判。手写检测逻辑是取子弹的左上角坐标与僵尸的包围盒做矩形相交判断只在同一行内比较。伪代码如下// shootbox 或 gamemap 的碰撞更新逻辑 bool checkBulletHit(Peas* pea, Zombies* zombie) { if (pea-getRow() ! zombie-getRow()) { return false; // 不同行永远不碰 } // 简化版矩形相交忽略不规则形状 int peaLeft pea-getX(); int peaRight pea-x() pea-getWidth(); int zLeft zombie-getX(); int zRight zombie-getX() zombie-getWidth(); return peaRight zLeft peaLeft zRight; }这个方法不追求物理精确但「手感正确」——玩家看到子弹碰到僵尸头部区域的边缘就判定命中体感上与视觉完全同步。手写还有一个好处你可以在判定命中的同时代码里立刻把子弹对象从场景移除、给僵尸扣血、播放受击横幅和音效整个过程在一个函数里完成不需要通过信号通知另一个对象。减少跨模块通信也就减少出 bug 的面。4. 植物线程与 UI 通信别让定时器直接改界面4.1 plantthread 的真实作用后台运算与前台渲染分开这份代码里最容易让新手困惑的是plantthread这个类。很多初学者会问植物生产阳光、发射子弹这些逻辑直接用QTimer放在主线程里跑不行吗为什么还要单独开一个线程答案是阳光掉落、僵尸移动、子弹飞行这些计算量虽然不大但如果在主线程里做一旦某个定时器的槽函数处理耗时过长比如做碰撞检测时循环遍历了大量对象界面就会出现肉眼可见的卡顿和掉帧。线程把游戏逻辑从 UI 线程中剥离出来保证窗口拖动、按钮点击、菜单操作始终流畅。代码里plantthread内部一般是一个继承自QThread或持有QObject的类里面运行一个高频定时器通常是 15~30ms驱动所有游戏对象的状态更新void PlantThread::run() { // 定时器在线程内部创建不干扰主线程事件循环 m_timer new QTimer(); connect(m_timer, QTimer::timeout, this, PlantThread::updateGameState); m_timer-start(20); // 50 FPS 的游戏刷新率 exec(); // 启动该线程自己的事件循环 }updateGameState里面做的事情是遍历所有植物调用update()、遍历所有僵尸调用update()、遍历所有子弹做位置更新、执行碰撞检测并产生对应结果扣血、删除对象、生成阳光。这些改变的结果不直接操作界面的QGraphicsScene而是通过信号发送到主线程由主线程的槽函数更新画面元素。别小看这个「信号传回主线程」的步骤。很多 Qt 多线程翻车案例都是子线程里直接调用了 UI 对象的函数——Qt 的QGraphicsScene不是线程安全的在子线程往场景里addItem或者移动图形项轻则出现绘制撕裂重则直接崩溃。线程里只改数据主线程里只动 UI。这条纪律必须刻在脑子里。4.2 信号槽如何保证线程间通信不崩Qt 的信号槽跨线程通信有一个关键机制连接类型。默认的AutoConnection会根据发送者与接收者的上下文自动判断是否需要走队列。子线程发信号到主线程对象Qt 会自动采用QueuedConnection——信号被包装成事件投递到主线程事件队列等待主线程事件循环处理。这保证了线程安全也带来了一个隐含约束槽函数里拿到的参数在信号发出那一刻已经被「拷贝」或「包装」。如果跨线程传递的是对象指针要确保接收方访问该指针时对象还存活。常见做法是把游戏对象的轻量属性血量、坐标、状态枚举作为信号参数直接传值而不是传对象本身。这份代码里的信号设计也遵循这个思路多个信号都是传递整数或枚举值。这样写排错时非常轻松收到信号就更新 UI丢帧就查信号频率不会出现「你根本不知道数据是哪一线程改的」这种黑匣子问题。4.3 避坑多线程与定时器的三个典型案例现象一游戏运行几秒后界面闪烁、植物图片错位。原因某个植物对象被子线程删除了但主线程的场景里还残留着它的图形项指针下一次场景重绘时访问已释放的内存产生未定义行为。解决在子线程里不要直接调用场景的removeItem。统一在子线程填充一个“待删除对象 ID 列表”通过信号发给主线程主线程根据 ID 找到图形项并安全删除。现象二第一次点击「种植」按钮无反应再点一次才生效。原因种植请求发送到子线程后子线程还没来得及处理用户已经发出了第二次请求。某些状态在子线程里尚未复位导致第一次请求被忽略。解决在mainwidget里对种植操作加上状态锁——上一个请求未确认完成之前不允许再次发起。代码里可以通过一个m_isPlantingPending标志位配合信号槽的握手实现。确认一次点击只完成一次种植别在子线程里搞异步堆积。现象三关闭窗口时程序崩溃或卡死。原因主线程的mainwidget销毁后子线程定时器还在运行回调时访问了已经被销毁的对象。解决在closeEvent或析构函数里必须先停止子线程定时器调用stopTimer()再等待plantthread的wait()退出最后才销毁mainwidget自身。顺序绝不能反。我的习惯是先断开所有连接disconnect()再停定时器然后quit()wait()最后释放对象。这条后悔药经验基本是从血泪里来的。5. 移植到自己的电脑编译、资源路径与常见问题处理5.1 Qt 环境准备与三分钟编译法动手拆这份代码之前先确认你的电脑上有 Qt 5.15 或 Qt 6.x 的完整开发环境包含qtbase、qmake和编译器工具链。如果你用的 Qt 6大概率需要在PVZ.pro里改动一行QT core gui widgetsQt 6 把 widgets 模块从gui中拆出来了不加widgets会导致大量编译错误比如QMainWindow未定义、QApplication找不到。如果你拿到代码后第一轮编译报「未定义的 Q_OBJECT 宏」或者「vtable 链接错误」先看头文件里有没有Q_OBJECT再看.pro文件里有没有加QT widgets。这是我拆 Qt 项目遇到的第一大坑。编译命令在 Linux 或 macOS 上非常直接qmake PVZ.pro make -j4Windows 上如果你装了官方 Qt 安装包用 Qt Creator 打开PVZ.pro选择编译套件后直接点运行即可。理论上不需要手动调整路径qmake 会自动处理。5.2 资源文件缺失导致的黑屏问题res.qrc里包含了所有图片资源的相对路径。如果你下载的 zip 内资源文件结构不完整——比如缺了images/plants/目录下的某张图片——编译能通过但运行时界面上对应植物位置会显示空白或黑色矩形。Qt 的QResource在资源缺失时不报编译错只在运行时产生空图像非常隐蔽。排查方法是用 Qt Creator 的「资源浏览器」展开res.qrc对照代码里QPixmap(:/images/...)的路径逐一检查。我一般会先在代码全局搜索QPixmap加载语句把每一个资源路径提取出来然后打开.qrc文件检查是否都有对应项。如果你发现某些界面元素显示全黑而其他正常十有八九是资源路径打错或资源被删。5.3 坐标与地图配置的调整入口gamemap.cpp里有一段初始化代码定义了草坪的网格行列数和每格尺寸这是调整整个游戏画面布局的唯一入口gamemap::gamemap(QWidget* parent) : QWidget(parent) { m_rows 5; m_cols 9; m_cellWidth 80; m_cellHeight 100; // 初始化所有网格为空闲状态 for (int i 0; i m_rows; i) { QVectorbool rowStatus; for (int j 0; j m_cols; j) { rowStatus.append(true); // true 表示空闲、可种植 } m_gridStatus.append(rowStatus); } }改成 6 行 10 列游戏会变成更宽的地图。但要注意gamemap自己算坐标mainwidget里摆放植物卡片的位置是另一套坐标。两者如果不匹配手机地图上明明显示草坪很大拖动植物到某一行时却提示「不能种在这里」。这类边界问题我拆 Qt 塔防类代码时常常遇到——地图网格的布局计算和鼠标点击位置换算必须统一使用同一套参考坐标系。还有一点容易忽略m_cellHeight通常和图片实际显示高度不一致。Qt 的QLabel里放一张 80×120 的图如果格子高度只有 100图片会被拉伸或裁切从视觉上就看得出排版歪了。遇到这种情况不要急着调图片先把格子尺寸设为图片原始尺寸再回来调整不同行的摆放间隔。5.4 从代码包到可执行文件完整构建与验证步骤如果你跟着我拆到这里最终完整构建一次步骤应该如下# 1. 解压代码到无中文路径的目录中文路径在部分 Qt 版本中会导致编译失败 unzip PlantsVsZombies-main.zip -d ~/code/pvz # 2. 进入工程目录 cd ~/code/pvz # 3. 查看 .pro 文件是否包含所有源文件 cat PVZ.pro # 4. 清理旧的构建产物重要避免旧文件干扰 qmake 的链接过程 make clean rm -f Makefile # 5. 重新运行 qmake 并编译 qmake PVZ.pro make -j4 # 6. 运行可执行文件 ./PlantsVsZombies运行后你应该能看到一个自上而下的草坪地图最上方是植物选择栏选好向日葵或豌豆射手后点击草坪格子即可种植。如果界面出现图片错位、点击后植物不出现在正确的格子检查gamemap.cpp里坐标计算有没有按row * m_cellHeight的方式写。我见过有人在实现时把行和列写反导致种植位置全部偏移到下一行。这类 bug 特别容易出现在复制粘贴代码时。6. 数据驱动的游戏状态验证把参数抽成表格后更好调优拆完这份代码你会意识到所有游戏平衡都藏在一组参数里。与其一个个打开源文件找构造函数里的魔法数字我更推荐把核心参数抽出来整理成一张表方便后续调整游戏对象参数位置关键数值含义向日葵sunshine.cpp构造函数生产阳光的间隔帧数、每次产量豌豆射手shootbox.cpp构造函数射击间隔帧数、子弹伤害普通僵尸zombies.cpp构造函数血量、移动速度像素/帧、啃食伤害铲子spade.cpp冷却时间毫秒、生效半径小车smallcar.cpp触发判定范围、推进速度我这段时间验证这套代码的方式是把每一类对象的构造函数里的数字全部标记出来然后写一个小的测试程序调用游戏逻辑但屏蔽图像渲染循环跑一万帧打印每一帧的关键信息——阳光数量变化、僵尸位置、子弹与僵尸碰撞次数。这么做有两点收益第一能确认游戏循环是否稳定运行不崩第二能把「手感」变成「数值」比如僵尸走到第二行中间大概耗时多少帧玩家需要在多长时间内种出第一棵豌豆射手这些数据一目了然。有一回我调整了plantthread的定时器周期从 30ms 改到 10ms结果所有植物的攻击频率翻了 3 倍游戏难度暴跌。当时第一反应是「哪里改错了」排查后才发现所有冷却时间用的都是「帧数」而不是「秒」。从那以后我每次调整游戏节奏都强制走一遍「帧数→时间」的换算并把这个隐含约定写在代码注释里希望帮到你——这也是拆这份 Qt 代码包里最值得带走的一个习惯一个游戏项目的可维护性往往取决于参数是否集中、单位是否清晰而不是代码长得有多花哨。本文还有配套的精品资源点击获取

相关新闻

PHP对接劳动仲裁查询API,构建智能背调与风控预警系统

PHP对接劳动仲裁查询API,构建智能背调与风控预警系统

劳动仲裁记录这几年在招聘和业务风控里的分量越来越重。以前背调主要看学历、工作经历、是否有犯罪记录,但实践下来会发现,劳动仲裁信息往往是判断候选人职业稳定性、企业用工合规风险的重要信号。一个人跟老东家频繁打仲裁,背后可能是公司管…

2026/10/18 12:48:36 阅读更多 →
水下传感器网络仿真代码包:MAC与路由协议完整实现

水下传感器网络仿真代码包:MAC与路由协议完整实现

简介:这份资源面向水下传感器网络(UWSNs)方向的研究生、科研人员与授课教师,提供一套可直接运行的仿真代码与配套资料,用于验证声波通信、路由协议、能量管理与数据融合等关键算法。压缩包共131个文件,约22…

2026/10/18 12:48:36 阅读更多 →
用户友好提示词设计指南:从原理到实战的完整方法论

用户友好提示词设计指南:从原理到实战的完整方法论

我做了两年多的提示词设计工作,中间帮不少团队搭建过面向终端用户的大模型应用,也和很多工程师争论过“提示词到底算不算代码”。我个人的结论是:提示词确实不算传统意义上的代码,但它一定是需要结构化设计的工程产物。一个用户友…

2026/10/18 12:47:36 阅读更多 →

最新新闻

电大计算机专业毕业论文写作指南:从系统实现到Word排版

电大计算机专业毕业论文写作指南:从系统实现到Word排版

简介:这是一份电大计算机科学与技术专业的毕业论文,主题为图书信息管理系统的设计与实现。论文以管理信息系统为背景,详细阐述了系统的需求分析、功能模块划分、数据库结构设计及前端应用程序开发全过程,并选用大连飞扬软件工作室…

2026/10/18 13:33:01 阅读更多 →
Hugo侧边栏改造实操:菜单配置、布局实现与踩坑记录

Hugo侧边栏改造实操:菜单配置、布局实现与踩坑记录

侧边栏这活儿,不干不知道,一干全是细节。这个系列更新到第92期,前六部分我们先后把Ubuntu上的Hugo环境搭好、主题跑起来、内容组件填满,博客的基本盘算是稳了。但每次打开自己的博客,总感觉少了点啥——访客进来之后除…

2026/10/18 13:33:01 阅读更多 →
Python入门配套教程PDF怎么用?版本检查、环境配置与练习改造指南

Python入门配套教程PDF怎么用?版本检查、环境配置与练习改造指南

简介:面向Python初学者的入门配套文档,由千锋教育整理,将分散在多个渠道的百度云学习资源汇总进一份PDF,方便读者按图索骥。文档覆盖Python基础教程、高手晋级、Windows/Linux知识点、Web开发、机器学习及树莓派应用等方向&#x…

2026/10/18 13:33:01 阅读更多 →
artcraft:在可编程框架中为手工感预留结构化接口

artcraft:在可编程框架中为手工感预留结构化接口

1. “Artcraft”不是新词,而是被低估的创作范式重启信号最近在多个设计社区、独立开发者论坛和高校数字艺术课程讨论区里,“artcraft”这个词频繁跳出来——不是作为某个具体工具、平台或项目的名称,而是像一个悄然浮出水面的共识性概念。它不…

2026/10/18 13:33:01 阅读更多 →
前端读取Excel的本质:ZIP+XML解析与SheetJS实战

前端读取Excel的本质:ZIP+XML解析与SheetJS实战

1. 为什么浏览器里“直接读Excel”是个伪命题——从文件本质说起 很多人第一次在项目里遇到“前端读Excel”需求时,第一反应是:Excel不是文件吗?用 fetch 下来,再用 FileReader 读成字符串不就完事了?我当年也是这…

2026/10/18 13:33:01 阅读更多 →
索引版本管理实战:重建索引不中断服务的蓝绿切换

索引版本管理实战:重建索引不中断服务的蓝绿切换

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录索引版本管理实…

2026/10/18 13:32:01 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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/18 0:55:02 阅读更多 →
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/18 12:16:16 阅读更多 →