简介这是一份基于 MFC 开发的简单迷宫游戏完整工程源码面向正在学习 Windows 程序设计、C 面向对象编程与 MFC 框架的初学者及课程设计参考者。项目围绕二维迷宫地图的创建、显示与交互展开涉及文档/视图结构、窗口与消息处理、菜单控件、GDI 图形绘制以及 DFS/BFS 路径搜索等知识点可帮助读者理解如何把 MFC 界面逻辑与游戏数据结构结合起来。压缩包共 45 个文件约 2.13MB包含 h/cpp 源码、rc 资源脚本、ico/bmp/png 图像与工程配置文件并附 exe、dsp/dsw 工程及 ReadMe 说明便于直接编译运行和对照分析。目前已有 379 人学习。资源中提供迷宫思路说明与分步骤示意图读者可据此拆解玩家类、地图存储、移动判定和界面刷新流程也可修改迷宫布局进行二次练习适合作为 MFC 入门小项目与课程设计素材。1. 迷宫游戏入门MFC 做的这个「小东西」到底是什么刚学完 C 的变量、循环和数组很多人会卡在同一个地方语法都懂但写不出一个能看见画面的东西。这个用 MFC 做的简单迷宫游戏就是来帮新手解决这个问题的——它打开一个 Windows 窗口里面画着一张迷宫你按方向键小人走一格撞墙走不动走到出口弹出通关提示。整份工程只用到最基础的 C 语法加一点 MFC 的画图接口零基础也能一行一行读懂。它适合谁适合刚学完语法想练手、想做课程设计、又怕一上手就被大工程劝退的人。读完这篇你会知道它是什么、为什么值得练、第一个窗口怎么画出来、第一步怎么迈。2. 为什么值得从它入手MFC 迷宫游戏能给你的四样东西很多人学 C 的方式是先背语法再找项目结果语法背了一堆打开编辑器还是不知道从哪下手。MFC 迷宫游戏的好处在于它足够小小到两天能读懂全部代码又足够完整完整到能弹窗口、响应按键、显示结果跑起来像个真东西。下面四个理由是我建议新手先拿它练手的原因。2.1 学 MFC 最怕「没有画面」迷宫恰好从头到尾都有画面很多人刚接触 MFC 时的第一印象是枯燥一堆 CWnd、CDC、CRect 的类名看不见摸不着。如果一上来就去啃控件封装、文档视图结构很容易三天就放弃我自己第一次翻文档就是这么放弃的。迷宫游戏不一样它从第二行代码开始就有画面——你画一个方格屏幕上就多一个方格你把墙的颜色从深灰改成深蓝运行起来立刻能看见。这种「改一下就能看见」的反馈是新手能坚持下去最关键的东西。程序员的成就感不是来自读懂了多少概念而是来自「我写的这行代码在屏幕上发生了作用」。迷宫这个题材天生适合做这件事它的视觉结果非常直接一格就是一格不需要理解复杂的渲染流程也不用担心画面太复杂看不出来。更实际的一点是画面能帮你调试。逻辑写错了控制台程序只能靠打印字符串猜而迷宫写错了你能一眼看到小人站到了墙里、地图少画了一行、格子大小对不上。看得见的错误比看不见的错误好改十倍。2.2 一个游戏把 C 的零散语法串成一条线二维数组、for 循环、if 判断、函数、类的成员变量——这些语法单独学的时候像一盘散沙学完就忘。在迷宫项目里它们各自有明确的位置二维数组存地图双重 for 循环把地图一格一格画出来if 判断拦住撞墙和越界成员变量记住玩家当前站在第几行第几列。你不再是为了学语法而学语法而是为了「让小人不穿墙」被迫去理解边界判断为了「让地图好看一点」被迫去算坐标。这种带着目的去用语法的方式记得住也用得上。我见过不少新手能背出数组下标从 0 开始但一到要算「第 3 行第 5 列的格子画在屏幕哪个位置」就懵了——这个项目会把这个问题直接摆到你面前。顺带一提它还会逼你第一次认真面对「下标」和「像素」是两码事数组里说的是第几行第几列屏幕上说的是多少像素。这个区分搞明白了后面学任何图形界面都不会再绕晕。2.3 代码量小、反馈快改一个数字就能看见结果整个迷宫的核心逻辑大概一两百行其中真正需要你理解的不到一百行。你可以把格子从 30 像素改成 50 像素把地图从 10×10 改成 20×20把墙的颜色换一换甚至把方向键换成 WASD。每一次改动都不需要理解整个工程改完按一下运行就能看到结果。这种低风险试错对零基础特别重要。新手最怕的往往不是难而是改坏了不知道怎么恢复——一旦陷入「程序跑不起来了但不知道是哪一行的问题」学习热情基本就断了。迷宫项目的好处是它的结构足够扁平地图、绘制、按键三块改动基本互不影响。你把绘制改坏了地图数据还在你把按键改坏了画面照样能画出来。我一般建议新手这么练先原样跑通然后每次只改一个地方改完立刻运行。这个习惯比看懂多少代码都值钱。2.4 它是一个「最小完整项目」能写进简历也能当课设底稿课程设计、简历、面试聊项目最尴尬的局面是「我学过 C但没做过东西」。这个迷宫虽然简单但它具备一个项目的完整骨架有界面、有数据结构、有输入处理、有结束条件。你能把它讲清楚——地图怎么存、按键怎么响应、怎么判断撞墙、通关怎么判定——就已经能回答「你做过什么」这类追问了。而且它是个很好的底稿。你可以在此基础上加计时、加步数统计、加随机生成迷宫、加自动寻路提示每加一个功能这个项目就厚一分。很多人的第一个像样项目就是从这种「小但完整」的东西长出来的。3. 动手前先认四个概念MFC、地图、绘制、消息在敲第一行代码之前有四个概念得先在脑子里有个位置。不用背看懂大意就行剩下的边写边补。这一章我尽量用生活化的说法讲遇到术语就用类比绕过去。3.1 MFC 到底是什么一套把窗口按钮打包好的 C 类库你可以把写 Windows 窗口程序想象成盖房子。最原始的方式是自己烧砖、和水泥、架钢筋——那是直接调用系统接口几百行代码才能弹出一个空窗口。MFC 相当于别人已经替你盖好的房子墙、门、窗、水电都装好了你只要决定墙上挂什么画、家具摆在哪。具体说MFC 是一套 C 的类库。它把「窗口」「画布」「按钮」「对话框」这些东西都封装成了类窗口是 CWnd 及其子类画布是 CDC矩形区域是 CRect。你要在窗口上画东西就拿到一个 CDC 对象然后调它的方法。你不需要知道系统底层怎么把像素送到屏幕上只管说「在这个矩形里填这个颜色」。对新手来说这个封装是好事它把门槛降到了「会用类和函数」的程度。代价是你要额外记一些类名和方法名但这份工程里用到的屈指可数撑死十几个边写边查完全够用。提示MFC 是 C 的不是一门新语言。你学的 if、for、数组、类在这里一行都不浪费。3.2 迷宫只有三个零件地图数据、绘制、输入把迷宫拆开其实就三件事地图数据迷宫长什么样存在一个二维数组里。约定 1 是墙0 是路简单粗暴。绘制把二维数组翻译成屏幕上的方格。第 row 行第 col 列画在坐标 (col × 格子宽, row × 格子高) 的位置。输入收到方向键算出「下一步要去哪个格子」判断能不能走能走就更新玩家坐标。整个项目从头到尾都在围着这三件事转。你以后加计时、加随机生成、加寻路提示也都是在其中某一块上加东西不会打乱结构。新手最怕的就是「不知道这段代码属于哪一部分」把这三个零件记住看代码时心里就有地图了。这里有个特别容易搞混的点我提前说清楚数组是「行在前、列在后」也就是 map[行][列]而屏幕坐标是「x 在前、y 在后」x 是水平方向列y 是垂直方向行。所以画图的时候要写成 x 列 × 格子宽y 行 × 格子高。写反了迷宫就会整个转过来这个坑几乎人人踩过一次。3.3 消息映射为什么你没写 main 函数程序照样跑起来平时写控制台程序都有一个 main 函数从第一行跑到最后一行就结束了。窗口程序不能这样它得一直待在那儿等等你按键等窗口被别的窗口挡住之后需要重画等鼠标点上来。这套「等」的机制就是消息。系统把发生的每件事打包成一条消息放进队列MFC 内部有个入口函数不停地取消息然后按类型分发给对应的处理函数。你要做的就是告诉它当收到「要重画」这条消息时请调用我写的 OnPaint。这个「告诉」的过程就是消息映射落到代码上一般是三处头文件里声明afx_msg void OnPaint();cpp 文件的消息映射表里写一行ON_WM_PAINT()然后实现这个函数。三处对上号消息才认得路。注意三处缺一处都会导致「函数写了但没被调用」这是新手最常见的空白窗口原因第 5 章会细讲。3.4 第一个例子在窗口里画出 10×10 的方格先别管小人先把地图画出来。下面这段代码放在主窗口类的 OnPaint 里作用是遍历一个 10×10 的二维数组是墙就填深灰是路就填白色。// 主窗口的绘制函数窗口每次需要重画时都会走到这里 void CMazeDlg::OnPaint() { CPaintDC dc(this); // 拿到本窗口的画布构造时自动开始绘制 const int cell 30; // 每个格子 30 像素见方 // 1 是墙0 是路。这里先写死一张 10x10 的小地图 int map[10][10] { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,1,0,1,1,0,1}, {1,0,1,0,0,0,0,1,0,1}, {1,0,1,1,1,1,0,1,0,1}, {1,0,0,0,0,1,0,1,0,1}, {1,1,1,1,0,1,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; for (int row 0; row 10; row) { for (int col 0; col 10; col) { // 把「第几行第几列」换算成屏幕上的像素矩形 CRect r(col * cell, row * cell, (col 1) * cell, (row 1) * cell); if (map[row][col] 1) { dc.FillSolidRect(r, RGB(40, 40, 40)); // 墙深灰 } else { dc.FillSolidRect(r, RGB(255, 255, 255)); // 路白色 } } } }逐块说一下。CPaintDC dc(this)是在告诉系统「我要开始画了」它构造时准备好画布析构时自动收尾你不用管。cell控制格子大小想放大迷宫就改这一个数。CRect的四个参数依次是左、上、右、下四个像素坐标所以(col 1) * cell就是这一格的右边界。FillSolidRect是填充矩形第二个参数是颜色RGB(40, 40, 40)是三个 0 到 255 的分量数值越大越亮。写完记得把三处消息映射对上号头文件声明、映射表加ON_WM_PAINT()、cpp 里实现函数。运行起来你应该能看到一张深灰色的迷宫墙围着一片白色的通道。4. 第一个能跑通的例子从空工程到方向键走格子上一章画出了地图这一章让小人真的动起来。整个流程分四步每步都能单独运行看结果别一口气全写完再跑出了问题会很难定位。4.1 第一步建一个能弹出窗口的 MFC 工程打开 VS新建项目在模板里找 MFC 应用项目名自己取一个。向导里有几步选择对新手最省事的组合是应用程序类型选「基于对话框」其余保持默认一路点完成。为什么选对话框而不是单文档因为对话框工程结构最简单它直接给你一个窗口资源和对应的类不用理解文档、视图、框架那一整套关系。对迷宫这种只有一个画面的东西对话框足够用而且代码量最少。建完先什么都别改直接按 F5 运行。你应该看到一个空的对话框弹出来。这一步的意义是确认开发环境没问题——如果连空窗口都跑不起来先解决环境别往下写。我第一次折腾的时候就跳过了这一步结果后面报错一堆排查了半天才发现是环境压根没配好。提示新建完先运行一次空工程这个习惯能帮你砍掉一半的「玄学问题」。4.2 第二步用一个二维数组当迷宫地图把地图从 OnPaint 里挪出来变成类的成员变量。原因很简单绘制要用它按键判断也要用它写在函数里的局部变量活不过一次绘制按键的时候就读不到了。// 写在主窗口类的头文件里作为成员变量 static const int ROWS 10; // 地图行数 static const int COLS 10; // 地图列数 static const int CELL 30; // 每格像素 int m_map[ROWS][COLS]; // 地图1 是墙0 是路 int m_playerRow 1; // 玩家当前所在行 int m_playerCol 1; // 玩家当前所在列 int m_steps 0; // 走了多少步static const int是给常量起名字好处是以后想改成 20×20只改这两行别处不用动。m_前缀只是表示「这是成员变量」不是语法要求但团队里一般这么写看着清楚。初始化放在对话框的OnInitDialog里把地图逐行填进去然后把玩家坐标设成起点。地图可以照着 3.4 那张写死也可以先用全 0 加一圈 1 的边框试手——先确认能画出来再慢慢把内部墙搭起来。自己一格一格画地图其实挺有意思画完跑一下看小人被卡住成就感很直接。4.3 第三步在 OnKeyDown 里改坐标让小人动起来按键处理的思路是「先算下一步再判断最后才移动」。这个顺序很重要反过来写就会穿墙。先加上按键响应函数用类向导添加 WM_KEYDOWN 的响应或者在属性面板里找到消息列表添加别手写容易漏掉映射那一行。// 方向键按下时被调用先算目标格子再判断能不能走 void CMazeDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { int nextRow m_playerRow; int nextCol m_playerCol; switch (nChar) { case VK_UP: nextRow - 1; break; // 上行号减一 case VK_DOWN: nextRow 1; break; // 下行号加一 case VK_LEFT: nextCol - 1; break; // 左列号减一 case VK_RIGHT: nextCol 1; break; // 右列号加一 default: CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags); // 不是方向键就还回去 return; } // 先挡边界走不出地图 if (nextRow 0 || nextRow ROWS || nextCol 0 || nextCol COLS) return; // 再挡墙地图上是 1 的地方不能进 if (m_map[nextRow][nextCol] 1) return; m_playerRow nextRow; // 校验通过才真正落地 m_playerCol nextCol; m_steps; Invalidate(); // 请求重画屏幕才会更新 CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags); }nChar就是按下的键值VK_UP、VK_DOWN、VK_LEFT、VK_RIGHT是系统定义的常量不用记数字。Invalidate()是在说「我这窗口脏了帮我重画一遍」它会间接触发 OnPaint所以画面才会变。然后是绘制部分在 3.4 那个循环之后把玩家画上去——一个红色的实心方块或者一个实心圆都行// 接在画完地图的循环后面把玩家画在最上层 CRect p(m_playerCol * CELL 4, m_playerRow * CELL 4, (m_playerCol 1) * CELL - 4, (m_playerRow 1) * CELL - 4); dc.FillSolidRect(p, RGB(220, 60, 60)); // 内缩 4 像素看起来像走在小路上这时候运行你会发现一个大概率翻车的情况按方向键毫无反应。不是代码写错了是对话框默认把方向键当成控件之间的导航键消息在更早的阶段就被吃掉了根本到不了 OnKeyDown。解决办法是重写预翻译函数把方向键提前截下来// 对话框默认拿方向键做控件导航这里先截住直接交给 OnKeyDown BOOL CMazeDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg-message WM_KEYDOWN pMsg-wParam VK_LEFT pMsg-wParam VK_DOWN) { OnKeyDown(pMsg-wParam, 1, 0); return TRUE; // TRUE 表示这条消息我处理了别再往下传 } return CDialogEx::PreTranslateMessage(pMsg); }这里用了个小技巧VK_LEFT到VK_DOWN这四个键值在系统里正好是连续的所以一个范围判断就能全部命中。返回TRUE是关键它相当于跟 MFC 说「这条我已经处理完了你别再往下发了」不返回的话会导致一次按键触发两次移动小人一次走两格。4.4 第四步加一句通关判定让它真的像个游戏到这一步小人能走了但没有目标玩起来还是像在测试。加个判定走到右下角就弹窗提示通关。// 放在 m_playerRow / m_playerCol 更新之后、Invalidate 之前 if (m_playerRow ROWS - 2 m_playerCol COLS - 2) { CString msg; msg.Format(_T(通关你一共走了 %d 步), m_steps); MessageBox(msg, _T(提示), MB_OK); }为什么是ROWS - 2而不是ROWS - 1因为地图最外圈是墙真正的可走区域到倒数第二行就结束了用- 1那个位置是墙永远走不到。这个小细节新手特别容易写错写错了表现就是「明明走到角落却没反应」。CString是 MFC 提供的字符串类Format的用法和printf类似%d会被m_steps替换掉_T()是把字符串包一层兼容不同的字符集设置。现在跑一遍窗口里有一张迷宫红色方块在左上角方向键一按就走一格撞墙纹丝不动走到右下角弹出步数。一个最小可玩的迷宫游戏到这儿就算成了。5. 新手避坑MFC 迷宫最容易翻车的五个地方下面这五条是我见过出现频率最高的问题几乎每个新手都会撞上至少两个。每条都按「什么现象、为什么、怎么修」说遇到了直接对号入座。5.1 现象窗口一片空白什么都没有原因通常是三选一。要么 OnPaint 函数写了但消息映射那一行ON_WM_PAINT()没加上函数压根没被调用要么绘制代码写在别的函数里比如写在OnInitDialog里——那时候窗口还没真正显示出来画了也白画要么画了但没触发重绘比如改了数据却没调Invalidate()。解决办法是按顺序检查三处头文件有没有afx_msg void OnPaint();声明cpp 的消息映射表里有没有ON_WM_PAINT()函数里有没有真的拿到CPaintDC并且在里面写绘制代码。再补一个常见情况绘制之前调用了基类的CDialogEx::OnPaint()某些样式下基类会把背景刷掉盖住你的图可以先注释掉那行试试。5.2 现象方向键按下去毫无反应原因就是 4.3 说的那个对话框把方向键当成控件导航键消息在PreTranslateMessage阶段就被拦截了OnKeyDown 收不到。这不是你代码写错了是对话框的默认行为。解决办法是重写PreTranslateMessage判断pMsg-message WM_KEYDOWN且按键在方向键范围内就自己调用 OnKeyDown 并返回TRUE。如果连这个都加了还是没反应检查两点对话框上是不是有按钮控件抢了焦点可以先SetFocus()到对话框本身以及调试器里确认 OnKeyDown 到底有没有被打断点没断点说明还有别的地方在拦。5.3 现象小人能穿墙或者一按就飞出地图原因基本都是「先移动后判断」代码里直接m_playerRow - 1然后再去检查那个位置是不是墙检查的时候人已经在墙里了这时候再回退也已经晚了半拍。另一种是只判断了墙没判断边界走到地图边缘之外程序读到数组外的内存表现就是画面乱掉或者直接崩。解决办法记住一个顺序先算nextRow/nextCol这种临时变量再判断越界再判断墙值全通过了才赋值给真实的玩家坐标。这个「临时变量」的写法看着啰嗦但它是唯一稳妥的顺序我自己踩过好几次才养成习惯。5.4 现象画面一闪一闪走一步闪一下原因是重绘分两步系统先把背景擦成一片单色再调用你的 OnPaint 画内容。两步之间有空档肉眼就看到了闪烁。地图越复杂、格子越多闪得越明显。最简单的解决办法是禁用背景擦除重写OnEraseBkgnd直接return TRUE;告诉系统「背景我不管了别擦」。因为迷宫每帧都会把整个客户区填满不存在擦不干净的问题。如果格子特别多还是闪再上双缓冲在内存里建一个CDC所有绘制先画到内存位图最后一次性贴到屏幕上。这个进阶做法可以放着以后再说先把OnEraseBkgnd加了八成就不闪了。5.5 现象自己电脑能跑换台电脑或换个人打开就一堆报错原因最常见的是字符集不一致。项目的字符集设置有的是 Unicode有的是多字节你的代码里如果混着写提示和_T(提示)换个设置就编译不过报的错还特别难看懂。解决办法是统一项目属性里把字符集固定成 Unicode代码里所有字符串字面量统一用_T(...)包起来。另一个原因是相对路径工程里如果引用了外部文件却用了绝对路径换台机器就找不到。改完记得把整个工程重新生成一遍别只点「运行」有时候旧的目标文件会骗你。6. 下一步学什么从「能走」到「会生成」的三步升级路线地图写死虽然能跑但玩两遍就腻了。真正的迷宫游戏地图应该是每次都不一样。下面这条路线是我觉得最顺的升级顺序每一步都能独立看到效果不会一口气把自己埋进去。阶段要学的东西怎么算过关第一步用深度优先搜索随机生成迷宫每次运行地图都不同且从起点一定能走到终点第二步用广度优先搜索算最短路径按一下提示键能高亮出一条通往出口的路第三步加计时、步数、多关卡通关后显示用时和步数能接着玩下一关第一步的关键是理解「生成」和「求解」是两件事虽然用的都是搜索但方向相反。生成迷宫时你从起点出发随机挑一个没走过的方向往前凿凿不动了就回退这就是深度优先。新手最容易犯的错是忘了记录「哪些格子走过了」结果程序在原地死循环。第二步是广度优先从玩家位置一层一层往外扩第一次碰到出口时停。血泪经验光记录「走没走过」不够还得额外存一个「我是从哪个格子过来的」否则你只知道能到出口却拼不出那条路。这个「记录前驱」的技巧值得到时候专门花半小时搞明白。第三步最轻松加个计时器、把步数显示在窗口标题上就行属于纯体力活放在最后做刚好。我现在的习惯是不管多小的项目都强制走一遍「先把画面画出来、再让一个东西动起来、最后才加功能」这个顺序。刚开始写迷宫的时候我心急想一次性把生成、寻路、计时全写完结果编译报错三十多个一条都看不懂硬熬了一晚上还是推倒重来。从那以后我每次开新工程都强制走一遍这个小顺序先让它跑起来再让它变好。这份迷宫工程你可以直接下载下来跑通跑通之后照着上面三步改改完就是你自己的项目了。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Agent判断器:Laya规则引擎与Jev轻量模型选型实战 1. 项目概述:为什么Agent需要一个“判断器”?最近在好几个团队的Agent开发现场都遇到同一个问题:模型输出看起来很流畅,但关键决策经常出错。比如客服Agent把“退款申请”归类成“物流咨询”,或者运维Agent在告警风暴里… · 2026/11/5 7:39:59
Jev 深度解析:TypeSafe、SDK 与 API 如何构建 AI 应用接入层 1. Jev 到底是什么:从热搜词里还原它的真实面目最近一段时间,不管你是刷技术社区、翻聊天群,还是看各种工具推荐,大概率都撞见过“Jev”这个词。它出现的姿势很杂:有人问“jev模型官网在哪”,有人搜“jev密… · 2026/11/5 12:56:49
USB-HID连接五阶段深度解析:从复位到轮询的硬核握手过程 1. 这不是插上线就完事——USB-HID连接过程到底在后台干了什么?你有没有遇到过这样的情况:把一个机械键盘插进电脑,键盘灯亮了,按键也能用,但系统托盘里却没弹出“新硬件已识别”的提示;或者换一台老笔记本… · 2026/11/5 2:02:36
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07