C语言写WSAD控制移动:从键盘监听到角色位移的完整实现
1. 从零理解控制台 WSAD 移动键盘监听与坐标刷新到底怎么配合在 Windows 控制台里用 C 语言写一个能用 WSAD 控制角色移动的小程序是很多人学完printf、scanf之后第一个有交互感的项目。它看起来简单但真正动手时会发现几个绕不开的问题scanf要按回车才响应、画面刷新会闪屏、坐标算错角色会跑出边界、getch在某些环境里读不到方向键。这篇就把这条链路完整走一遍从键盘输入捕获、坐标结构体设计、移动函数封装到画面刷新和逐键验证最后给一份按了没反应的排查清单。先说清楚这个程序是什么它是一个运行在 Windows 控制台cmd 或 Windows Terminal 的 cmd 配置里的字符版移动 Demo用conio.h的kbhit/getch做无回显、免回车的按键监听用windows.h的SetConsoleCursorPosition把光标挪到指定坐标再打印字符从而模拟角色在动。适合谁刚学完 C 语言基础语法、想做一个能立刻看到效果的小项目的人也适合想理解游戏循环 输入 渲染这套最朴素模型的人。它不需要图形库不需要额外依赖一个.c文件加一个编译器就能跑。核心检索词就是C语言 WSAD 控制移动。整条链路可以拆成四件事监听按键谁被按下了、更新坐标角色该往哪走、刷新画面把新位置画出来、循环驱动让上面三步持续发生。很多人卡住不是因为某一步难而是这四步的配合方式没理顺——比如用scanf做监听就永远得不到按下即移动的手感比如每次都system(cls)全屏清空就会闪得眼睛疼。下面按可跟做的顺序展开代码都能直接编译。在开始写之前先明确一个前提本文所有代码针对Windows 控制台编译器用 MinGW-w64 的gcc或 MSVC 的cl都行。如果你用的是 VS Code MinGW直接在终端里gcc main.c -o main.exe即可。conio.h是 Windows 平台特有的Linux/macOS 下没有这点后面排障会再提。2. TaoToken 前置准备给后续接入模型辅助调试留好入口写这个 Demo 本身不需要任何网络服务纯本地编译就能跑。但实际开发中你大概率会遇到这些场景想让模型帮你解释SetConsoleCursorPosition的参数含义、想让它把这段代码改成支持方向键、想让它帮你排查为什么getch读不到输入。这时候有一个稳定的模型调用入口会省很多事。我平时用 TaoToken 来做这类辅助它的定位是统一的模型 API 接入层把不同模型的调用方式收敛成一套兼容格式省得每个模型都去翻一遍文档。它的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个地址不加 UTM 参数。如果你只是想快速问几个 C 语言问题直接用模型对话页面就行https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。如果你打算长期写代码、让模型持续帮你改这段移动逻辑可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。需要自己管理调用凭证的话控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。这里要强调一点TaoToken 是模型调用的接入层不是编辑器也不是编译器。你的 C 代码还是在本地写、本地编译、本地运行。它的作用是当你在写这段 WSAD 移动逻辑卡住时能有一个地方把报错信息、代码片段贴过去问。比如你遇到undefined reference to SetConsoleCursorPosition或者getch在某个终端里行为异常都可以拿它来辅助定位。如果你用的是 Claude Code 这类命令行编码工具接入时通常需要三件套Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiAPI Key 从上面的 API Keys 页面生成Model ID 按你实际要用的模型填。这三样缺一不可只填 Base URL 不填 Key 会直接 401。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各客户端的配置示例。Claude Code 相关的说明在 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。为什么在写这个 Demo 的教程里要提这个因为按了没反应这类问题很多时候不是代码逻辑错而是环境、终端、编译选项的问题靠搜索引擎翻半天不如直接把现象描述清楚问一下。把工具准备好后面排障会快很多。下面进入正题先写最核心的键盘监听和坐标更新。3. 可复制配置kbhit/getch 监听 坐标结构体 移动函数完整代码这一节给出一份可以直接编译运行的完整代码然后逐块拆解。先看整体结构再讲每个函数为什么这么写。#include stdio.h #include windows.h #include conio.h // 坐标结构体把 x/y 打包方便传参和扩展 typedef struct { int x; int y; } Point; // 把光标移动到指定坐标 void gotoxy(int x, int y) { HANDLE hOut GetStdHandle(STD_OUTPUT_HANDLE); COORD pos { (SHORT)x, (SHORT)y }; SetConsoleCursorPosition(hOut, pos); } // 设置控制台文字颜色 void setColor(int color) { HANDLE hOut GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut, color); } // 隐藏光标避免闪烁干扰视觉 void hideCursor() { HANDLE hOut GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO info; GetConsoleCursorInfo(hOut, info); info.bVisible FALSE; SetConsoleCursorInfo(hOut, info); } // 根据按键更新坐标返回是否发生了移动 int updatePosition(Point *p, char key) { switch (key) { case w: case W: p-y - 1; return 1; case s: case S: p-y 1; return 1; case a: case A: p-x - 2; return 1; case d: case D: p-x 2; return 1; default: return 0; } } // 擦除旧位置在原坐标打印空格 void eraseAt(Point p) { gotoxy(p.x, p.y); printf( ); } // 在新位置绘制角色 void drawAt(Point p) { gotoxy(p.x, p.y); setColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); printf(O); } int main() { Point player { 20, 10 }; // 初始位置 Point old; // 记录上一帧位置 char key; hideCursor(); setColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); gotoxy(20, 5); printf(使用 WSAD 控制移动按 Q 退出); drawAt(player); while (1) { if (_kbhit()) { // 有按键才处理 key _getch(); // 无回显读取 if (key q || key Q) break; old player; // 记住旧位置 if (updatePosition(player, key)) { eraseAt(old); // 擦掉旧的 drawAt(player); // 画新的 } // 状态栏显示当前坐标 setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); gotoxy(40, 20); printf(坐标: (%d, %d) , player.x, player.y); } Sleep(10); // 降低 CPU 占用 } setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); gotoxy(0, 22); printf(已退出。\n); return 0; }编译命令MinGW-w64gcc main.c -o main.exeMSVC 的话cl main.c现在逐块解释关键点。为什么用_kbhit_getch而不是scanfscanf是行缓冲的你必须敲回车它才返回而且会在屏幕上回显你输入的字符。做实时移动你需要的是按下即响应、不回显。_kbhit()检查当前是否有按键在等待有就返回非零_getch()立刻取走这个字符且不显示。两者配合就是标准的控制台实时输入模型。注意在较新的 MSVC 里kbhit/getch被标记为弃用推荐用带下划线的_kbhit/_getch功能一样。MinGW 下两者都能用。坐标结构体Point的价值。一开始你可能觉得用两个int x, y就够了但当你要写eraseAt、drawAt、updatePosition这些函数时每次都要传两个参数很容易传错顺序。打包成结构体后updatePosition(player, key)一眼就能看懂是更新 player 的坐标。而且后面如果要加角色朝向血量等属性直接往结构体里加字段就行函数签名不用大改。updatePosition为什么返回 int它返回这次按键是否真的导致了移动。这样主循环里就能判断只有移动了才需要擦除旧位置、绘制新位置。如果按的是无关键比如空格就不做任何重绘避免无谓的闪烁。这是一个很小的设计但能让画面稳定很多。横向步长为什么是 2因为控制台字符是宽大于高的一个字符格在视觉上大约是 1:2 的比例。如果 x 和 y 都每次加 1横向移动看起来会比纵向慢一半手感很怪。所以横向用 2、纵向用 1视觉速度才接近一致。这是控制台字符游戏的一个经验值你可以自己调。擦除与重绘的顺序。先eraseAt(old)再drawAt(player)这是局部刷新的核心。相比system(cls)全屏清空再重画所有内容局部刷新只动两个格子几乎不闪。system(cls)会清空整个缓冲区并重置光标频繁调用会导致明显的闪烁和性能浪费能不用就不用。Sleep(10)的作用。主循环如果一直空转CPU 会跑满一个核。加 10 毫秒的休眠既不影响手感人眼对 10ms 无感又能把 CPU 占用降下来。这是控制台游戏循环的常规做法。隐藏光标。默认光标会在屏幕上闪角色移动时特别干扰。hideCursor通过CONSOLE_CURSOR_INFO把bVisible设为FALSE。注意退出前最好恢复否则终端光标会一直消失不过对 Demo 来说影响不大。把这份代码存成main.c编译运行你应该能看到一个绿色的O按 WSAD 它会移动右下角实时显示坐标按 Q 退出。如果这一步就成功了说明整条链路是通的。如果没反应先别急第 5 节有专门的排查清单。4. 验证请求与成功结果逐键测试与画面刷新确认代码能编译不代表行为正确。这一节给一套逐键验证步骤确保每个方向、每次刷新都符合预期。建议按顺序做每步都观察清楚再进下一步。第一步确认程序能启动并显示初始画面。运行main.exe你应该看到顶部一行提示使用 WSAD 控制移动按 Q 退出中间偏左有一个绿色O右下角显示坐标: (20, 10)。如果提示文字和O重叠了说明初始坐标设得太近把player的初始 y 调大一点即可。如果什么都看不到检查是不是终端窗口太小或者gotoxy的坐标超出了窗口范围。第二步逐键测试四个方向。按wO应该向上移动一格坐标变成(20, 9)按s向下回到(20, 10)按a向左移动两格坐标变成(18, 10)按d向右回到(20, 10)。每按一次旧位置的O应该消失新位置出现O中间不能有残影。如果旧位置还留着O说明eraseAt没生效检查是不是忘了调用或者擦除时坐标传错了。第三步测试大小写。按住 Shift 按W应该和w一样向上移动。代码里case w: case W:就是为此准备的。如果大写没反应说明你只写了小写的 case。第四步测试无关按键。按空格、按数字键O不应该移动坐标也不应该变。如果按空格后O消失了或者位置乱了说明updatePosition的 default 分支处理有问题或者主循环里没判断返回值就重绘了。第五步测试连续快速按键。快速连按d五次O应该连续向右移动坐标从(20, 10)变成(30, 10)。这里要观察有没有丢键——如果按了五次只移动了三次可能是Sleep(10)太长或者_kbhit的处理逻辑有问题。正常情况下_kbhit会缓冲按键不会丢。第六步测试退出。按q程序应该退出光标恢复终端回到正常状态。如果按q没退出检查break是不是只跳出了switch而没跳出while——注意代码里if (key q) break;是在switch外面的直接跳出while这是对的。第七步观察闪烁情况。连续移动时画面应该基本稳定只有O在动提示文字和坐标数字不应该闪。如果整个屏幕在闪说明你可能在某处用了system(cls)或者重绘范围太大。局部刷新的关键就是只动变化的部分。第八步边界测试。一直按w直到O到达窗口顶部再按会怎样当前代码没有边界检查y会变成负数gotoxy收到负数坐标行为未定义可能O消失或者跑到奇怪的位置。这是下一步要改进的点但先确认你观察到了这个现象理解为什么需要边界检查。如果以上八步都符合预期恭喜你的 WSAD 移动链路是完整且正确的。这时候可以尝试改几个参数找感觉把横向步长从 2 改成 1感受一下速度差异把Sleep(10)改成Sleep(50)感受一下响应延迟把角色字符从O改成或囧看看显示效果。这些微调能帮你建立对手感的直觉。验证过程中如果某一步不符合预期先别改代码先记录现象是哪个键、期望什么、实际什么、坐标显示是多少。带着这些信息去第 5 节对照或者拿去问模型定位会快很多。5. 本篇常见错误排查按了没反应、闪屏、坐标错乱怎么定位这一节按现象 → 原因 → 解决的结构把这类程序最常见的坑列一遍。每条都对应真实会遇到的报错或异常行为。现象一编译报错conio.h: No such file or directory。原因你在 Linux 或 macOS 下编译。conio.h是 Windows 特有的。解决换到 Windows 环境或者用ncurses库重写输入部分。如果你确实在 Windows 下还报这个错检查编译器是不是 MinGW-w64 完整版某些精简版可能缺头文件。现象二编译报错undefined reference to SetConsoleCursorPosition。原因链接时没找到 Windows API 的实现。解决MinGW 下通常不用额外加库如果报这个错试试gcc main.c -o main.exe -luser32或者确认windows.h是否正确包含。MSVC 下一般不会出现。现象三程序运行后按 WSAD 完全没反应。这是最高频的问题原因可能有几种。第一你用的是getch()而不是_getch()在某些 MSVC 版本下getch被弃用导致行为异常统一改成带下划线的版本。第二你的终端不是标准 cmd比如在某些 IDE 的内置终端里_kbhit可能读不到输入换成直接在 cmd 或 Windows Terminal 里运行main.exe。第三主循环里_kbhit的判断写反了或者Sleep时间过长导致感觉迟钝。第四输入法处于中文状态按键被输入法拦截了切到英文输入再试。现象四按一次键移动了很多格。原因_kbhit和_getch的配合有问题或者你在while里没有正确消费按键。检查是不是把_getch写在了if (_kbhit())外面导致每次循环都读一次。也可能是按键重复率设置太高但这种情况少见。现象五画面严重闪烁。原因用了system(cls)全屏清空。解决改成局部刷新只擦除旧位置、绘制新位置。如果已经用了局部刷新还闪检查是不是每次循环都重绘了提示文字和坐标把不变的内容只画一次。现象六角色移动后旧位置留下残影。原因eraseAt没调用或者擦除的坐标不是旧坐标。检查主循环里是不是先old player再updatePosition顺序反了就会擦错位置。另外如果角色字符占两个字符宽比如中文擦除时要用两个空格。现象七坐标显示乱跳或变成负数。原因没有边界检查角色跑出了控制台范围。解决在updatePosition里加边界判断比如if (p-x 2 p-x 78) p-x - 2;具体范围根据你的窗口大小定。也可以用GetConsoleScreenBufferInfo动态获取窗口宽高。现象八程序退出后终端光标不见了。原因hideCursor把光标隐藏了但退出时没恢复。解决在main返回前调用ShowCursor(TRUE)或者重新设置CONSOLE_CURSOR_INFO的bVisible TRUE。现象九_getch读方向键返回两个值。这是扩展键的特性方向键、F1-F12 等会先返回 0 或 224再返回具体扫描码。如果你想让方向键也能控制移动需要连续读两次key _getch(); if (key 0 || key 224) key _getch();然后再判断扫描码上 72、下 80、左 75、右 77。本文用 WSAD 就是为了避开这个复杂性。现象十接入模型辅助时遇到 401 或local proxy failed。如果你在用 TaoToken 或其他接入层辅助调试遇到 401 通常是 API Key 没填、填错或过期去 API Keys 页面重新生成一个。遇到local proxy failed一般是本地网络或代理配置问题检查 Base URL 是不是https://taotoken.net/api有没有多余斜杠。遇到reading choices之类的响应解析错误多半是 Model ID 填错了确认你用的模型名和文档一致。这些配置问题在接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里都有说明。排查的核心思路是先确认输入有没有被读到再确认坐标有没有更新最后确认画面有没有重绘。你可以在_kbhit命中后加一句printf打印按键值在updatePosition后打印新坐标这样就能快速定位是哪一环断了。定位清楚再改比盲目试错快得多。6. 把这段代码用起来从 Demo 到可扩展的小项目到这里WSAD 控制移动的完整链路已经跑通了。但这段代码的价值不止于能移动它是一个可以往上长的基础骨架。下面说几个自然的扩展方向以及怎么用模型辅助把这些扩展做扎实。加边界检查。这是最该先做的。用GetConsoleScreenBufferInfo拿到窗口的宽高在updatePosition里判断新坐标是否越界越界就不更新。这样角色就不会跑出屏幕。代码大概是这样void getConsoleSize(int *width, int *height) { CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), csbi); *width csbi.srWindow.Right - csbi.srWindow.Left 1; *height csbi.srWindow.Bottom - csbi.srWindow.Top 1; }然后在移动前判断p-x和p-y是否在[0, width-1]和[0, height-1]范围内。加障碍物和碰撞。用一个二维数组表示地图0是空地1是墙。移动前检查目标格子是不是墙是就不让走。这一步做完你的 Demo 就有点游戏的样子了。加多个角色或 NPC。把Point扩展成Entity结构体加个char symbol字段就能用同一套绘制函数画不同的角色。NPC 可以按固定路径移动或者简单地随机走。加计时和分数。用GetTickCount()或clock()记录时间做一个限时收集的小玩法。这会让程序从能交互变成有目标。这些扩展每一个都不难但组合起来就是一个完整的小项目。写的过程中如果卡在某个 API 的用法、某个报错的含义或者想让模型帮你把某段逻辑重构成更清晰的结构可以用 TaoToken 的模型对话快速问https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。如果你打算持续写这类小项目让模型长期参与代码审查和重构Coding Plan 会更顺手https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。需要自己生成和管理 Key 的话API Keys 页面在这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后分享一个我自己的习惯每次写完一个能跑的小程序先别急着加功能而是把它拆成输入、状态、渲染三层看看每层的职责是不是清晰。这段 WSAD 代码里_kbhit/_getch是输入层Point和updatePosition是状态层gotoxy/drawAt/eraseAt是渲染层。三层分清楚之后无论加什么功能你都知道该往哪一层加。这个习惯比记住某个 API 的用法重要得多。代码写到这里其实已经可以结束了——剩下的就是你自己动手改一改、跑一跑让那个绿色的O按你的想法动起来。

相关新闻

电力系统可靠性评估:蒙特卡洛仿真与风险分级技术

电力系统可靠性评估:蒙特卡洛仿真与风险分级技术

1. 项目背景与核心价值大电网可靠性评估是电力系统规划与运行中的关键环节。传统确定性评估方法难以全面反映系统运行风险,而蒙特卡洛仿真通过概率模拟能有效捕捉电网运行的随机性特征。这项研究提出的"快速蒙特卡洛仿真风险分级"方法,在保证计…

2026/10/15 19:43:38 阅读更多 →
Apache Atlas 1.1.0 生产环境安装部署实战:依赖版本对齐与故障排查

Apache Atlas 1.1.0 生产环境安装部署实战:依赖版本对齐与故障排查

1. 为什么1.1.0这个版本值得单独写一份安装方案Apache Atlas 的版本迭代节奏不算快,但 1.1.0 这个版本在不少存量生产集群里依然是主力。原因很现实:很多公司的数据治理平台是在 2019 到 2021 年间搭建的,当时选型就落在 1.1.0 上&#xff0c…

2026/10/15 19:43:38 阅读更多 →
Apollo-11导航计算机源码解析:实时调度与容错设计

Apollo-11导航计算机源码解析:实时调度与容错设计

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

2026/10/15 19:42:37 阅读更多 →

最新新闻

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 规划一个 PoE 角色,往往卡在装备迭…

2026/10/15 20:27:02 阅读更多 →
耦合电容选型实战:隔直通交、转折频率与材质权衡

耦合电容选型实战:隔直通交、转折频率与材质权衡

1. 耦合电容的核心任务:隔直通交背后的真实电路需求1.1 为什么放大器不能简单粗暴地直接级联先说一个很多人第一次画多级放大电路时都会踩的场景:前级用共射极放大,集电极静态电位算出来大概是8V左右,后级打算用另一个共射级&…

2026/10/15 20:27:02 阅读更多 →
论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

研究生论文的数据分析,导师批起来最常见的评语是不严谨。不严谨不是指算错,而是指没说清楚怎么分析、为什么这么分析。数据分析可以按五个层次自查,每一层都有明确的检查点。 第一层,数据质量。原始数据有没有缺失值?…

2026/10/15 20:27:02 阅读更多 →
ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

3D 打印机用 USB 线连电脑,或者反复拔插 SD 卡,几乎是每个玩打印的人都要经历的事。尤其打一个十几小时的大件,人不可能一直守在机器旁边,夜里想瞄一眼温度、看它有没有翘边、会不会堵头,都没办法。给打印机加一块 ESP…

2026/10/15 20:27:02 阅读更多 →
MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

1. 为什么到现在还在用MySQL——它不是最酷的,但它是扛事的先说结论:MySQL不是数据库里性能最强的,也不是功能最丰富的,但在绝大多数业务场景下,它依然是那个“最不操心的选择”。我见过不少团队,早期为了追…

2026/10/15 20:27:02 阅读更多 →
JMeter 5.6.2压力测试实战:从线程组到报告解读

JMeter 5.6.2压力测试实战:从线程组到报告解读

简介:Apache JMeter 5.6.2 是由 Apache 组织维护的开源纯 Java 压力测试工具,具备跨平台特性,可运行于 Windows、Linux、macOS。其用途在于模拟大量用户并发访问,评估 Web 应用、数据库、FTP 服务器等静态与动态资源的高并发稳定性…

2026/10/15 20:26:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →