C++ EasyX仿制超级马里奥:从游戏循环到碰撞检测的完整实战
简介基于C与EasyX图形库还原超级马里奥玩法的项目源码包面向具备基础C语法、希望进阶图形界面与游戏循环开发的初学者。资源已完整实现1-1、1-2、1-3三个关卡涵盖移动、跳跃、加速、发射火球、下蹲钻管道等核心操作操作采用A/D移动、K跳跃、J加速/发射火球、S下蹲/钻管道原汁原味还原经典操作方式并配有项目说明便于理解整体结构与编译环境配置。压缩包共239个文件约10.6MB其中163个png承担角色与场景素材25个mp3和1个wav提供背景音乐与音效21个cpp与21个h构成游戏逻辑与模块声明另有sln与vcxproj工程文件可在Visual Studio 2022下直接打开运行。适合用来源码学习关卡设计、碰撞检测和EasyX绘图流程也可作为课程设计或入门游戏开发的参考。目前已有568人学习下载对于想模仿经典平台跳跃游戏机制的开发者来说是一份紧凑且可直接运行的实践资料。1. 基于 C 与 EasyX 的超级马里奥仿制源码能跑吗能学到什么坑在哪基于 C 与 EasyX 图形库的超级马里奥仿制是 C 入门阶段少有的「一个项目把游戏主干全串起来」的选题。拿到这个压缩包的读者通常要犹豫三件事能不能编译、能学到什么、值不值得花一周去啃。先给结论值得。EasyX 不做物理、不做场景管理它只负责把像素画到窗口上你反而能在几百行代码里看清游戏循环的真实结构——窗口初始化、主循环、键盘输入、地图渲染、碰撞检测、重力跳跃、帧动画、敌人 AI一个都不少。它适合两类人想做点能演示作品的学生以及想验证自己 C 到底学没学明白的从业者。下面按这类源码最常见的组织方式把跑通步骤、核心参数和翻车点一次讲透。2. EasyX 窗口与游戏循环先让主角在 800×600 画布里动起来拿到 zip 之后第一件事不是读代码而是确认它能不能编译。EasyX 程序只能在 Windows 环境下编译运行因为 initgraph 底层走的是系统 GDI 接口换到 Linux 或 macOS 上用什么编译器都起不来。常见做法是新建一个空的控制台项目把源码里的 .cpp 文件和图片资源放进项目目录装好 EasyX 后直接编译。这类源码包附带的项目说明文档开头两页一般就是环境要求和按键约定左右方向键移动、空格跳跃照着配置比对着代码猜省事得多。2.1 initgraph 与双缓冲为什么这几行是画面稳定的地基initgraph 会创建一个窗口并建立绘图设备上下文窗口默认左上角是坐标原点x 轴向右y 轴向下。这个 y 轴方向在后面写跳跃、写角色下落时非常容易把人绕进去切记「向下为正」。分辨率的选择直接决定地图大小和角色比例800×600 配合 50 像素的砖块地图可以有 16×12 格如果你改成 1024×768角色和砖块都要等比放大否则画面中间会空一大片。#include graphics.h #include conio.h int main() { // 初始化 800x600 的游戏窗口 initgraph(800, 600); // 双缓冲所有绘制先写到后台缓冲区 BeginBatchDraw(); while (!_kbhit()) // 任意键退出游戏 { cleardevice(); // 用背景色清掉上一帧否则会拖残影 // 绘制一帧先用矩形占位后续换成贴图 solidrectangle(100, 300, 140, 340); // 把后台缓冲一次性刷到屏幕 FlushBatchDraw(); Sleep(16); // 近似 60 FPS 的帧间隔 } EndBatchDraw(); // 结束批量绘制 closegraph(); // 关闭窗口并释放 GDI 资源 return 0; }这是整份源码的最小骨架四件事各就各位initgraph 开窗口BeginBatchDraw 开后台缓冲循环体里清屏、绘制、刷屏退出时 EndBatchDraw 配 closegraph 收尾。BeginBatchDraw 和 EndBatchDraw 必须成对出现否则系统资源不会正常回收。cleardevice 会按 setbkcolor 设置的背景色填充全屏漏掉它上一帧的角色会拉出一串残影。Sleep(16) 只是近似值Windows 的定时器实际会多睡 12ms跑久了画面明显偏慢所以帧节奏要交给 2.2 的时间戳来校准。参数上有两个习惯建议直接养成把窗口宽高提成常量比如const int WIN_W 800; const int WIN_H 600;后面所有地图换算、相机偏移都依赖这两个值写矩形坐标时按「左上角 宽高」的思维组织别直接用两个对角点这样和后面碰撞用的 Box 结构能对上。2.2 键盘输入与帧率校准马里奥的响应感从哪来EasyX 本身没有封装按键事件常见做法是直接调 Windows API。_kbhit只能判断「有没有按」不能判断「按了什么」所以用它做退出判断角色移动需要按帧采样每个键的状态用 GetAsyncKeyState 最直接。#include windows.h int playerX 100, playerY 300; // 主角位置 const int SPEED 4; // 水平速度像素/帧 DWORD lastFrame GetTickCount(); while (!_kbhit()) { // 0x8000 表示该键此刻处于按下状态 if (GetAsyncKeyState(VK_LEFT) 0x8000) playerX - SPEED; if (GetAsyncKeyState(VK_RIGHT) 0x8000) playerX SPEED; // 按真实时间刷新而不是无脑 Sleep DWORD now GetTickCount(); if (now - lastFrame 16) { cleardevice(); solidrectangle(playerX, playerY, playerX 40, playerY 40); FlushBatchDraw(); lastFrame now; } }GetAsyncKeyState 返回的是一个短整型最高位为 1 表示按键正被按下所以必须和 0x8000 做位与。只写if (GetAsyncKeyState(VK_LEFT))会把「历史按没按过」也当成真表现就是松开方向键角色还在跑——这是输入处理里最常见的翻车点。SPEED 单位是像素/帧60 帧下 4 像素约等于每秒 240 像素1 秒横穿三分之一屏这个速度感基本接近马里奥原版的「轻快」调到 2 像散步调到 8 以上碰撞就容易被单帧位移穿透第五章会专门讲。用 GetTickCount 校准帧率有两个直接收益一是 Sleep(16) 的累计误差被消掉二是「更新逻辑」和「绘制」解耦之后切动画帧、计分、刷敌人全都以 now 这个时间轴为准而不是以循环次数为准。注意 GetTickCount 是毫秒级定时器做帧率统计精度不够第六章会给出替代方案。3. 地图数组与碰撞检测仿制马里奥的物理地基怎么搭角色能不能跑起来取决于循环跑起来之后像不像马里奥全看地图和碰撞这两块。砖块、管道、台阶的位置在源码里基本都是一张二维数组地图碰撞交给 AABB 矩形重叠判定。这两块合起来占了整个项目接近一半的代码量也是最容易做出「能看不能玩」效果的部分。3.1 用二维数组把砖块变成数据地图渲染的最小命令地图用 int 二维数组存每一格对应一个图块。约定一般写在整个文件开头的注释里0 是空白1 是地面2 是砖块3 是问号箱。渲染时把数组坐标换算成屏幕坐标逐个画矩形。const int ROWS 12, COLS 16; // 地图 12 行 x 16 列 const int TILE 50; // 每格 50x50 像素 int map[ROWS][COLS] { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; for (int row 0; row ROWS; row) { for (int col 0; col COLS; col) { if (map[row][col] 0) continue; // 空白不画 int x col * TILE; // 列号 - 屏幕 x int y row * TILE; // 行号 - 屏幕 y setfillcolor(map[row][col] 1 ? RGB(180, 90, 40) : RGB(220, 180, 60)); solidrectangle(x, y, x TILE, y TILE); } }两个换算关系必须刻进脑子屏幕 x 列号 × TILE屏幕 y 行号 × TILE。行号越大越靠下正好和 EasyX 的 y 轴向下一致。二维数组的优点在于关卡结构是可视化的你在文本里能直接看出断层、阶梯和空档改关卡等于改数字缺点是不能表达斜坡和不规则地形真要做斜坡得额外引入一类「斜坡图块」在碰撞里单独写斜率判断。TILE 这个参数直接决定角色比例。马里奥角色大约占两格高度所以 TILE 取 50 时角色矩形建议宽 3040、高 7080跑起来才协调。TILE 太小比如 25会把碰撞误差放大踩砖边时经常卡一下太大80 以上会让角色显得很小。新项目统一从 50 起步等手感稳定了再动。3.2 AABB 碰撞检测与移动顺序穿墙和卡砖的根源在这碰撞检测的选型不用纠结像素级碰撞最精确但你不可能手工维护马里奥每一帧的像素轮廓Tile 级碰撞是本次仿制真正该用的方案。原理是 AABB——把角色和砖块都视为轴对齐矩形判断两个矩形是否重叠。struct Box { float x, y, w, h; }; // 左上角坐标 宽高 bool AABB(const Box a, const Box b) { // 两个矩形在 x 和 y 方向同时有交集才算碰撞 return a.x b.x b.w a.x a.w b.x a.y b.y b.h a.y a.h b.y; }四行判定本身没什么可改的真正决定手感的是调用方式分轴移动、分轴检测。常见错误是把 x 和 y 一起更新再统一检测一次——角色斜向撞到墙角时程序没法判断该回退 x 还是回退 y表现出来就是卡砖和穿墙。float speedX 4; // 水平速度 float speedY 0; // 垂直速度 // 先水平移动水平撞到砖块就回退 x 到砖块边缘 player.x speedX; if (撞到砖块) { if (speedX 0) player.x 砖块左边 - player.w; else player.x 砖块右边; speedX 0; } // 再垂直移动垂直撞到砖块就吸附到砖块上下沿 player.y speedY; if (撞到砖块) { if (speedY 0) player.y 砖块上边 - player.h; // 落地 else player.y 砖块下边; // 顶头 speedY 0; }顺序必须是先水平后垂直反过来会出现贴着墙往下滑的怪手感。回退时直接赋值到砖块边缘而不是「减去这次的位移增量」是为了杜绝下一帧仍重叠造成的抖动。检测范围不需要全图扫描只检查角色周围的 3×3 格子就够了地图拉长到几百列之后这个习惯能省下大量无效计算。提示分轴检测的顺序不要反过来。先处理水平再处理垂直否则下落时贴着墙面会有明显的吸附感。3.3 重力与跳跃马里奥的「轻」是参数调出来的重力不需要引擎两句搞定每帧给垂直速度加一个常量然后用速度更新 y。y 轴向下为正所以起跳瞬间垂直速度是一个负数。float vy 0; // 垂直速度向下为正 bool onGround false; // 是否站在砖块上 const float GRAVITY 0.5f; // 重力加速度 const float JUMP_VY -12.5f; // 起跳初速度 // 按下跳跃键且在地面时给一个向上的初速度 if ((GetAsyncKeyState(VK_SPACE) 0x8000) onGround) vy JUMP_VY; vy GRAVITY; // 每帧重力累加到速度 player.y vy; // 速度驱动位置 if (撞到地面) { vy 0; onGround true; }这套参数可以直接抄抄完按下面的表微调参数推荐范围效果说明GRAVITY0.40.6越大下落越猛落点越难预判JUMP_VY-11-13绝对值越大跳得越高最大跳跃高度约 v²/(2g)-12.5 与 0.5 组合约 156 像素156 像素差不多是三格砖块的高度这正是马里奥能跳上两层台阶、又不至于蹦到三层之上的关键。JUMP_VY 小于 -16 会变成离谱高跳大于 -9 连一格砖都上不去。调手感别靠感觉把这两个参数提成常量每次改完跑一段三级台阶测试关几秒就能判断合不合适。进阶一点的仿制还会做「按多久跳多高」跳跃键一旦松开就把 vy 乘以一个 0.5 左右的衰减系数形成短按低跳、长按高跳的原版手感。4. 角色帧动画与敌人 AI从贴图切帧到横向卷轴的进阶代码地图和碰撞解决的是「能不能走」动画和敌人解决的是「像不像游戏」。马里奥的质感来自帧动画的节奏感和敌人巡逻的机械感两段代码都不长但细节差一点观感就差很多。4.1 loadimage 与精灵帧切换走路动画的两种实现EasyX 里图片用 IMAGE 对象管理loadimage 负责从文件加载。走路动画无非是「每隔几十毫秒换一帧」四帧循环就够。#include graphics.h IMAGE imgWalk[4]; // 四帧走路贴图 // 加载并统一缩放到 40x70省去手动改图 loadimage(imgWalk[0], _T(walk_0.png), 40, 70); loadimage(imgWalk[1], _T(walk_1.png), 40, 70); loadimage(imgWalk[2], _T(walk_2.png), 40, 70); loadimage(imgWalk[3], _T(walk_3.png), 40, 70); int frame 0; // 当前帧索引 DWORD lastAnim 0; // 上次切帧的时间 // 每 120ms 切一帧四帧循环成走路 if (GetTickCount() - lastAnim 120) { frame (frame 1) % 4; lastAnim GetTickCount(); } // 绘制到角色当前位置 putimage(player.x, player.y, imgWalk[frame]);切帧时间不是固定值普通行走 120ms 合适跑动状态压到 80ms 更有急促感跳跃状态干脆不切帧固定显示一张起跳图。也就是说动画帧要跟着状态机走而不是无脑按时间循环。loadimage 的后两个参数会把素材缩放成 40×70注意如果原图比例不是 1:1.75 左右强行缩放会把人拉变形素材本身比例正常时这个参数才划算。_T()宏是为了兼容 Unicode 字符集项目字符集没选 Unicode 的话带_T的代码编译直接报错。左右翻转是个容易踩的坑EasyX 的 putimage 并不自带镜像参数常见做法是素材准备左右两套或者加载后自行翻转生成镜像 IMAGE。不要指望传负宽度解决问题不同版本行为不一致。还有一类报错是图片路径问题loadimage 的工作目录是项目目录图片放在与 .cpp 相同的目录里最省心。4.2 敌人巡逻 AI 与横向卷轴相机两段值得反复抄的代码蘑菇怪的 AI 只需要两行逻辑往前走碰墙掉头。它不追人、不跳只按固定方向巡逻。这是平台跳跃敌人 AI 的起点后面加追踪、加飞行都在这个骨架上扩展。struct Enemy { float x, y; int dir; // 1 向右-1 向左 int alive; // 0 表示被踩扁 }; void UpdateEnemy(Enemy e, float speed) { if (!e.alive) return; // 踩扁后不再更新 e.x e.dir * speed; // 沿当前方向移动 // 碰到砖块或走到地图边缘就掉头 if (碰到砖块(e) || 即将走出地图边界) e.dir -e.dir; }敌人碰撞直接复用第三章的 AABB只是把角色矩形换成敌人的矩形。敌人和角色必须共用同一套 TILE 比例否则画面上会出现敌人大过砖块的违和感。被踩中时置 alive 0 并从绘制里跳过比从对象数组里删除更稳妥——删除会改变数组下标遍历时容易跳过后面的敌人。横向卷轴是让仿制品「一眼像成品」的关键原理却极其简单所有物体的世界坐标不变绘制时统一减去一个相机偏移量。// 相机偏移让主角维持在窗口水平中心附近 int cameraX player.x - 400; if (cameraX 0) cameraX 0; // 第一屏不滚动 // 绘制砖块和角色时全部减去 cameraX solidrectangle(col * TILE - cameraX, row * TILE, (col 1) * TILE - cameraX, (row 1) * TILE); putimage(player.x - cameraX, player.y, imgWalk[frame]);cameraX 取 player.x - 400等于让主角永远落在窗口约 400 像素处。这个值和窗口宽度一半对齐时手感最稳设成 0 画面就不滚。这里有一条铁律要守住碰撞检测用世界坐标绘制用减去 cameraX 后的屏幕坐标。很多仿制项目最后砖块乱跳、角色错位都是把屏幕坐标拿去做碰撞了。地图很长时二维数组全部驻留内存也不划算第六章会给关卡外置的方案。5. 超级马里奥仿制避坑指南4 个让 EasyX 项目翻车的典型问题这章写给已经能编译、但玩起来不对劲的人。四个问题都是我在帮人调这类仿制时反复遇到的按出现频率排序每条按现象、原因、解决三步说清。5.1 画面闪烁、拖影严重现象角色和砖块边缘抖动快速移动时拖出半透明残影整体观感像幻灯片。原因没有使用 BeginBatchDraw/FlushBatchDraw或者 FlushBatchDraw 放到了错误位置也可能是循环体内没有先 cleardevice上一帧内容没清掉新旧画面叠在一起。解决BeginBatchDraw 放主循环开始前EndBatchDraw 放主循环结束后循环体内只做绘制和一次 FlushBatchDraw。检查清屏是否在每帧绘制之前确认 FlushBatchDraw 在 Sleep 之前调用——先睡再刷屏等待时间会被算进画面显示体感掉帧。如果残影只出现在角色身上多半是 putimage 的背景没有做成透明黑色底框把上帧的残影盖住了做透明贴图时要先处理素材抠底。5.2 穿墙与卡砖现象速度调大后角色偶尔穿过砖块下落到砖边时卡在侧面上下抖动。原因单帧位移接近或超过砖块厚度时角色这一帧的位置已经「越过」砖块AABB 检测不到重叠。卡砖抖动是回退时没吸附到边缘而是按原位移反弹下一帧又嵌进砖块形成振荡。解决把水平速度上限控制在 TILE/3 以内TILE 取 50 时速度建议 58坚持「先水平移动并检测再垂直移动并检测」的顺序回退时直接赋值到砖块边缘坐标而不是减去位移增量。改完速度记得同步调整跳跃的水平位移量否则跳得越快越容易穿墙。5.3 按键失灵或角色自己跑现象松开方向键角色还在走跳跃偶尔没反应按住空格一直连跳。原因GetAsyncKeyState 没与 0x8000 做位与把历史按下状态也当成了当前状态跳跃逻辑用了「按住触发」而非「按下沿触发」按住空格自然变成连跳。空中不允许起跳不是 bug是设计但如果想要二段跳需要在空中重置跳跃计数。解决所有按键统一写成(GetAsyncKeyState(key) 0x8000)跳跃改为按下沿检测——记录上一帧该键状态当前帧从「未按」变「按下」才算一次有效跳跃。这招对顶砖块、发射子弹这类「只触发一次」的逻辑同样适用值得记在笔记里。5.4 图片加载失败与窗口大小异常现象窗口能开角色却是黑块或者空白有的机器上窗口大小和设置不一致。原因loadimage 的工作目录和源码目录不一致相对路径找不到文件图片格式不是 EasyX 支持的 BMP 或常见 PNG 变体。窗口异常多半是系统显示缩放把逻辑分辨率放大了initgraph 的参数被 DPI 缩放乘了一道。解决图片统一放到与 .cpp 相同的项目目录用相对路径加载素材转成 24 位 BMP 或标准 PNG。窗口缩放问题在项目属性里把 DPI 缩放设为由应用程序控制窗口就能按 initgraph 的参数严格显示。这个坑很隐蔽换一台显示器就出现排查时先看系统缩放再看代码。6. 从复现到魔改存档点、关卡文件外置与帧率验证方法把前面几章拼起来你已经有了一个「能玩一关」的仿制品。但要交作业或者想拿到面试桌上讲还差三件小事存档点、关卡外置、帧率验证。每件都不难但每件都能让作品完成度上一个台阶。6.1 存档点给死亡惩罚一颗后悔药没存档的仿制游戏死后从第一关重来演示时很容易尴尬。最简存档是把关键状态存成一个结构体内存里存一份就够用。struct SaveData { float x, y; int level; int lives; }; SaveData save; // 碰到旗杆或终点时记录当前状态 save.x player.x; save.y player.y; save.level currentLevel; save.lives lives; // 角色死亡时直接读回 player.x save.x; player.y save.y;参数说明内存存档足够单次演示想要「关掉程序再打开还在」就把 save 按文本写入文件下次启动时解析三个数字。存档点位置建议放在每关第一个高台阶之后那是玩家最容易掉血的区域后悔药给到位别人才愿意继续试你的关卡。6.2 关卡外置与帧率验证让作品经得起复现map 数组写死在代码里改一次关卡要重编译一次。把地图存成文本文件每行 16 个数字、逗号分隔启动时用 ifstream 读进数组你立刻拥有一个最简关卡编辑器。帧率验证别用 GetTickCount毫秒精度不够用 clock() 或 QueryPerformanceCounter连续跑 300 帧取平均耗时单帧低于 16ms 就算稳定。验证清单踩砖边缘不抖动连跳 10 次不穿墙从最高处坠落不掉出地图底部按住方向键同时跳跃不出现位移漂移落地瞬间垂直速度清零不出现「弹簧脚」。最后说句实在话我做这类仿制时也曾在碰撞上栽过跟头后来老老实实分轴移动、分轴检测才发现重力本质就是速度的累加。养成「先更新逻辑、后统一绘制」的习惯以后换任何框架都不吃亏。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

云优化 ABAP 语言,如何用语法与 API 边界守住企业系统的升级稳定性

云优化 ABAP 语言,如何用语法与 API 边界守住企业系统的升级稳定性

在 SAP 官方的 RAP100 实践教程中,一套 Travel 应用从自定义数据库表开始,经过数据模型、行为定义、服务定义和服务绑定,最终可以在 SAP Fiori elements 中预览。我们仍然使用熟悉的 ABAP 编写代码,仍然处理业务数据,仍然需要计算金额、校验日期和维护状态。不过,进入这套…

2026/10/18 15:17:00 阅读更多 →
F2FS NAT与SIT元数据布局原理及性能调优实战

F2FS NAT与SIT元数据布局原理及性能调优实战

1. 为什么F2FS的NAT和SIT布局是性能瓶颈的“隐形开关”在某高校存储系统实验室做文件系统优化时,我接手过一个典型问题:一块标称500MB/s顺序读写的NVMe SSD,在F2FS格式化后,实际跑fio随机小文件写入时吞吐量卡在80MB/s上下&#x…

2026/10/18 15:17:00 阅读更多 →
读数据安全架构设计与实践07可审计

读数据安全架构设计与实践07可审计

读数据安全架构设计与实践07可审计1. 可审计1.1. 可审计(Auditable)就是记录所有的敏感操作,并可用于事件追溯1.2. 审计功能主要体现在操作日志方面1.2.1. 记录下来的内容,即通常所说的操作日志1.3. 确保能够通过操作日志来还原事…

2026/10/18 15:17:00 阅读更多 →

最新新闻

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp gdsdecomp(Godot RE Tools)是一个面向 Godot 引…

2026/10/18 16:15:27 阅读更多 →
Convert to it PriorityQueue 拆解

Convert to it PriorityQueue 拆解

Convert to it PriorityQueue 拆解 【免费下载链接】convert Truly universal online file converter 项目地址: https://gitcode.com/GitHub_Trending/convert7/convert Convert to it 敢承诺"任何格式转任何格式",底气来自在格式图上做路径搜索。…

2026/10/18 16:15:27 阅读更多 →
Teamcenter管理员运维地图:备份、日志、权限与升级实战

Teamcenter管理员运维地图:备份、日志、权限与升级实战

简介:这份西门子Teamcenter管理员操作手册,面向TC系统管理员及PLM项目实施人员,系统梳理Teamcenter 11/12/13环境下的配置、管理与维护方法。手册从管理员职责切入,重点展开服务器端操作:业务建模器的模板项目创建与部…

2026/10/18 16:15:27 阅读更多 →
Pandas DataFrame排序与排名:sort_values和rank的实战区别与用法

Pandas DataFrame排序与排名:sort_values和rank的实战区别与用法

在数据分析里,排序和排名几乎是每天都要碰的操作,但很多人用着用着就混了。DataFrame的sort_values和rank,看名字都带“排”,实际干的活完全不同:一个是把整张表重新摆顺序,另一个是给每个数据打分定名次。…

2026/10/18 16:15:27 阅读更多 →
MCP异步处理破解AI读取千万级Excel超时难题

MCP异步处理破解AI读取千万级Excel超时难题

遇到一个千万级的 Excel,直接丢给 AI 分析,大概率是等到天荒地老之后,换来一句冷冰冰的“读取超时”。这个坑我踩过不止一次。后来我把方案换成了基于 MCP 的异步处理,把“一次性读完整张表”改成“提交任务、轮询进度、分批拿结果…

2026/10/18 16:15:27 阅读更多 →
医疗知识图谱问答系统开发实战:数据清洗、Neo4j入库与Flask部署

医疗知识图谱问答系统开发实战:数据清洗、Neo4j入库与Flask部署

简介:一套基于Python的医疗知识图谱知识问答系统课程设计资源包,适合知识图谱与问答方向的初学者,帮助理解医疗实体关系建模、规则式对话流程及问句查询解析。压缩包共58个文件,约20MB,核心内容涵盖设计报告、源代码、…

2026/10/18 16:14:26 阅读更多 →

日新闻

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