Qt C++俄罗斯方块毕设实战:最小可信闭环架构设计
简介本资源是一套完整的基于Qt框架与C语言开发的俄罗斯方块游戏毕业设计项目面向高校计算机、软件工程等专业本科生适用于课程设计、毕设参考及GUI编程能力进阶学习。压缩包共45个文件含11个核心cpp源码、3个makefile构建脚本、2个可执行exe程序Debug/Release双版本、4个Word文档含任务书、中期报告、毕业论文终稿、1个答辩PPTX及Qt专用qrc资源文件全面覆盖从代码实现、编译部署到论文撰写与答辩展示的全流程。资源大小为4.69MB结构清晰模块划分明确便于理解Qt图形视图框架QGraphicsView/QGraphicsItem在游戏逻辑、碰撞检测、行消除与键盘响应中的实际应用。目前已有637人学习下载读者可直接运行调试、复现完整游戏功能深入掌握面向对象设计、事件驱动机制与跨平台GUI开发关键实践。1. 为什么一个“过时”的俄罗斯方块反而成了毕设答辩里最稳的选题不是所有毕设都得追AI大模型、微服务或区块链。去年带某高校三组毕业设计两组做“基于YOLOv8的智能垃圾分类系统”答辩现场卡在OpenCV版本兼容和摄像头调用上另一组硬上SpringBootVue3商城被导师一句“登录态怎么跨域保持”问到哑火。而那个用Qt 5.2 MinGW 32bit写的俄罗斯方块——代码不到2000行PPT第7页就跑通完整逻辑答辩全程没卡顿连暂停键响应延迟都测出了毫秒级数据。它不炫技但每一块砖都踩在验收红线内图形渲染可截图、键盘事件可复现、得分逻辑可断点验证、状态切换有明确入口/出口。这不是怀旧是工程落地的“最小可信闭环”用C直控内存、用Qt封装跨平台GUI、用经典游戏规则反向约束设计边界。适合两类人一是想稳过答辩、把精力留给论文写作和查重降重的同学二是需要一份能直接拆解模块、替换算法、迁移到嵌入式Qt环境比如国产RTOSQt for MCU的工程师参考模板。你不需要造轮子但得知道轮子怎么咬合。2. 总体架构设计三层结构与四个核心模块的职责划分2.1 架构选型依据为什么不用QML而坚持QWidgetQGraphicsViewQt生态里QML常被宣传为“现代UI首选”但对毕设场景它反而是个坑。QML依赖JavaScript引擎和声明式绑定在MinGW 32bit这种老旧工具链下调试器无法断点进JS逻辑报错信息全是“QMetaProperty::read: Unable to handle unregistered type”学生根本无从下手。而本方案采用QWidget作为主窗口容器QGraphicsView作为游戏画布QGraphicsItem派生类实现方块实体——这是Qt官方文档《Painting and Drawing》章节明确推荐的“高性能2D绘图路径”。关键优势有三点第一所有绘制逻辑在C层GDB可单步调试paint()函数内部坐标计算第二QGraphicsScene的addItem()/removeItem()天然支持对象生命周期管理避免野指针第三键盘事件通过QGraphicsView::keyPressEvent()捕获无需处理QML的Keys.onPressed信号链断裂问题。实测对比同配置下QGraphicsView帧率稳定60FPSvsync开启QML在复杂动画时掉帧至32FPS且无有效profiling工具。2.2 模块划分GameCore、BlockManager、ScoreBoard、InputHandler四大组件整个系统按单一职责原则划分为四个头文件实现文件组合目录结构清晰到可以直接映射到答辩PPT的“系统模块图”页src/ ├── gamecore.h/cpp // 游戏主循环、状态机、碰撞检测核心算法 ├── blockmanager.h/cpp // 方块生成策略、旋转矩阵、形状定义I/O/T/S/Z/L/J七种 ├── scoreboard.h/cpp // 得分计算单行/双行/三行/四行消去、等级加速、最高分持久化 └── inputhandler.h/cpp // 键盘事件分发、防抖处理、长按移动逻辑非即时响应提示GameCore不继承QGraphicsView而是持有QGraphicsScene*指针——这是为后续扩展留的活口。比如答辩时导师问“如何加音效”你只需在GameCore::onLineCleared()里插入QSound::play(:/sound/clear.wav)完全不影响视图层。2.3 状态机设计五种游戏状态与安全切换机制俄罗斯方块看似简单但状态流转极易出错。本方案定义严格的状态枚举enum GameState { STATE_READY, // 初始化完成等待空格键开始 STATE_PLAYING, // 正常下落、旋转、移动 STATE_PAUSED, // 暂停时冻结计时器但保留当前方块位置 STATE_GAMEOVER, // 底部堆叠触顶触发结束逻辑 STATE_WAITING // 行消除动画中禁止任何输入 };关键设计点在于状态切换必须经由统一入口// gamecore.cpp void GameCore::changeState(GameState newState) { if (m_currentState newState) return; // 防止重复切换 // 退出前清理 switch(m_currentState) { case STATE_PLAYING: m_timer-stop(); break; case STATE_PAUSED: // 无需操作 break; default: break; } m_currentState newState; // 进入新状态初始化 switch(newState) { case STATE_PLAYING: m_timer-start(m_dropInterval); // 根据等级动态调整 break; case STATE_PAUSED: m_timer-stop(); break; case STATE_GAMEOVER: saveHighScore(); // 写入ini文件非数据库 break; default: break; } }这个changeState()函数被所有外部调用如InputHandler捕获ESC键、ScoreBoard检测满级强制调用杜绝了m_currentState STATE_PAUSED这种裸赋值导致的状态撕裂。2.4 数据结构选型二维数组 vs QGraphicsItem容器的取舍初学者常纠结“用int board[20][10]存方块位置还是用QListQGraphicsItem*存活动方块”。本方案采用混合存储后台逻辑层int m_board[20][10]20行×10列值为0空或1~7对应七种方块ID。所有碰撞检测、行消除计算均在此数组进行保证算法复杂度O(1)前台渲染层QListQGraphicsItem* m_activeBlocks仅存储当前下落中的方块最多4个格子每次moveDown()后调用updateScene()刷新历史固化层行消除后将已固化的方块从m_activeBlocks移除其坐标写入m_board对应位置。这样设计的好处是调试时可随时打印m_board数组查看逻辑状态qDebug() m_board[i][j]而渲染层崩溃不会影响游戏逻辑——曾有学生误删QGraphicsItem导致画面黑屏但控制台仍正常输出“Line cleared! Score: 800”证明核心逻辑健壮。3. 关键模块实现从方块旋转矩阵到防抖键盘处理3.1 BlockManager七种方块的旋转矩阵与坐标偏移俄罗斯方块的旋转不是简单90度翻转而是围绕中心点的坐标变换。本方案为每种方块预定义4个朝向的坐标偏移表以中心块为原点// blockmanager.h struct Tetromino { int shape[4][2]; // 四个格子相对于中心的(x,y)偏移 int color; // Qt颜色值如Qt::blue }; // blockmanager.cpp - I型方块定义 const Tetromino TETROMINO_I {{ {-1, 0}, {0, 0}, {1, 0}, {2, 0} // 初始水平状态 }, Qt::cyan}; // 旋转算法绕中心点逆时针90度 - (x,y) (-y,x) void BlockManager::rotateCurrentBlock() { // 先备份原坐标 QVectorQPoint originalPos mCurrentBlock.positions(); // 对每个格子应用旋转公式 for(int i 0; i 4; i) { int x originalPos[i].x(); int y originalPos[i].y(); mCurrentBlock.setPosition(i, QPoint(-y, x)); // 新坐标 } // 旋转后可能越界需校验 if (!isValidPosition()) { // 恢复原坐标放弃旋转 for(int i 0; i 4; i) { mCurrentBlock.setPosition(i, originalPos[i]); } } }设计说明这里没有用QTransform矩阵运算因为QTransform会引入浮点误差而俄罗斯方块必须是整数坐标。所有计算保持int类型避免qRound()带来的不可预测舍入。3.2 InputHandler长按移动的防抖与时间阈值控制键盘长按是最大翻车点。Windows默认键盘重复延迟约500ms但游戏需要“按住→快移→微调”的三级响应。本方案用定时器模拟长按// inputhandler.h private: QTimer* m_autoMoveTimer; // 长按移动定时器 int m_autoMoveDelay; // 首次延迟毫秒 int m_autoMoveInterval; // 后续间隔毫秒 // inputhandler.cpp void InputHandler::keyPressEvent(QKeyEvent *event) { switch(event-key()) { case Qt::Key_Left: m_gameCore-moveLeft(); startAutoMove(Qt::Key_Left); // 启动长按 break; case Qt::Key_Right: m_gameCore-moveRight(); startAutoMove(Qt::Key_Right); break; // ...其他键 } } void InputHandler::startAutoMove(Qt::Key key) { if (m_autoMoveTimer-isActive()) return; m_autoMoveTimer-setSingleShot(true); m_autoMoveTimer-start(m_autoMoveDelay); // 首次延迟500ms connect(m_autoMoveTimer, QTimer::timeout, []() { if (key Qt::Key_Left) { m_gameCore-moveLeft(); } else if (key Qt::Key_Right) { m_gameCore-moveRight(); } // 之后以更快频率触发 m_autoMoveTimer-setInterval(m_autoMoveInterval); // 设为80ms m_autoMoveTimer-start(); }); }参数说明m_autoMoveDelay500模拟系统默认长按延迟m_autoMoveInterval80确保快速移动流畅性。实测表明80ms是人手可感知的“连续移动”下限低于此值易误触发。3.3 ScoreBoard得分公式与等级加速曲线得分不是简单累加而是按消除行数和等级动态计算// scoreboard.cpp int ScoreBoard::calculateScore(int linesCleared, int level) { static const int baseScore[] {0, 40, 100, 300, 1200}; // 0,1,2,3,4行基础分 return baseScore[linesCleared] * level; } void ScoreBoard::increaseLevel() { m_level; // 加速曲线每升一级下落速度提升15%但不低于100ms m_dropInterval qMax(100, (int)(m_dropInterval * 0.85)); emit levelChanged(m_level); }设计说明baseScore数组直接对应Tetris Guideline标准答辩时可引用《The Tetris Company》官方规则增强说服力。qMax(100, ...)防止无限加速导致游戏失控——这是某同学答辩被问“如果玩到100级会怎样”时的救命参数。3.4 GameCore碰撞检测的两种模式与行消除原子操作碰撞检测分两层软碰撞isValidPosition()检查方块是否超出左右/底部边界或与已固化方块重叠硬碰撞isLanded()在每次下落一格后调用若返回true则固化当前方块并生成新方块。行消除必须是原子操作否则会出现“消除动画未播完就生成新方块”的撕裂// gamecore.cpp void GameCore::checkAndClearLines() { int linesCleared 0; for(int row 0; row BOARD_HEIGHT; row) { bool full true; for(int col 0; col BOARD_WIDTH; col) { if(m_board[row][col] 0) { full false; break; } } if(full) { linesCleared; // 标记该行待清除不立即删除 m_linesToClear.append(row); } } if(linesCleared 0) { // 进入WAITING状态启动消除动画定时器 changeState(STATE_WAITING); m_clearAnimationTimer-start(100); // 100ms后执行清除 } } // 动画定时器回调 void GameCore::onClearAnimation() { if(m_linesToClear.isEmpty()) { changeState(STATE_PLAYING); // 恢复游戏 return; } int row m_linesToClear.takeFirst(); // 将row以上所有行下移一行 for(int r row; r 0; r--) { for(int c 0; c BOARD_WIDTH; c) { m_board[r][c] m_board[r-1][c]; } } // 清空第0行 for(int c 0; c BOARD_WIDTH; c) { m_board[0][c] 0; } }关键点m_linesToClear是QListint而非std::vector因Qt容器在信号槽中传递更安全onClearAnimation()中先takeFirst()再操作避免迭代器失效。4. 常见问题排查答辩前必过的五个血泪关卡4.1 现象按下空格键无反应但控制台无报错原因QGraphicsView默认拦截键盘事件需显式启用焦点。很多学生只写了setFocusPolicy(Qt::StrongFocus)却忘了setFocus()。解决在GameView构造函数末尾添加this-setFocusPolicy(Qt::StrongFocus); this-setFocus(); // 必须主动获取焦点玄学经验setFocus()要放在show()之后调用否则Windows平台可能失效。建议在main.cpp的w.show()后加w.setFocus()。4.2 现象方块旋转后位置偏移甚至飞出屏幕原因旋转中心点错误。初学者常以左上角为原点计算但俄罗斯方块规范要求以“中心格子”为旋转中心。I型方块有4格中心在第2格索引1需先平移使中心到(0,0)旋转后再平移回原位。解决在rotateCurrentBlock()中增加中心校正// 获取中心格子坐标取第2个格子 QPoint center mCurrentBlock.position(1); // 所有格子先平移至中心为原点 for(int i 0; i 4; i) { QPoint p mCurrentBlock.position(i) - center; // 旋转 QPoint rotated(-p.y(), p.x()); // 平移回中心位置 mCurrentBlock.setPosition(i, rotated center); }4.3 现象编译通过但运行时报“QPainter::begin: Widget painting can only begin as a result of paintEvent”原因在非paintEvent()函数中直接调用QPainter绘图比如在keyPressEvent()里画方块。Qt强制要求所有绘制必须在paintEvent()或QPixmap离屏缓冲中进行。解决删除所有非paintEvent()中的QPainter代码改为调用update()触发重绘// 错误示范删掉 void GameView::keyPressEvent(QKeyEvent *e) { QPainter p(this); p.drawRect(...); // 绝对禁止 } // 正确做法 void GameView::keyPressEvent(QKeyEvent *e) { m_gameCore-handleInput(e); // 仅更新逻辑 update(); // 请求重绘 } void GameView::paintEvent(QPaintEvent *) { QPainter p(this); drawBoard(p); // 所有绘制集中在此 }4.4 现象打包成exe后在其他电脑闪退事件查看器显示“应用程序无法正常启动(0xc000007b)”原因Qt 5.2 MinGW 32bit依赖libgcc_s_dw2-1.dll和libstdc-6.dll这些DLL未随exe分发。解决使用windeployqt.exe工具Qt安装目录下# 在build目录下执行 windeployqt --no-opengl-sw --no-webkit2 --no-quick --no-angle MYTetrix.exe注意--no-opengl-sw禁用软件OpenGL避免某些集成显卡驱动冲突生成的platforms/qwindows.dll必须存在否则白屏。4.5 现象答辩演示时连续快速按键导致方块穿墙或卡在半空原因键盘事件未做速率限制moveLeft()被高频调用而isValidPosition()校验在moveLeft()内部但moveLeft()本身未加锁。解决在GameCore中添加移动锁// gamecore.h private: bool m_isMoving; // gamecore.cpp bool GameCore::moveLeft() { if(m_isMoving) return false; // 拒绝重入 m_isMoving true; // 执行移动逻辑... bool success isValidPosition(); if(success) { // 更新坐标 } m_isMoving false; return success; }血泪经验这个锁必须是bool而非QMutex因为moveLeft()是同步函数用互斥锁反而引发死锁。bool标志足够应对单线程GUI事件循环。5. 答辩验收指南从代码审查到PPT呈现的六步通关法5.1 代码审查导师最可能抽查的三个函数答辩不是代码走读但导师会随机点开1-2个关键函数看质量。以下三个函数是高频抽查目标务必确保它们满足“一眼可读、逻辑自洽、无魔法数字”函数名审查重点合格示例特征isValidPosition()边界检查是否全覆盖左/右/底/重叠有清晰注释// 检查是否超出左边界if (x 0) return false;而非if (x -1)rotateCurrentBlock()旋转中心校正是否正确包含center position(1)计算且有- center和 center配对checkAndClearLines()行消除是否原子化使用m_linesToClear暂存不直接修改m_board有STATE_WAITING状态切换实战技巧提前在VSCode中用CtrlShiftH全局搜索这三个函数名确认它们在.cpp文件中而非头文件里避免内联污染且函数长度不超过30行。超过则拆分为checkFullRow(int row)和clearRow(int row)。5.2 PPT制作技术深度与叙事节奏的黄金配比答辩PPT不是代码截图堆砌而是用“问题-方案-证据”三段式讲故事。以“碰撞检测”为例问题页1页放一张手绘草图标出方块下落时可能发生的四种碰撞左墙、右墙、底墙、已固化方块配文“传统if判断易漏边界如何100%覆盖”方案页1页展示isValidPosition()函数核心逻辑框图用不同颜色区分四类检查箭头指向return false分支证据页1页放测试用例表格列出10组边界坐标输入如x-1,y5、x10,y15右侧标注“预期结果false”和“实测结果false✅”。避坑提醒PPT中禁止出现// TODO: fix this或printf(debug)等开发痕迹。所有代码截图必须经过格式化Qt Creator中CtrlI字体设为Consolas 14号行号开启。5.3 环境演示三分钟内让导师信服的“可信启动”答辩演示最怕“准备半小时运行三分钟”。按此流程保稳冷启动验证30秒关闭所有IDE双击MYTetrix.exe观察是否立即弹出窗口非黑屏/白屏基础操作验证60秒空格键开始 → 左右键移动 → 上键旋转 → 下键加速 → 消除一行 → 观察得分变化压力测试验证30秒连续快速按方向键10次确认无穿墙、无崩溃、无残影异常恢复验证30秒按ESC暂停 → 按P继续 → 按R重置 → 确认状态重置干净。关键细节演示前用Process Explorer确认无残留MYTetrix.exe进程build-Release目录下的exe必须重命名为MYTetrix_demo.exe避免与build-Debug版本混淆。5.4 论文撰写图表与公式的“答辩友好型”排版毕业论文不是技术文档而是给非Qt专家看的说明。所有图表必须满足截图带标尺用Snipaste截取游戏界面时开启“标尺”显示像素尺寸如800×600证明适配性流程图禁用mermaid用draw.io导出PNG节点用矩形非圆角连接线标注“是/否”而非Y/N公式编号右对齐如“得分公式$S B \times L$ 2-1”其中B为基准分L为等级括号内为章节-序号。血泪教训某同学论文中m_dropInterval变量未在公式中定义被导师追问“这个变量哪来的”当场翻车。所有代码中出现的变量论文中首次出现时必须加粗并给出物理意义。5.5 答辩话术当被问到“为什么不用Unity/Python”时的标准应答这类问题本质是考察技术选型思维而非贬低其他工具。标准回答结构“选择Qt C主要基于三个刚性约束第一课程要求明确指定‘掌握面向对象编程与GUI框架’Qt的信号槽机制是理解松耦合设计的绝佳案例第二资源约束本项目需在无网络环境的实验室电脑运行Qt 5.2 MinGW 32bit安装包仅200MB而Unity Hub需下载GB级编辑器第三可验证性C内存模型让每一步操作如new QGraphicsRectItem可被GDB追踪这对理解‘对象生命周期’比Python的GC更直观。当然如果是商业级游戏我会优先评估Unity的粒子系统和AssetBundle热更能力。”5.6 终极验收清单答辩前夜必须完成的七件事事项操作验证方式1. 代码归档将src/、build-Release/、doc/含论文.docx、PPT.pptx打包为MYTetrix_v1.0_final.zip解压后路径深度≤3层无中文乱码文件名2. 依赖检查用ldd MYTetrix.exe | grep not found检查缺失DLL输出为空行即合格3. 文档签名在论文封面、任务书、中期报告末页手写签名扫描件PDF中签名区域清晰无涂改痕迹4. PPT动画删除所有“飞入”“缩放”等复杂动画仅保留“淡入”演示时按空格键逐页出现无卡顿5. 备用方案准备U盘存MYTetrix.exe和Qt5Core.dll等5个核心DLL在答辩电脑上手动复制DLL到exe同目录6. 时间演练用手机录像模拟答辩严格计时8分钟陈述2分钟问答陈述部分≤7分30秒留30秒缓冲7. 紧急回滚在Git中打tagv1.0-final并导出git archive --formatzip v1.0-final backup.zip解压backup.zip可直接编译运行从那以后我每次带毕设都会在开题后第一周就让学生跑通build-Release下的exe并录下30秒操作视频发给我。不是为了卡进度而是让“能运行”成为刻在骨子里的第一准则——毕竟答辩桌上一个闪退的exe比一百行漂亮注释都有说服力。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Seaborn绘图实战:统计图表从繁琐到高效的进阶指南

Seaborn绘图实战:统计图表从繁琐到高效的进阶指南

第一次用Seaborn的时候,我正好被一张matplotlib的小提琴图折腾得够呛,光是手动实现误差线、箱体、核密度曲线就写了一百多行,效果还一言难尽。后来换到Seaborn,一行命令直接出图,配色顺眼、置信区间自动给,…

2026/10/20 11:00:32 阅读更多 →
基于机器学习的肝病患者智能诊断系统设计与实践

基于机器学习的肝病患者智能诊断系统设计与实践

很多人毕设选题时都会陷入一个误区:要么选一个“过于玩具”的课题,比如套个现成框架跑个MNIST手写识别;要么选一个“过于宏大”的课题,比如什么基于深度学习的多模态医疗影像辅助决策系统,最后发现自己连数据都搞不定&…

2026/10/20 10:52:02 阅读更多 →
Linux PS3环境变量详解:用select循环打造优雅交互菜单

Linux PS3环境变量详解:用select循环打造优雅交互菜单

做 Linux 脚本的,十个里有八个天天见 PS1,偶尔见 PS2,但 Linux PS3 环境变量真心属于那种冷门到没人提、可一旦用上就离不开的提示符。我一开始也是自己用 echo 打印菜单项,再用 read 接数字,代码里一堆数字匹配逻辑。…

2026/10/20 12:06:50 阅读更多 →

最新新闻

2026年教育培训SaaS系统怎么选?从评价维度到避坑指南全解析

2026年教育培训SaaS系统怎么选?从评价维度到避坑指南全解析

第一次被培训机构老板问“哪家SaaS系统排名高”的时候,我记得很清楚,那是2018年,一个做少儿艺术培训的朋友拿着三份报价单来找我对比。那时候大家比的还是谁家的功能模块多、谁家的App长得好看。到了2026年,这个问题不但没变简单&…

2026/10/20 12:06:01 阅读更多 →
KECA核熵成分分析:训练测试集分离与数据泄漏避坑实践

KECA核熵成分分析:训练测试集分离与数据泄漏避坑实践

简介:这是一份面向非线性高维数据降维的KECA(核熵成分分析)MATLAB程序,适用于机器学习、模式识别及特征提取场景,尤其针对Q9A等需要核熵分析的实验问题。KECA结合核方法与熵理论,将数据映射到高维特征空间后…

2026/10/20 12:06:01 阅读更多 →
Kafka 2.8.0生产者消费者原生实现与高可用配置详解

Kafka 2.8.0生产者消费者原生实现与高可用配置详解

1. 项目概述:为什么一个“简单实现”值得花时间深挖?Kafka集群(2.8.0版本)之四:Java简单实现生产者和消费者——这个标题看起来平平无奇,甚至有点“教科书感”。但在我过去十年带团队落地消息中间件的实战中…

2026/10/20 12:06:01 阅读更多 →
MATLAB数据分析与挖掘实战:数据预处理、特征工程与建模避坑指南

MATLAB数据分析与挖掘实战:数据预处理、特征工程与建模避坑指南

简介:MATLAB数据分析与挖掘实战完整教程整合了配套源码、说明文档与真实数据集,面向工科生、数学专业及算法方向学习者,可系统演练数据导入、清洗、建模、评估与结果分析的完整链路,帮助理解数据挖掘中常用的预处理思路和建模方法…

2026/10/20 12:06:01 阅读更多 →
无GPU也能跑大模型:银河麒麟V10离线部署DeepSeek-R1全流程

无GPU也能跑大模型:银河麒麟V10离线部署DeepSeek-R1全流程

简介:面向银河麒麟V10操作系统技术人员的一份DeepSeek离线部署操作指南,重点解决在内网或无互联网环境下安装ollama大语言模型服务及chatbox客户端的问题。资源为单个docx文档,约2.69MB,内容涵盖系统环境与硬件检查、ollama解压安…

2026/10/20 12:06:01 阅读更多 →
KSyntaxHighlighting编译指南:解决KF6依赖与CMake构建链问题

KSyntaxHighlighting编译指南:解决KF6依赖与CMake构建链问题

1. 项目概述:为什么一个语法高亮库的编译会卡住你一整天?“编译 KSyntaxHighlighting 的过程中遇到的一些问题”——这个标题看起来平平无奇,甚至有点枯燥,但它背后藏着的是无数 C 跨平台开发者的共同记忆:一个看似轻量…

2026/10/20 12:05:01 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →