C语言超级玛丽源码:SDL2环境配置、编译与游戏循环实现
简介这是一份用C语言实现的超级玛丽游戏完整源码适合C语言学习者与游戏开发初学者对照学习。资源把经典超级玛丽的核心玩法搬到了控制台/图形窗口环境中包含角色控制、碰撞检测、音效触发等关键逻辑可帮助读者理解小型游戏项目的代码组织与调试思路。压缩包共33个文件总大小约7.33MB。除核心的cpp源码与h头文件外还配有14个mp3音频背景音乐、跳跃、子弹、通关等和6个bmp图片素材金币、敌人等编译运行即可体验完整音画效果。已有8242人学习下载是从入门到进阶都值得参考的C语言项目案例。通过阅读源码可以学会如何用C语言管理游戏循环、处理键盘输入、播放音频与加载图像若用于课程设计稍作修改即可变成自己的作品。1. 一份C语言的超级玛丽源码真正拉开差距的是环境与读懂代码的顺序把“C语言游戏源码超级玛丽”这类项目下载下来第一件事不是打开 .c 文件从头读而是先搞清楚这份代码需要什么编译环境。我见过太多人栽在同一处源码本身没问题缺 SDL2 开发库或者拿老式图形接口的代码硬在 Linux 上编译报错刷一整屏就当场放弃。这份资源本质上是一个用标准 C 加 SDL2 图形库实现的横版卷轴跳跃游戏里面包含主程序入口、地图数据文件、像素贴图和完整的碰撞逻辑。它能解决的核心问题不是“让我玩到玛丽”而是C 语言语法我都学过二维数组、指针、结构体、函数指针都见过了但到底怎么组合成一个“能跑能玩的东西”。适合两类人——刚学完 C 语言准备做课程设计的在校生以及想快速拆一套完整游戏代码、搞明白编译到运行全流程的开发者。正确姿势是先花 10 分钟把环境问题列清楚再动手编译。2. 跑起来才是硬道理MinGW SDL2 环境下把这个超级玛丽编译出窗口2.1 环境清单SDL2、MinGW、Makefile缺一个都会卡编译先说结论这份资源不是那种纯控制台的字符玛丽而是带窗口、带贴图、带键盘响应的图形版。图形部分用的是 SDL2而不是老掉牙的 graphics.h。原因很直接graphics.h 是 Windows 专属且已经停更多年SDL2 跨 Windows / Linux / macOSCMake、VSCode、Clion 都能接编译成 exe 和 Linux 下的可执行文件都行。也就是说你在这份源码上练会了换到其他 SDL 项目照样能上手。我拿到的这份源码文件组织是典型的学习型工程结构文件作用main.c程序入口创建窗口启动游戏主循环player.c / player.h玩家角色移动、跳跃、动画帧切换map.c / map.h地图加载瓦片数据解析碰撞判定接口game.h全局常量、结构体定义、公共函数声明res/map01.txt第一关的地图数据用数字表示砖块、管道、敌人res/sprite.bmp角色和场景的像素贴图Makefile构建脚本一条 make 命令出可执行文件Windows 下最省事的组合是 MinGW-w64 VSCode。注意别装老版 Dev-C 自带的 MinGW那个 GCC 版本太旧对 SDL2 的兼容性很看运气。建议直接到 MinGW-w64 官方仓库拿 x86_64 的 release 包解压到一个没有空格的路径比如 D:\mingw64然后把 D:\mingw64\bin 加进系统 PATH。SDL2 这边去 SDL 官网拿对应的 Windows 开发库解压后得到 include、lib、bin 三个目录。里面那个 SDL2.dll 要单独复制到你的项目目录或者直接放进 C:\Windows\System32不然编译出来的 exe 双击运行会提示“找不到 SDL2.dll”。这一步是新手翻车率最高的点没有之一。2.2 从解压到出窗口完整编译命令与参数解释环境齐了之后编译其实就一条命令的事。假设你的目录结构是上面那张表的样子在项目根目录打开终端gcc main.c player.c map.c -o supermario \ -I./include \ -L./lib \ -lSDL2main -lSDL2 \ -mwindows逐个参数说清楚main.c player.c map.c把三个源文件一起编译。C 语言没有自动的“项目概念”谁被调用谁就要出现在命令里漏了map.c就会在链接阶段报 undefined reference。-o supermario输出文件叫 supermario.exe名字随你。注意不要输出成 supermario.c那会把你的可执行文件跟源码搞混。-I./include告诉编译器去 ./include 目录找头文件对应的是源码里#include SDL2/SDL.h和#include game.h。路径不对就会出现 “SDL2/SDL.h: No such file or directory”。-L./lib -lSDL2main -lSDL2这两行是链接 SDL2 的库文件。-L 指定库文件所在目录-l 指定库名。-lSDL2main是 SDL2 提供的主函数包装层用来保证在不同平台上 main 函数被正确初始化这个库千万别删。-mwindows只对 Windows 有意义表示这是一个 GUI 程序不弹出黑色控制台窗口。调试阶段我建议先删掉这个参数否则 printf 的输出全被吞掉游戏崩了你连日志都看不到。如果不想每次敲一长串就写一个 MakefileCC gcc CFLAGS -I./include -Wall -stdc11 LDFLAGS -L./lib -lSDL2main -lSDL2 SOURCES main.c player.c map.c TARGET supermario $(TARGET): $(SOURCES) $(CC) $(CFLAGS) $(SOURCES) -o $(TARGET) $(LDFLAGS) clean: rm -f $(TARGET)关于-Wall这不是“显示所有警告”的意思而是“显示最常见的那几类警告”。建议开着能帮你提前发现变量未初始化、比较时类型不匹配这类问题。-stdc11是让编译器按 C11 标准来符合现代 C 的习惯避免默认的老标准混用。编译完成后运行之前记得把 res 目录和 SDL2.dll 复制到和 supermario.exe 同一个目录下。这个游戏的地图和贴图都是运行时按相对路径加载的你在源码里大概率会看到这种代码FILE *fp fopen(res/map01.txt, r);注意这里读的是相对路径意味着程序的工作目录必须是 exe 所在目录。你双击 exe没问题你用 VSCode 的调试功能运行时工作目录默认是项目根目录也没问题但如果你在终端里cd D:\other再运行 D:\game\supermario.exe地图加载就会失败。这就是大多数“源码没问题但运行黑屏”的真正原因。2.3 编译失败时先看这三行头文件、主函数入口和库链接如果编译报错先看第一个 error不要从最后一屏往上翻。常见错误就三类第一个SDL2/SDL.h: No such file or directory。现象是编译命令刚执行就报找不到头文件。原因几乎永远是-I路径写错或者 SDL2 的 include 目录路径过深。解决方式先手抄 SDL.h 的实际路径比如D:\SDL2-2.30\include\SDL2\SDL.h所以-I应该指向D:\SDL2-2.30\include别指到 include/SDL2 那一层。第二个undefined reference to SDL_main。这个报错英文直译是“找不到 SDL_main 的定义”很唬人。原因是-lSDL2main这个库没链接或者链接顺序不对。GCC 处理库依赖的规则是从左到右哪个.c文件用到了 SDL2 的符号-lSDL2main -lSDL2就必须排在那几个源文件的后面顺序反了就会出现这种“幽灵报错”。第三个cannot find -lSDL2。这个最简单-L指向的目录里根本没有 libSDL2.dll.a。检查一下 SDL2 解压出来是 lib 还是 lib64在 64 位系统上用 64 位库这个不要混。很多教程喜欢在 VSCode 的 tasks.json 里写完整的配置但核心还是那三个路径头文件、库文件、动态库搜索路径。这三个方向对了想在哪个编辑器里跑都行。3. 拆开代码看门道游戏主循环、碰撞检测与地图数据的联动关系3.1 main.c 里的游戏主循环事件、更新、渲染三件套SDL2 版游戏的核心代码拆开看就四个模块初始化、事件、更新、渲染。游戏所有行为都在这四块里打转。源码主循环结构基本长这样// game.h —— 全局常量 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define FPS 60 // main.c —— 游戏主循环核心 while (running) { // 1. 处理输入事件 while (SDL_PollEvent(event)) { if (event.type SDL_QUIT) { running 0; } if (event.type SDL_KEYDOWN) { handle_keydown(event.key.keysym.sym); } } // 2. 按固定时间步更新游戏逻辑 update_game_state(player, camera, map, current_level); // 3. 渲染画面 render_game(renderer, player, camera, map); // 4. 控制帧率 SDL_Delay(1000 / FPS); }我把注释写在代码里是为了让你看的时候能直接对应。这里有个细节要重点解释SDL_PollEvent是把事件队列里的全部事件一次取完每取一个就处理一个取完返回 0循环退出。它不回阻塞所以你不操作键盘的时候游戏本身也不会停下来——更新的代码永远在执行这正是一个可玩游戏和命令行小程序的本质区别。1000 / FPS是每帧的毫秒数60 帧就是大约 16 毫秒。这样写是“硬睡眠”式锁帧优点是简单直观缺点是实际渲染耗时大于 16 毫秒时游戏整体会变慢。不少高质量源码里会用“delta time帧间隔”来算位移这样不管帧率高低角色移动速度是稳定的。但这套源码用了最朴素的硬锁帧新手读起来不费力。如果你的机器性能很强关了垂直同步帧数跑到 300角色会快得像加速这就是没做时间步归一化的典型症状。3.2 碰撞检测为什么是矩形判定而不是像素级判定超级玛丽这类平台跳跃游戏碰撞检测是核心中的核心。这套源码用的是 AABB 包围盒碰撞也就是把角色和每一块瓦片都简化成一个长方形然后检测两个长方形是否相交。核心代码是这种模式// player.c —— 简化的角色与瓦片碰撞判断 int check_collision(SDL_Rect *a, SDL_Rect *b) { // 两个矩形不相交的四种情况 // 1. a 在 b 左边 // 2. a 在 b 右边 // 3. a 在 b 上面 // 4. a 在 b 下面 if (a-x a-w b-x) return 0; if (a-x b-x b-w) return 0; if (a-y a-h b-y) return 0; if (a-y b-y b-h) return 0; // 四种情况都不满足说明相交 return 1; }这里有几个参数值得讲。a-x a-w是角色右侧的 x 坐标b-x是瓦片左侧的 x 坐标如果前者小于后者说明角色完全在瓦片左边不可能相交。另外三个判断同理。这种判定方式是拿来即用级别的性能也好——一次碰撞只做四次整数比较整个屏幕几百个瓦片也不会卡。但要注意像素级别的碰撞在这类 2D 游戏里几乎没有人用。原因是贴图边缘往往有透明区域角色和管道明明没贴在一起用像素逐点比对却可能误判。真实做法是在角色结构体里单独维护一个“判定框”rect这个 rect 比贴图矮一点、窄一点。比如贴图是 32×40判定框可能只有 24×32让脚底贴近地面头顶又不至于被一颗凸起的像素卡住。你玩的时候感觉“明明图没碰到砖却跳不上去了”多半就是判定框没有做收缩。3.3 地图文件藏着关卡二维数字数组与坐标换算地图是这个游戏最容易被忽略、又最能学东西的部分。打开 res/map01.txt你看到的不像地图更像一堆数字// map01.txt 局部简化后示意 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 2 0 0 0 0 3 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 0 0 0 0 0 0 0 0 0 0 0 0 4每个数字对应一块 32×32 像素的瓦片具体含义集中放在 map.h 里// map.h —— 瓦片类型枚举 #define TILE_EMPTY 0 // 空地 #define TILE_BRICK 1 // 砖块 #define TILE_QUESTION 2 // 问号块 #define TILE_PIPE 3 // 管道 #define TILE_ENEMY 4 // 敌人出生点这里有一个关键换算地图上第 row 行、第 col 列的瓦片渲染到屏幕上时它的左上角坐标是int tile_x col * TILE_SIZE; // TILE_SIZE 是 32 int tile_y row * TILE_SIZE;也就是说二维数组的下标通过乘上瓦片尺寸直接变成了屏幕坐标。这个换算一出来很多之前抽象的东西就具体了。你看到角色从屏幕左边走到右边本质上是列号在增加或者反过来摄像机坐标在增加。这套源码里 camera 就是一个偏移量所有瓦片的渲染 x 坐标减去 camera.x就实现了“地图不动、镜头跟着人物走”的效果。3.4 常量表哪些数字是手感的关键哪些一动就崩源码开头通常有一整片 #define它们决定了游戏“手感”的 80%。这里抽出来放在一起看常量典型值作用WINDOW_WIDTH / HEIGHT800 / 600窗口尺寸改它会改变可视范围TILE_SIZE32每块瓦片边长影响地图和角色比例PLAYER_SPEED3.0f水平移动速度值越大跑得越快GRAVITY0.4f每帧下落速度增量值越大角色越“沉”JUMP_VELOCITY-12.0f起跳瞬间的垂直初速度负值代表向上MAX_FALL_SPEED8.0f下落速度上限防止自由落体无边界加速这里面最值得动的是后三个。它们的关系不是孤立的跳跃高度由 JUMP_VELOCITY 和 GRAVITY 共同决定物理公式是高度 v^2 / (2g) (-12)^2 / (2 × 0.4) 180 像素。你以为改了跳跃初速度就能跳更高但如果不配合调整重力角色会飘在空中半天不下来手感很假。真正调参是让初速度和落速同时变保证跳跃滞空时间合理。这部分的搭配是整套源码里最有“玄学”色彩的地方慢慢试一次只改一个值。4. 常见问题与排查编译过了但游戏不听话的五种翻车现场4.1 窗口闪一下就消失控制台无任何输出现象双击 exe窗口刚出现就关闭甚至没看清画面。用终端运行同样秒退没有报错。原因最常见的是资源加载失败。程序启动时要读 res/map01.txt 和 res/sprite.bmp这两个文件找不到时初始化函数会直接返回 0主循环跟着退出。我在调试阶段亲眼见过有人把 res 目录放在了项目根目录但工作目录切换到了别的文件夹导致相对路径失效。解决先确认 exe、res 目录、SDL2.dll 三者在同一层目录。其次在 main.c 的初始化函数里临时加一行printf(load map failed: %s\n, SDL_GetError());SDL_GetError() 会返回最近一次 SDL 调用的错误信息。输出里如果是 “Unable to open file”那就是路径问题没得跑。调试期强烈建议在编译命令里去掉-mwindows让控制台输出可见。4.2 方向键按了没反应角色站在地上一动不动现象窗口正常、画面正常、按方向键和空格角色毫无反应。但按 ESC 能退出。原因事件处理代码里键值判断写错了。SDL 的键值常量是 SDLK_RIGHT、SDLK_LEFT但很多源码抄来抄去会把SDL_KEYDOWN和SDLK_RIGHT混在一个 switch 里甚至有人写成了case D但游戏实际监听的是方向键。这事儿的坑在于你的逻辑代码里可能同时有 WASD 和方向键两套定义按键结构体 event.key.keysym.sym 在不同 SDL 版本里对应关系有细微差别。解决在 handle_keydown 函数开头打印当前按键的键值printf(key: %d\n, event.key.keysym.sym);运行时按一下方向键看打印出来的是 1073741903SDL 对方向键的定义还是 100D 的 ASCII 码值。如果两者都有说明代码定义了两套映射统一成一个即可。遇到这种情况不要猜打印是唯一的正确路径。4.3 角色移动时画面“震”得像拨浪鼓地砖抖个不停现象角色走路时整个画面在横向抖动尤其是靠近屏幕边缘时特别明显。停下来就不抖。原因帧率和移动速度没对齐。常见写法是player.x PLAYER_SPEED;直接写在事件处理循环里没有走时间步。当帧率 120 时角色的移动频率翻倍而地图瓦片的渲染还是按 60 帧来刷新两边错位就形成了固定规律的抖动。这类抖动是让老玩家“看着难受但说不出哪里难受”的典型问题。解决改用固定时间步长。在 update 函数里统一按 0.016 秒的固定步长更新位移并限制每帧最多补 5 步float accumulator 0.0f; const float dt 1.0f / 60.0f; while (running) { accumulator frame_time; while (accumulator dt) { update_game_state(player, camera, map, dt); accumulator - dt; // 这个内层循环是存疑点如果系统卡顿带长锯齿的步长反而会产生“螺旋抖动” } }外层frame_time用 SDL_GetPerformanceCounter() 计算真实时间间隔内层循环保证每次逻辑更新都走固定的 dt。不要用SDL_Delay代替时间步因为延迟是“大致准”时间步是“精确算”。4.4 汉化源码后中文乱码界面上全是问号现象把提示文本改成中文重新编译运行时显示一堆乱码或问号。原因SDL2 的默认字体渲染不直接支持中文。更麻烦的是源文件的编码问题——Windows 上 VSCode 默认按 UTF-8 保存但老旧的 MinGW 版本拿到 UTF-8 编码的中文会按本地代码页GBK解释两边的编码错位最终显示的全是乱码。解决第一步确保源文件保存为 UTF-8 without BOM。VSCode 右下角编码处显式选择“UTF-8”不要选“GBK”。第二步字体的加载方式——如果用 SDL_ttf 扩展库TTF_OpenFont(res/simhei.ttf, 16)需要一份支持中文的 ttf 字体文件如果是固定 sprite 贴图那就没辙只能把文字做成图片。第三步注意调试输出也一样printf 打印中文乱码时多半是终端代码页跟源文件编码不一致跟游戏本身无关。4.5 敌人站在原地不动或者走到地图边缘直接“穿墙”现象敌人没有巡逻逻辑不会左右移动或者敌人走到地图边缘不回头直接走出屏幕。原因敌人移动逻辑里没有“前方是否悬崖/墙壁”的判断。常见做法是每帧检测敌人前方一格是不是空地如果是空地就转向。但代码里如果只检测了 x 方向有没有碰撞没检测 y 方向地面的存在就相当于敌人没有“脚底感知”自然一路走到黑。你去看这套源码的 update_enemy 函数里面大概率有类似的代码// enemy.c —— 常见的敌人移动逻辑缺失 enemy-x enemy-direction * enemy-speed; // 只做了墙壁碰撞没做地面边缘检测解决在敌人移动前先检测它脚底正下方和前方下一格的瓦片类型。// 正确做法先检测地面 int ahead_x (enemy-x enemy-direction * enemy-speed TILE_SIZE) / TILE_SIZE; int floor_y (enemy-y enemy-h 8) / TILE_SIZE; // 如果前方是墙或脚下没有地面就掉头 if (map[floor_y][ahead_x] TILE_EMPTY || map[floor_y - 1][ahead_x] ! TILE_EMPTY) { enemy-direction * -1; }这里8是向下探一点点的冗余量作用是模拟敌人“脚后跟”避免因为贴图尺寸和判定框高度不一致导致误判。这类代码看着是修敌人实际上是在教我们抽象楼层概念二维数组的索引在这里直接变成了“前方一格”和“脚下两格”的语义。5. 进阶玩法与参数调优从“会跑”到“会改”的三处关键修改5.1 手感调优速度、跳跃高度、重力怎么配合当你能顺利编译运行、主线逻辑也读懂了之后第一件事就是调手感。按下这套改法你会明显感受到游戏“变了一个人”。第一处改水平移动速度。把PLAYER_SPEED从 3.0 改到 2.4你立刻会觉得角色“稳重”了适合做复杂跳跃关卡改成 4.0角色变得“滑”适合做爽快型跑酷。注意改这个数字的同时动画播放速度也要跟着调否则角色跑步的步频和实际位移不一致看起来像在溜冰。第二处调跳跃手感。JUMP_VELOCITY -12GRAVITY 0.4此时跳跃高度约 180 像素。如果改成 -14 和 0.45高度会变成约 217 像素滞空时间变长适合跨大坑改成 -10 和 0.55角色会变得“短粗”跳得低落得快适合狭窄地形。记住那条公式高度 初速度² / (2 × 重力)先算好目标高度再动手填数字。第三处改最大下落速度。MAX_FALL_SPEED默认 8.0可以理解为角色自由落体的极限速度。数值调小了角色下降过程变得“飘”适合表达失重主题调大了下落过程更生猛操作容错率会变低。这里我一般保持 8 到 10 之间太小了跳跃后的手感会糊成一片。5.2 地图编辑实战用数字画出自己的第一关改完手感改地图。拿一张简单的草稿纸把地图看成 20 列 × 15 行的格子每格 32 像素直接在 map01.txt 里画// 画一个最简单的平台一行砖块加一个问号块 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 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 0 0 0 0 0 0 0 0 0 0 4 0注意问号块放在第二行的第 9 列它下方的第 5 行是悬空的砖块平台敌人出生点放到了最右侧。这个布局本身就是为了检验碰撞从问号块上跳起顶砖头再落到悬空砖块上最后遇到敌人一整条游玩路径都覆盖到了。改完之后重新 make编译十几秒跑一遍看看哪里穿模、哪里跳不过去这就是迭代设计的起点。5.3 验证与通用化把调试输出变成你自己的检查清单每次改完参数别只靠肉眼感受。我自己的习惯是给游戏加一档“调试模式”按 F1 时屏幕右上角打印当前角色坐标和速度// 调试模式显示玩家坐标与速度 if (debug_mode) { char dbg[128]; snprintf(dbg, sizeof(dbg), pos(%.1f,%.1f) vel(%.1f,%.1f), player.x, player.y, player.vx, player.vy); draw_text(renderer, dbg, WINDOW_WIDTH - 260, 10); }有了这个输出跳跃高度改了之后到底差多少肉眼看不出来的数值差异坐标数据会给你准确答案。从那以后我每次拿到一个源码包都强制自己先编译、再读主循环、再改一个参数最后加一个调试输出——顺序反了就会陷进“玄学调参”的黑匣子里改来改去都不知道哪个值起作用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

# 总结分布式事务没有“银弹”,每种方案都有其特定的适用场景与代价

# 总结分布式事务没有“银弹”,每种方案都有其特定的适用场景与代价

在微服务架构与分布式系统盛行的今天,数据一致性问题成为开发者必须直面的核心挑战。传统的本地事务(ACID)在跨服务、跨数据库的场景下显得力不从心,分布式事务应运而生。本文将从实战角度出发,深入剖析6种主流的分布式…

2026/10/9 8:04:29 阅读更多 →
UniApp进销存ERP订货商城源码拆解:架构、业务闭环与二开避坑

UniApp进销存ERP订货商城源码拆解:架构、业务闭环与二开避坑

上个月帮一个做调味品批发的客户搭订货系统,老板上来第一句话是"我要一个能让我下游那几百家门店自己在手机上订货的东西"。听起来简单,真正做需求梳理的时候才发现,门店下完单之后库存什么时候锁、仓库怎么拣货、客户欠款怎么控制…

2026/10/9 8:04:29 阅读更多 →
【原创开源·修订版】源-栅-漏-栅-源横向双栅MOS:从“被误解的短路”到“电流路径多值逻辑与顶层供电架构”

【原创开源·修订版】源-栅-漏-栅-源横向双栅MOS:从“被误解的短路”到“电流路径多值逻辑与顶层供电架构”

本文依旧沿用:CC BY-NC-SA 4.0 协议 TSA 时间固化,编号太长,作者比较懒,就不写了太这是一个失败的推演,我继续推演后发现是个死胡同所以这篇帖子我不删留着惊醒有梦的人,不要跟我一样傻摘要本文是对前作《源…

2026/10/9 8:04:29 阅读更多 →

最新新闻

降AI痕迹实战指南:手动改写与工具测评的全面对比

降AI痕迹实战指南:手动改写与工具测评的全面对比

1. 先说结论:为什么要折腾“降AI”这件事 以前大家写东西,是怕自己写得不够像“人话”。现在反过来了,满屏都是AI生成的文字,大家又开始拼命往回拉,希望文字能多点“人味儿”。我见过太多人拿到AI初稿后直接复制粘贴&a…

2026/10/9 8:30:18 阅读更多 →
JSP+Servlet+MySQL博客系统:从部署到代码改造的完整指南

JSP+Servlet+MySQL博客系统:从部署到代码改造的完整指南

简介:基于JSP、Servlet与MySQL构建的博客系统网站源码,面向Java Web初学者和需要快速搭建博客平台的开发者,涵盖用户注册登录、文章发布编辑、评论互动、分类检索、权限管理等常用模块,可直接部署学习或二次开发。压缩包共327个文…

2026/10/9 8:30:18 阅读更多 →
从netstat到内核源码:TCP状态机排查CLOSE_WAIT与TIME_WAIT的实战思路

从netstat到内核源码:TCP状态机排查CLOSE_WAIT与TIME_WAIT的实战思路

线上有一台服务,端口连接数报警,我用 netstat 一看,满屏的 CLOSE_WAIT 和 TIME_WAIT,顺手把系统参数里的 tcp_tw_reuse、tcp_fin_timeout 调了一圈,看似平息了。但过两天换了个端口,同样的问题又冒出来&…

2026/10/9 8:30:18 阅读更多 →
用Pygame从零实现打砖块游戏:游戏循环与碰撞检测实战

用Pygame从零实现打砖块游戏:游戏循环与碰撞检测实战

1. 为什么选择Pygame作为第一个游戏开发库先聊个可能会劝退不少人的事实:做游戏这行,门槛看起来很高,但真正把你卡住的,往往不是“不会写代码”,而是“不知道从哪儿下手”。图形引擎一大堆,Unity、Unreal都…

2026/10/9 8:30:18 阅读更多 →
鸿蒙Flutter应用Emoji渲染适配:从Unicode解析到文本增强实践

鸿蒙Flutter应用Emoji渲染适配:从Unicode解析到文本增强实践

前阵子我在鸿蒙设备上调试一款社交类Flutter应用,消息列表里一串串emoji直接渲染成“豆腐块”,有的干脆显示成方框加问号。查了半天发现不是网络问题,也不是数据库编码问题,而是系统字体和当前Flutter引擎对Unicode新emoji的覆盖跟…

2026/10/9 8:30:18 阅读更多 →
前缀和与前缀积:从LeetCode 724和238看数组累积思想

前缀和与前缀积:从LeetCode 724和238看数组累积思想

1. 为什么要用“前缀和”解数组题这套题单把“寻找数组的中心下标”和“除自身以外数组的乘积”放在一起,编号分别是27和28,对应到LeetCode上就是第724题和第238题。两道题表面上一个在数组里找位置,一个在算乘积,乍看没啥关联&am…

2026/10/9 8:29:17 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26: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/9 6:17:20 阅读更多 →