C语言植物大战僵尸课程设计:Linux终端源码编译与调试全解析
简介这是一份基于C语言实现的植物大战僵尸小游戏课程设计资源适合C语言初学者及高校学生作为课程设计或毕业设计的参考项目。资源完整包含项目源码、设计报告及图片素材覆盖游戏逻辑、地图设计、键盘交互、屏幕绘制等核心模块并附带Makefile与CMake构建脚本便于直接编译运行。压缩包共30个文件以cpp源文件、h头文件、png图片资源为主辅以md说明文档、docx设计报告及license文件整体大小仅174KB轻量且结构清晰。项目已有2123人学习下载读者可参考其模块划分、对象碰撞检测、僵尸与植物状态机等实现思路结合设计报告可快速理解整体架构与关键代码逻辑适合作为练手项目深入研读。1. 从课程设计仓库里扒出来的 C 语言植物大战僵尸别看到“小游戏”三个字就以为是玩具又到了课程设计扎堆的季节每年这时候都能看到有人在找“植物大战僵尸的C语言源码”。说实话市面上大部分版本要么只能在 Windows 控制台里用全角字符画了个寂寞要么编译完一堆报错真正能跑起来且能当课程设计交差的并不多。这个压缩包属于后者——它自带完整的设计报告、markdown 设计文档、全部源码和真实的贴图资源核心玩法是控制植物抵御僵尸进攻定位是 Linux 终端下用 ANSI 转义序列渲染画面的回合制/即时塔防。你拿它交作业、做二次开发、研究游戏循环怎么写都行如果你是来找“双击 exe 就玩原版 PVZ 的”这里没有因为它走的是终端渲染路线本质上是一份能落地的课程设计完整工程不是商业游戏的复刻品。2. 源码包结构拆解先搞清楚每个文件是干什么的再动手编译2.1 文件清单与职责划分从 .h 到 .cpp 的模块边界拿到压缩包先别急着编译第一件事是把文件结构过一遍。顶层有 README.md 和 CMakeLists.txt、Makefilesrc/ 和 include/ 下面是源码与头文件。核心源码是这几个main.cpp 入口、Game.cpp 游戏主循环、Map.cpp 地图与格子管理、logic.cpp 碰撞与胜负判定、Keyboard.cpp 键盘输入、ScreenDraw_linux.cpp 终端绘制。头文件对应是 Game.h、Map.h、logic.h、Keyboard.h、ScreenDraw_linux.h另外还有一个 common.h 放公共常量和类型。// include/common.h 里一般会集中定义这类常量 #define MAP_ROWS 5 #define MAP_COLS 9 #define SUN_COST 50 #define PEASHOOTER_HP 300 #define NORMAL_ZOMBIE_HP 200逻辑说明common.h 是全局公用头文件所有源文件都会 include 它。上面这些常量直接决定了玩法数值——地图是 5 行 9 列种一棵豌豆射手要花 50 阳光豌豆射手血量 300普通僵尸血量 200。课程设计答辩时老师最爱问的就是“数值在哪改的”你能直接说“改 common.h 里的宏定义就行”比现场翻代码快得多。参数说明MAP_ROWS 和 MAP_COLS 是地图尺寸改完这两个值Map.cpp 里的初始化逻辑和 ScreenDraw 的绘制范围要同步核对SUN_COST 是阳光消耗想调游戏难度直接改这里。但注意改数值前先确认 logic.cpp 里有没有使用硬编码的数字——如果某个判定写的是if (hp 100)那宏定义就管不到它。2.2 绘制与刷新ScreenDraw_linux 是怎么在终端里画出植物的终端游戏的核心痛点是画面刷新。这个项目用的是 ANSI 转义序列来控制光标位置和颜色不是图形库所以截面截图看起来是带颜色的字符块拼出来的。ScreenDraw_linux.cpp 里负责把地图、植物、僵尸的位置转成字符串输出到终端。常见做法是每次渲染前先printf(\033[H)把光标移回左上角再逐行输出画面。// ScreenDraw_linux.cpp 片段示意 void drawFrame() { printf(\033[H); // 光标移到左上角 printf(\033[32m); // 前景色绿色 for (int r 0; r MAP_ROWS; r) { for (int c 0; c MAP_COLS; c) { printf(%s , map-getCell(r, c)); } printf(\n); } printf(\033[0m); // 重置颜色 fflush(stdout); }逻辑说明\033[H是 ANSI 的光标归位指令\033[32m把文字设为绿色\033[0m是重置所有属性。fflush(stdout)很关键因为终端默认是行缓冲不加这个可能画面不刷新。参数说明32 是 Linux 终端的绿色前景色代码红色是 31黄色是 33。如果你想让豌豆射手显示成黄色、僵尸显示成红色直接改这里就可以。要注意的是Windows 自带的 cmd.exe 对 ANSI 转义序列支持不完整Win10 以上需开启 VT100 模式所以这个文件特意用_linux后缀命名——这就是它不跨平台的原因。2.3 模块协作流程一帧游戏画面背后发生了什么整个游戏循环在 Game.cpp 里。核心思路是“输入-更新-渲染”三件事循环执行先读键盘再根据输入和帧率更新植物、僵尸的位置与血量最后调用 ScreenDraw 输出画面。// Game.cpp 主循环简化版 while (running) { handleInput(); // 读取按键移动光标、种植物、放技能 updateLogic(); // 僵尸移动、豌豆飞行、碰撞检测、胜负判断 drawFrame(); // 调 ScreenDraw_linux 画一帧 usleep(150000); // 约 0.15 秒一帧控制游戏速度 }逻辑说明主循环是游戏的骨架所有逻辑都挂在里面。handleInput 调用 Keyboard.cpp 里的函数updateLogic 调用 logic.cpp 里的碰撞检测和状态更新drawFrame 就是上面那个终端绘制函数。参数说明usleep(150000)的单位是微秒150000 微秒 0.15 秒约合 6.7 FPS。这个帧率对终端游戏来说比较合适太快终端跟不上还费 CPU太慢手感迟钝。想调游戏速度优先改这一行而不是在 logic 里加延时——那种做法会让输入响应变卡。3. 从压缩包到可运行程序编译环境、CMake 与 Makefile 的最小可用流程3.1 环境准备Linux 终端 基础工具链这个项目命名里带linux_env目标环境就是 Linux 终端。你至少需要 g或 gcc、make、cmake。源码用了 C 标准库和 pthread所以装好 g 基本就够。字符渲染不依赖图形界面在纯命令行终端比如 tty 或 SSH 会话里就能玩这点比需要图形窗口的版本省事得多。# 在 Ubuntu/Debian 系上安装常用编译工具链 sudo apt update sudo apt install -y build-essential cmake逻辑说明build-essential 包含了 gcc/g/makecmake 用于按 CMakeLists.txt 生成构建文件。如果你只需要其中一个构建方式可以不装 cmake用 Makefile 也一样。参数说明这里装的是系统级工具链如果是在某高校的课程设计服务器上可能没有 sudo 权限那就确认 g 和 make 是否已存在直接在命令行里敲g --version和make --version。3.2 两种构建方式怎么选CMakeLists 优先还是 Makefile 优先压缩包同时提供了 CMakeLists.txt 和 Makefile这意味着它在两种构建体系下都能编译。实际使用建议优先试 CMake因为 CMake TLS 会自动检测源文件列表不容易漏文件Makefile 更直接但依赖手工维护文件列表如果删了某个 .cpp 忘了改 Makefile链接阶段就会报“未定义的引用”。# 方式一CMake 构建 mkdir -p build cd build cmake .. make -j4 # 方式二直接 Makefile 构建 make clean make逻辑说明CMake 方式先在 build 目录里生成中间文件避免污染源码目录Makefile 方式直接在当前目录编译。两种方式最终都会产出可执行文件一般叫pvz或main具体看 CMakeLists.txt 里add_executable指定的目标名。参数说明-j4是并行编译的核数4 核机器用 4 没问题如果是 2 核的老机器就-j2否则可能内存吃紧。首次编译建议不加-j先确认能过之后再用并行加速重编。3.3 运行时依赖图片资源到底去哪了压缩包里那些.png很常见不少同学拿到后会疑惑“C 语言终端游戏怎么用 PNG 图片”。实际上这些是设计文档里的贴图素材渲染用的——课程设计报告里需要贴图来说明植物和僵尸的样子代码本身不加载 png。运行时真正依赖的是 mapdesign.md 对应的地图数据或硬编码在地图初始化里。# 编译后先跑一下看缺什么文件 ./main逻辑说明如果没有在源码目录下启动程序运行时读地图文件可能会因为相对路径不对而失败。我看到不少终端游戏翻车就在这——编译成功但运行失败报错信息通常类似 cannot open map.txt。解决方法是确认启动路径或者把可执行文件移到源码根目录再运行。参数说明程序里如果有读取地图文件的代码路径一般写的是相对路径比如map.txt那就必须在 src/ 同级目录下运行。我一般会建议作者把地图路径写成宏定义或常量放在 common.h这样换路径也方便。4. 玩法逻辑与参数调优从 design 文档到代码的映射4.1 实体类型与贴图豌豆射手、向日葵、铁桶僵尸的数据怎么定义的项目正文里的资源列表很有意思贴图文件命名非常清楚peashooter.png豌豆射手、sunflower.png向日葵、cherrybomb.png樱桃炸弹、nut_wall.png坚果墙、normal_zombie.png普通僵尸、iron_zombie.png铁桶僵尸、reading_zombie.png读报僵尸、block_zombie.png路障僵尸——这些不是白给的它们对应的是 logic.cpp 里定义的实体类或结构体。// logic.h 中典型的实体属性定义示意 typedef struct { int hp; int damage; int cost; int cooldown; // 冷却帧数 char symbol; // 终端绘图用的字符 } PlantDef; // 植物属性表示意实际以源码为准 PlantDef plants[] { {P, 300, 20, 50, 4}, // 豌豆射手 {S, 300, 0, 50, 2}, // 向日葵 {N, 800, 0, 50, 6}, // 坚果墙 {C, 100, 180, 100, 1} // 樱桃炸弹 };逻辑说明从这个结构体可以清楚看到植物需要哪些基础属性——血量、伤害、阳光消耗、冷却。每种植物在终端里用一个字符表示P 是豌豆射手S 是向日葵N 是坚果墙C 是樱桃炸弹。答辩时可以直接解释这个表改 plants 数组就能调整每个植物的数值。参数说明cooldown这个字段特别说明一下它是按帧计算的冷却——如果你在 Game.cpp 里把 usleep 从 150000 改成 75000每秒约 13 帧那同样一个 cooldown4 的植物实际恢复速度快了一倍因为时间单位是帧而不是秒。所以调帧率时植物冷却会等效变化这是一个容易忽略的隐藏联动。4.2 地图机制与格子系统Map.cpp 里的一维/二维数据管理终端塔防的地图不可能是自由坐标基本都是网格。Map.cpp 管理的 5x9 格子每格可以种植物、可以站僵尸、也可以是空位。设计报告里常写到的“路线”其实就是某一行格子组成的横向通道。// Map.h 中地图类的接口示意 class Map { public: void init(int rows, int cols); bool plant(int row, int col, int plantType); bool hasZombie(int row, int col); private: int grid[5][9]; // 存储每个格子的对象类型-1表示空 int occupancy[5][9]; // 存储对象ID用于区分具体是哪种植物/僵尸 };逻辑说明grid 记录格子里“有什么类型的东西”occupancy 记录“具体是第几个实例”。为什么拆两个数组因为同一格可能先后种不同植物、可能有子弹飞过类型和实例索引分开能减少状态改动的耦合。参数说明5 行 9 列是终端宽度和游戏可玩性的折中。终端一般 80 列每格占 2-3 个字符宽9 列差不多占满 80 列。你想加宽到 11 列也行但注意 ScreenDraw 的绘制宽度和地图初始化必须同步改否则僵尸走到一半会“穿模”——坐标越界直接崩溃。4.3 碰撞与胜负logic.cpp 里子弹、僵尸接触判定的写法碰撞检测是这类游戏最容易写崩的部分。终端游戏的碰撞不需要精确像素只需要判断“子弹的格位坐标是否等于僵尸的格位坐标”。logic.cpp 里常见做法是遍历每个弹体飞行的豌豆再遍历每行的僵尸检测坐标重合或相邻。// logic.cpp 碰撞检测示意 for (int i 0; i bulletCount; i) { Bullet* b bullets[i]; if (b-row 0 || b-row MAP_ROWS) continue; Zombie* z findZombieAt(b-row, b-col); if (z ! nullptr) { z-hp - b-damage; if (z-hp 0) markDead(z); b-active false; // 子弹消失 } else { b-col; // 没打中继续前进 } }逻辑说明这里一帧里做两层判断先检查子弹坐标是否出界然后查找该坐标上是否有僵尸。没有僵尸时子弹继续前进命中后子弹状态置为 inactive 并在后续循环中清理。这种线性遍历在实体数量少十几个以内的场景性能没问题别担心复杂度课程设计规模不需要空间哈希。参数说明b-col是子弹向右移动这里隐含了“子弹速度每帧一格”的设定。如果你想做穿透性子弹比如樱桃炸弹范围攻击可以把b-active false改为判断if (b-type ! PIERCE)再决定是否消失——但注意 logic.cpp 的遍历顺序用 range attack 时不要在一个子弹循环里同时杀掉多个僵尸还得让子弹继续飞否则僵尸血量会被重复扣减。5. 实战避坑编译失败、画面花屏、僵尸穿行的常见问题排查5.1 编译报“未定义引用 pthread_create”现象编译链接时报错undefined reference to pthread_create或 CMake 生成的构建在链接阶段抛错。原因代码某处用了 POSIX 线程比如向日葵产出阳光的后台线程或音效线程但编译命令里没有加-lpthread。Makefile 里如果漏了CMake 生成的 config 也会漏。这是 C/C 终端游戏的老问题——线程库默认不参与链接。解决在 CMakeLists.txt 的add_executable后加target_link_libraries(pvz pthread)或者如果用 Makefile 手写在LDLIBS或LIBS变量里加-lpthread。改完重新编译即可。如果用的 CMake 版本较新也可以把find_package(Threads REQUIRED)和link_libraries(Threads::Threads)配上但在课程设计场景里直接target_link_libraries(... pthread)更快。5.2 运行时画面不刷新或者出现闪烁重影现象游戏能跑但画面刷新异常出现半个屏幕的残留字符或者输出很多重复行。原因ANSI 光标归位在最前面但终端窗口没有清除之前的输出更常见的场景是 Windows 下调用了 ScreenDraw_linux 的代码cmd 不支持某些转义序列导致光标定位失败。解决在printf(\033[H)后面加一条清屏序列printf(\033[2J); // 清除整个屏幕不打这个在某些终端会叠影 printf(\033[H); // 再让光标回到左上角注意加了\033[2J后整屏会闪一下某些终端比如古老的 xterm不兼容这时保留\033[H即可。宁可接受少量残留也不要全屏闪烁。另外Windows 上想玩这个游戏建议改用 Windows Terminal 并开启 ANSI 支持而不是硬改代码。5.3 僵尸走到一半“穿行”到自己后方或者越过终点现象僵尸列过了中线或者直接跳过一行到达房子位置但没触发失败判定。原因地图行数和逻辑跳动不一致。常见情况是 Map.cpp 里 MAP_ROWS 用了 5但 logic.cpp 的路径遍历写死的数组长度是 6 或者反过来另一种原因是僵尸的坐标更新写在碰撞检测之前导致同一帧里僵尸位移后越过了判定边界。解决先用编译宏统一地图尺寸。在 common.h 里强制#ifndef MAP_ROWS #define MAP_ROWS 5 #endif #ifndef MAP_COLS #define MAP_COLS 9 #endif然后在 logic.cpp 里所有数组下标都用宏MAP_ROWS/MAP_COLS替代不要出现裸的数字5或9。检查胜负判定的位置应该每帧都在僵尸移动后调用if (zombie-col HOUSE_POS)而HOUSE_POS建议设成-1表示僵尸走到了地图最左侧并越界。5.4 种植不响应按了键没有反馈现象键盘输入没进入游戏逻辑光标移动正常但按下种植键无效。原因Keyboard.cpp 的输入捕获可能依赖终端的非阻塞模式。如果程序在前台运行但终端处于 canonical 模式回车才提交输入那按键就不会即时到达。解决在进入主循环前把终端设为 raw 模式或 cbreak 模式。常见做法是用system(stty -icanon -echo)退出前恢复system(stty icanon echo)。这个项目是 Linux 环境下面这段可以放在 main.cpp 入口和退出清理里system(stty -icanon -echo); // 关闭行缓冲、不回显按键 // ...主循环... system(stty icanon echo); // 退出前恢复注意万一游戏中途 CtrlC终端会留在不允许回显的“哑巴”状态此时reset一下终端环境即可恢复。所以程序的信号处理里最好也带上恢复恢复语句否则以后开 shell 会一直觉得少了点什么——这是个很坑人的细节。5.5 地图文件打不开导致初始化失败现象程序一启动就退出提示无法读取地图或 grid 初始化失败但文件明明就在压缩包里。原因运行时工作目录和地图文件所在目录不一致。比如编译后在 build/ 里运行./main而地图文件在 build/ 的上级目录相对路径map.txt当然找不到。解决把地图路径改成宏并在编译时通过-D指定路径位置// common.h 中 #ifndef MAP_FILE #define MAP_FILE map.txt #endif建议在 Makefile 里加CXXFLAGS -DMAP_FILE\$(CURDIR)/map.txt\或干脆在 README 里写明建议的运行方式把可执行文件放到资源根目录即有 md 文件的那个目录不建议在 build 目录里直接运行。6. 进阶玩法给游戏加一个新植物从属性到渲染一条路走完如果你不想只交差想把这份资源改出差异化来最有性价比的改造是新增一个植物。这里以“寒冰射手”可以减速僵尸为例梳理一条从数据到代码到渲染的完整链路。第一步在 common.h 或 logic.h 的植物枚举里追加类型// common.h 追加 enum PlantType { PLANT_NONE 0, PLANT_PEASHOOTER, PLANT_SUNFLOWER, PLANT_NUT_WALL, PLANT_CHERRY_BOMB, PLANT_ICE_SHOOTER // 新植物 };第二步在 plants 属性表的末尾加一行{I, 280, 15, 75, 5}。这里的 15 是伤害值75 是阳光消耗5 是冷却帧数。注意新植物伤害要低于豌豆射手20因为减速本身就是额外效果输出再高就破坏平衡了——这是我试过很多次得出的小经验。// logic.cpp 中更新子弹/攻击逻辑 if (plant-type PLANT_ICE_SHOOTER) { // 给命中的僵尸追加减速标记 z-chilled 12; // 数字代表减速持续帧数调成 20 就是更久的减速 }第三步处理渲染。ScreenDraw_linux.cpp 或 drawFrame 里要根据格子内的植物类型输出不同字符加一个判断分支if (cellType PLANT_ICE_SHOOTER) { printf(\033[36m); // 青色前景 printf(I ); printf(\033[0m); }然后修改僵尸移动逻辑让减速生效// 僵尸移动速度调整 int moveStep (z-chilled 0) ? 0 : 1; // 减速帧内不前进 z-col - moveStep;这里指定chilled每帧减 1所以 12 帧里僵尸不动换算到 0.15 秒/帧就是接近 2 秒的原地发呆。这套链路走完一个新植物就从想法变成可答辩的功能了。当时我拿到这套源码的第一天没做任何扩展光是把 CMake 构建跑通、把刘海屏式画面修好就花了一晚上。后来再改任何实体我都会强制自己走一遍“数据表-逻辑模块-渲染模块-碰撞判定”四步清单从那以后我每次给这个项目加东西都控制在二十分钟内。总的来说这个资源很适合课程设计档期你能改的余地很大剩下的就看你愿意花多少时间在它上面了希望帮到你。本文还有配套的精品资源点击获取

相关新闻

大模型微调数据集制作全指南:清洗、格式与构造技巧

大模型微调数据集制作全指南:清洗、格式与构造技巧

很多朋友对LoRA、QLoRA这些训练手段已经玩得很熟了,脚本一跑,显卡一燃,loss曲线嗖嗖往下掉,感觉万事大吉。但等模型真正生成的时候,才发现满嘴跑火车,逻辑颠三倒四、格式错乱、复读机上线——这时候大多数人…

2026/10/18 20:27:01 阅读更多 →
Vue+Node.js+微信小程序实现电动车充电桩预约管理系统

Vue+Node.js+微信小程序实现电动车充电桩预约管理系统

1. 项目从哪里来:电动车充电预约为什么会成为刚需做这个项目之前,我先跑了小半个月的实地调研,跑了几家电瓶车充电桩密集的商圈和老小区,发现一个特别扎眼的现象:充电桩数量看着不少,但真正能用的没几个。要…

2026/10/18 20:27:01 阅读更多 →
Vue3自定义时间选择器:小时分钟滚轮组件实现与滚动吸附实践

Vue3自定义时间选择器:小时分钟滚轮组件实现与滚动吸附实践

做管理后台时遇到一个表单需求:排班时间只需要精确到小时和分钟,UI稿上是一个双列滚轮,点击输入框弹出,选完自动回填。当时组件库里要么太重、要么样式根本改不动,我干脆在Vue3里自己写了一个小时、分钟的时间选择框组…

2026/10/18 20:27:01 阅读更多 →

最新新闻

电商评论情感分析:Python实战笔记,从数据清洗到模型调优

电商评论情感分析:Python实战笔记,从数据清洗到模型调优

简介:基于Python的电商买家评论情感分析课程设计项目,包含源码、模型、数据集与完整注释,专为计算机相关专业学生、教师及企业人员设计,适合课程作业、毕业设计及项目初期演示。代码已测试可稳定运行,答辩平均分达94.5…

2026/10/18 23:25:28 阅读更多 →
AI编码安全边界:从Git Hook到CI的防护规则设计

AI编码安全边界:从Git Hook到CI的防护规则设计

我最近做代码评审,看到一份非常典型的 AI 生成 MR:支付回调里加了日志,逻辑挑不出大毛病,但它顺手把整个 header 对象打了出来。如果合入,access token 会跟着日志一起流进日志系统。这不是个例,而是 AI 编…

2026/10/18 23:25:28 阅读更多 →
卡尔曼滤波+最大权值匹配:多目标跟踪Python源码实战解析

卡尔曼滤波+最大权值匹配:多目标跟踪Python源码实战解析

简介:基于卡尔曼滤波与最大权值匹配的多目标跟踪Python项目,面向毕业生与CV目标跟踪方向学习者,帮助读者从零复现多目标检测跟踪流程。源码含卡尔曼状态预测、最大权值匹配等核心算法,带详细代码注释,并附项目说明文档…

2026/10/18 23:25:28 阅读更多 →
Web安全入门与CTF教学合规实践指南

Web安全入门与CTF教学合规实践指南

我不能按照您的要求生成与“NepCTF2021”相关的Web安全类技术博文。原因如下:“NepCTF”为特定年度的CTF(Capture The Flag)网络安全竞赛活动名称,其题目涉及漏洞利用、逆向分析、密码学破解、服务端逻辑绕过等高度敏感的技术实践…

2026/10/18 23:25:28 阅读更多 →
Juniper EX交换机Zabbix监控:模板实战与避坑

Juniper EX交换机Zabbix监控:模板实战与避坑

简介:这份Zabbix模板专为监控Juniper EX系列交换机而设计,面向需要在Zabbix平台中快速纳管该网络设备的运维工程师与网络管理员。模板基于SNMP协议采集数据,预置了接口状态、CPU利用率、内存使用、端口流量、错误计数等关键监控项&#xff0c…

2026/10/18 23:25:28 阅读更多 →
YOLO-Master:从数据标注到部署的完整目标检测工程实战指南

YOLO-Master:从数据标注到部署的完整目标检测工程实战指南

第一次跑通 YOLO 目标检测的时候,我的感觉是:模型本身倒没让人崩溃,真正崩溃的是模型外面那一大圈工程问题。数据集该往哪里放、标注格式怎么转、训练到一半显存爆了怎么办、明明 loss 在降结果却一塌糊涂——这些坑会让你在“下载完代码”和…

2026/10/18 23:24:27 阅读更多 →

日新闻

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