首页/新闻资讯/正文详情

MFC斗地主源码解析:从VS2019编译到GDI绘图与WinSock改造

发布时间:2026/9/23 21:56:01 来源:云帆数科 栏目:资讯中心
MFC斗地主源码解析:从VS2019编译到GDI绘图与WinSock改造
简介这是一份基于MFC框架开发的斗地主桌面游戏完整源码包面向C初学者与Windows桌面应用开发者旨在帮助理解MFC窗口编程、游戏逻辑封装及资源管理实践。资源包含43个文件涵盖13个头文件h定义类结构与接口、12个源文件cpp实现核心逻辑如发牌、叫地主、出牌判定、网络通信模块Net.cpp/NetControl.cpp等以及bmp图标、ico界面资源、rc资源脚本和工程配置文件dsw/dsp/opt等整体压缩包仅325KB轻量但结构完整。已有196人学习下载适合通过真实项目掌握MFC消息映射机制、CWnd自定义绘图、CPokerHand手牌管理、CGameRule规则引擎等关键技术点。代码模块划分清晰——Server.cpp与Net.h体现简易局域网对战支持ProgramView.h/ProgramView.cpp负责视图渲染Card.h/ Card.cpp抽象扑克牌行为配合ReadMe.txt与www.pudn.com.txt提供基础说明是入门MFC游戏开发的高实用性参考范例。1. 这不是“拿来就能跑”的游戏源码MFC斗地主ddz.rar的真实定位与落地价值你解压ddz.rar双击ddz.slnVC2010/2015弹出警告“找不到 atl90.dll”“无法加载 mfc90d.dll”“Server.cpp 编译失败error C2664”。——这不是你环境配错了而是这套 MFC 斗地主源码常被称作“斗地主_斗地主源码_MFC”本质是一份2008–2012 年间高校课程设计级的 Win32 桌面项目快照不是现代可开箱即用的工程。它不带 CMake、不兼容 Unicode 默认编码、不封装网络模块、不抽象 UI 层甚至Server.cpp里硬编码了127.0.0.1:8080且未实现心跳保活。但它真实存在、逻辑完整、类结构清晰CGameLogic,CPokerDeck,CPlayerHand是理解 MFC 消息循环驱动游戏状态机、WinSock 同步阻塞模型、GDI 绘制扑克牌动画的极佳切口。适合两类人一是想补足 Windows 桌面开发底层脉络的中阶开发者尤其从 Qt/WinUI 转过来的二是需快速构建教学演示原型的讲师或培训师——它比“Hello World”复杂又比商业项目轻量改三处就能跑通单机对战。别指望它直接上线但若你正卡在“MFC 怎么响应鼠标拖拽发牌”“如何让 CDialogBar 动态拉伸适配不同分辨率”这套代码就是最贴近实战的教科书。2. 从 ddz.rar 解压到 VS2019 可编译四步环境适配与工程重建这套源码原始目标平台是 Visual Studio 2008 Windows SDK 6.0A而当前主流开发环境VS2019/2022 Windows 10/11 SDK存在三重断层CRT 运行时版本不匹配、MFC 库路径变更、GDI 绘图 API 兼容性降级。强行打开旧.sln文件只会触发一连串“找不到头文件”报错。必须重建工程结构而非修复旧项目。2.1 解压与目录结构确认识别核心模块边界ddz.rar解压后典型结构如下实测常见变体ddz/ ├── ddz/ ← 主对话框工程目录 │ ├── ddz.h / ddz.cpp │ ├── ddzDlg.h / ddzDlg.cpp ← 主窗口逻辑含 OnInitDialog, OnPaint │ ├── Server.cpp ← 原始服务端仅含 accept send/recv无线程池 │ ├── Client.cpp ← 客户端连接逻辑阻塞式 recv │ └── Resource.h / res/ ← 图标、位图资源*.bmp 存于 res/ ├── common/ ← 公共逻辑部分版本独立 │ ├── GameLogic.h / .cpp ← 牌型判断IsBomb, IsStraight、出牌合法性校验 │ ├── Poker.h / .cpp ← CCard, CPokerDeck 类定义 │ └── Player.h / .cpp ← CPlayerHand, CGamePlayer 管理手牌与状态 └── ddz.sln / ddz.vcproj ← 旧版工程文件弃用提示Server.cpp和Client.cpp是关键——它们没用CAsyncSocket或CSocket封装而是裸调socket()/bind()/accept()这意味着你必须手动处理WSAStartup()初始化和closesocket()清理。这是 MFC 初学者最容易忽略的“隐形依赖”。2.2 新建空 MFC 对话框工程并迁移源码不要尝试升级旧.vcproj新建工程才是唯一可靠路径# 在 VS2019 中操作 1. 文件 → 新建 → 项目 → “MFC 应用程序” → 名称填 ddz_rebuild 2. 应用程序类型选 “基于对话框” 3. 高级功能 → 取消勾选 “使用 Unicode 库”关键原代码为多字节字符集 MBCS 4. 完成向导生成空工程然后手动迁移文件注意路径映射原路径迁移目标位置特别说明ddz/ddzDlg.h/cppddz_rebuild/根目录替换默认ddz_rebuildDlg.h/cpp保留#include stdafx.hcommon/*.h/.cppddz_rebuild/common/在解决方案资源管理器中右键项目 → “添加 → 新建文件夹”命名为commonres/*.bmpddz_rebuild/res/同样新建res文件夹并将所有 BMP 拖入如card_01.bmp,back.bmp参数说明取消 Unicode 是为了规避CString字符宽度不一致问题。原代码中CString str ♠A;在 Unicode 下会因宽字符导致DrawText()显示乱码而 MBCS 下char*直接映射 GBK 编码与资源 BMP 的 ANSI 命名完全兼容。这是血泪经验——曾因勾选 Unicode 导致发牌界面所有文字变成方块排查 3 小时才发现是字符集错配。2.3 关键头文件包含与预编译头配置原代码大量使用#include stdafx.h但新工程的stdafx.h默认不包含 WinSock。需手动补全// ddz_rebuild/stdafx.h —— 在 #include targetver.h 后追加 #pragma once #include targetver.h #define WIN32_LEAN_AND_MEAN #include windows.h #include winsock2.h // ← 必加否则 Server.cpp 报错 undeclared identifier SOCKET #include ws2tcpip.h // ← 支持 getaddrinfo 等新 API虽本项目未用但预防 future 扩展 #include stdio.h #include tchar.h // MFC 头文件 #include afxwin.h // MFC core and standard components #include afxext.h // MFC extensions #include afxdisp.h // MFC Automation classes #include afxdtctl.h // MFC Support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include afxcmn.h // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT同时在ddz_rebuild.cpp和所有.cpp文件顶部确保第一行是#include stdafx.h // 必须是第一个 include否则预编译头失效逻辑说明stdafx.h是 MFC 预编译头机制的核心。若某个.cpp文件漏掉此行或顺序错误如先#include winsock2.h再#include stdafx.h会导致CDialog类定义未声明、DECLARE_MESSAGE_MAP()宏展开失败等连锁报错。这是新手最常翻车的点——看似无关的 include 顺序实际决定整个消息映射链能否激活。2.4 修复 Server.cpp 的 WinSock 初始化与资源泄漏Server.cpp原始代码存在两处致命缺陷未调用WSAStartup()直接socket(AF_INET, SOCK_STREAM, 0)必报错WSANOTINITIALISEDaccept()后未关闭监听 socket导致每次重启服务端都提示“Address already in use”修复后的Server.cpp关键片段仅展示修改部分// Server.cpp #include stdafx.h #include Server.h // 全局 socket 句柄避免局部变量作用域过短 SOCKET g_listen_socket INVALID_SOCKET; SOCKET g_client_socket INVALID_SOCKET; BOOL StartServer() { WSADATA wsaData; int result WSAStartup(MAKEWORD(2,2), wsaData); // ← 补充初始化 if (result ! 0) { AfxMessageBox(_T(WSAStartup failed: ) CString(std::to_wstring(result).c_str())); return FALSE; } g_listen_socket socket(AF_INET, SOCK_STREAM, 0); if (g_listen_socket INVALID_SOCKET) { AfxMessageBox(_T(socket() failed)); WSACleanup(); return FALSE; } sockaddr_in server_addr {}; server_addr.sin_family AF_INET; server_addr.sin_port htons(8080); server_addr.sin_addr.s_addr INADDR_ANY; if (bind(g_listen_socket, (sockaddr*)server_addr, sizeof(server_addr)) SOCKET_ERROR) { AfxMessageBox(_T(bind() failed)); closesocket(g_listen_socket); WSACleanup(); return FALSE; } if (listen(g_listen_socket, 1) SOCKET_ERROR) { // ← 队列长度设为 1单客户端 AfxMessageBox(_T(listen() failed)); closesocket(g_listen_socket); WSACleanup(); return FALSE; } return TRUE; } void StopServer() { if (g_client_socket ! INVALID_SOCKET) { closesocket(g_client_socket); g_client_socket INVALID_SOCKET; } if (g_listen_socket ! INVALID_SOCKET) { closesocket(g_listen_socket); // ← 关键显式关闭监听 socket g_listen_socket INVALID_SOCKET; } WSACleanup(); // ← 必须配对调用 }参数说明MAKEWORD(2,2)指定 WinSock 2.2 版本兼容所有 Win7 系统closesocket()必须在WSACleanup()之前调用否则资源句柄泄露listen()第二个参数是连接请求队列长度此处设为 1 因原设计仅支持单客户端对战无需高并发。3. 让斗地主真正“动起来”三处核心逻辑注入与 GDI 绘图调试源码能编译只是起点。真正让ddz_rebuild从静态界面变成可交互游戏需在ddzDlg.cpp中注入三处关键逻辑牌堆初始化、鼠标点击响应、出牌动画触发。这三步跳过任何一环都会出现“界面显示牌但点不动”“发牌后卡死”等玄学问题。3.1 在 OnInitDialog() 中完成牌堆与玩家手牌初始化原OnInitDialog()仅加载对话框资源未初始化游戏数据。必须在此处调用CPokerDeck::Shuffle()并分发初始手牌// ddzDlg.cpp BOOL CddzDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置图标原代码已存在 SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // ← 新增初始化游戏逻辑 m_gameLogic.InitGame(); // 调用 common/GameLogic.cpp 中的初始化函数 // 创建并洗牌 m_deck.CreateDeck(); // 构建 54 张牌含大小王 m_deck.Shuffle(); // 随机打乱 // 分发 17 张牌给三个玩家留 3 张底牌 m_player[0].ClearHand(); // 玩家0本地玩家 m_player[1].ClearHand(); // 玩家1AI m_player[2].ClearHand(); // 玩家2AI for (int i 0; i 17; i) { m_player[0].AddCard(m_deck.DrawCard()); m_player[1].AddCard(m_deck.DrawCard()); m_player[2].AddCard(m_deck.DrawCard()); } // 底牌存入 m_bottom_cards供后续抢地主使用 for (int i 0; i 3; i) { m_bottom_cards.Add(m_deck.DrawCard()); } // ← 新增触发首次重绘 Invalidate(); // 强制调用 OnPaint() return TRUE; }逻辑说明Invalidate()是关键——它向 Windows 发送WM_PAINT消息驱动OnPaint()执行。若漏掉此行界面永远显示空白背景因为OnPaint()不会自动触发。这是 MFC 绘图机制的底层约定数据准备好 ≠ 界面刷新必须显式通知系统“我要重画”。3.2 实现 OnLButtonDown() 响应鼠标点击选牌原代码未处理鼠标事件所有牌都是静态图片。需在ddzDlg.h中声明消息响应函数// ddzDlg.h class CddzDlg : public CDialogEx { // ... 其他声明 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // ← 新增声明 DECLARE_MESSAGE_MAP() };并在ddzDlg.cpp中实现// ddzDlg.cpp void CddzDlg::OnLButtonDown(UINT nFlags, CPoint point) { CDialogEx::OnLButtonDown(nFlags, point); // 遍历玩家手牌区域假设牌从左到右排列每张宽 60px高 84px CRect handRect(50, 400, 50 17 * 60, 400 84); // 粗略定位手牌区 if (handRect.PtInRect(point)) { int cardIndex (point.x - 50) / 60; // 计算点击第几张牌 if (cardIndex 0 cardIndex m_player[0].GetCardCount()) { // 切换选中状态高亮边框 m_player[0].ToggleSelect(cardIndex); Invalidate(); // 重绘以显示选中效果 } } }参数说明PtInRect()是 MFC 提供的矩形点检测函数比手动计算x,y范围更鲁棒ToggleSelect()是CPlayerHand类中新增方法需在Player.h/cpp中实现内部维护m_selectedCards数组记录选中索引Invalidate()再次出现——每一次用户交互后都必须触发重绘这是 GDI 绘图的“主动刷新”哲学。3.3 在 OnPaint() 中动态绘制选中牌与出牌动画OnPaint()是 GDI 绘图核心。原代码可能只画静态背景需扩展为动态渲染// ddzDlg.cpp void CddzDlg::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(rect); // ← 新增绘制玩家手牌含选中高亮 DrawPlayerHand(dc, m_player[0], CPoint(50, 400)); // 本地玩家在底部 DrawPlayerHand(dc, m_player[1], CPoint(100, 50)); // 上方玩家AI DrawPlayerHand(dc, m_player[2], CPoint(300, 50)); // 右侧玩家AI // ← 新增绘制底牌背面朝上 CBitmap bmpBack; bmpBack.LoadBitmap(IDB_BITMAP_BACK); // 加载 back.bmp CDC memDC; memDC.CreateCompatibleDC(dc); CBitmap* pOldBmp memDC.SelectObject(bmpBack); for (int i 0; i m_bottom_cards.GetSize(); i) { dc.BitBlt(200 i * 20, 200, 60, 84, memDC, 0, 0, SRCCOPY); } memDC.SelectObject(pOldBmp); }其中DrawPlayerHand()需实现选中态绘制void CddzDlg::DrawPlayerHand(CDC dc, CPlayerHand player, CPoint pos) { CBitmap bmpCard; CDC memDC; memDC.CreateCompatibleDC(dc); for (int i 0; i player.GetCardCount(); i) { CCard card player.GetCard(i); CString bmpName GetCardResourceName(card); // 如 card_01, card_14 bmpCard.LoadBitmap(bmpName); // 需提前在 Resource.h 中定义 IDB_CARD_01 等 CBitmap* pOldBmp memDC.SelectObject(bmpCard); // 计算绘制位置支持间隔 CPoint drawPos(pos.x i * 60, pos.y); // 若该牌被选中绘制红色边框 if (player.IsSelected(i)) { CBrush brush(RGB(255,0,0)); dc.FrameRect(CRect(drawPos.x-2, drawPos.y-2, drawPos.x602, drawPos.y842), brush); } dc.BitBlt(drawPos.x, drawPos.y, 60, 84, memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldBmp); } }避坑点BitBlt()的源 DCmemDC必须绑定有效位图否则黑屏FrameRect()绘制边框时坐标要外扩 2 像素否则边框被裁剪GetCardResourceName()需按花色点数映射如黑桃A→card_01红桃K→card_13这是原代码隐含的资源命名规则错一位就显示空白。4. MFC 斗地主开发中的五大经典翻车现场现象、原因与硬核解法即使严格按上述步骤操作仍会遭遇一些“只在此山中云深不知处”的诡异问题。以下是我在复现ddz.rar过程中踩过的五个真实坑每个都附带可验证的解决命令或代码片段。4.1 现象编译通过运行时报错 “0xC0000005: Access violation reading location 0x00000000”原因CPlayerHand构造函数未初始化m_cards成员CArrayCCard, CCard导致GetCardCount()返回随机大数后续for循环越界读取野指针。解决在Player.cpp的CPlayerHand::CPlayerHand()中显式调用m_cards.RemoveAll()CPlayerHand::CPlayerHand() { m_cards.RemoveAll(); // ← 关键否则 m_cards 数据区未分配 m_selectedCards.RemoveAll(); }4.2 现象发牌后界面卡死CPU 占用 100%Debug 断点停在OnPaint()无限递归原因OnPaint()内部调用了Invalidate()如误写在绘制逻辑末尾触发新一轮WM_PAINT形成死循环。解决检查OnPaint()结尾删除所有Invalidate()重绘仅在数据变更后由业务逻辑如OnLButtonDown触发。验证命令在OnPaint()开头加OutputDebugString(LOnPaint called\n);观察输出是否爆炸式增长。4.3 现象Server.cpp编译报错 “error C2065: closesocket : undeclared identifier”原因winsock2.h被windows.h重复包含而后者默认包含旧版winsock.h导致函数声明冲突。解决在stdafx.h中强制前置winsock2.h并在其前加#define WIN32_LEAN_AND_MEAN阻止windows.h自动包含winsock.h#define WIN32_LEAN_AND_MEAN #include winsock2.h #include windows.h // ← 此时 windows.h 不再包含 winsock.h4.4 现象点击发牌按钮无反应OnBnClickedBtnDeal()函数根本未被调用原因对话框资源中按钮控件 ID 与代码中ON_BN_CLICKED(IDC_BTN_DEAL, CddzDlg::OnBnClickedBtnDeal)的 ID 不匹配如资源中 ID 为IDC_BUTTON1代码中写IDC_BTN_DEAL。解决在资源视图中右键按钮 → “属性”确认ID字段值在ddzDlg.h中检查宏定义是否一致如#define IDC_BTN_DEAL 1001用 CtrlF 全局搜索IDC_BTN_DEAL确认所有引用统一。4.5 现象客户端连接服务端后recv()返回 0对端关闭但服务端未收到send()数据原因send()后未调用shutdown()或closesocket()TCP 连接处于半开状态客户端recv()无法感知 EOF。解决在服务端发送完数据后显式调用shutdown(g_client_socket, SD_SEND)send(g_client_socket, buffer, len, 0); shutdown(g_client_socket, SD_SEND); // ← 通知客户端“我发完了” // 此时客户端 recv() 将返回 05. 从教学原型到可交付产品三步进阶改造与性能验证技巧做到“能运行、可点击、有动画”只是完成了 30%。若你想把它变成一份拿得出手的课程设计作品、技术面试演示项目或嵌入到更大系统中的游戏模块还需三个关键动作网络通信健壮化、UI 适配高 DPI、逻辑层解耦测试。这些不是锦上添花而是区分“玩具代码”和“可用模块”的分水岭。5.1 将阻塞式 Socket 升级为异步事件驱动避免主线程卡死原Server.cpp的accept()和recv()全是阻塞调用一旦客户端断连服务端线程就永久挂起。必须改用WSAAsyncSelect()模型让网络事件转为 Windows 消息// 在 StartServer() 中bind/listen 后添加 if (WSAAsyncSelect(g_listen_socket, m_hWnd, WM_SOCKET_NOTIFY, FD_ACCEPT | FD_CLOSE) SOCKET_ERROR) { AfxMessageBox(_T(WSAAsyncSelect failed)); return FALSE; } // 在 ddzDlg.h 中声明消息响应 #define WM_SOCKET_NOTIFY (WM_USER 100) afx_msg LRESULT OnSocketNotify(WPARAM wParam, LPARAM lParam); // 在 ddzDlg.cpp 中实现 LRESULT CddzDlg::OnSocketNotify(WPARAM wParam, LPARAM lParam) { SOCKET sock (SOCKET)wParam; LONG event WSAGETSELECTEVENT(lParam); LONG error WSAGETSELECTERROR(lParam); if (event FD_ACCEPT) { sockaddr_in client_addr; int addr_len sizeof(client_addr); SOCKET client_sock accept(sock, (sockaddr*)client_addr, addr_len); if (client_sock ! INVALID_SOCKET) { g_client_socket client_sock; // 启用客户端 socket 的异步通知 WSAAsyncSelect(client_sock, m_hWnd, WM_SOCKET_NOTIFY, FD_READ | FD_CLOSE); } } else if (event FD_READ) { char buffer[1024] {0}; int len recv(sock, buffer, sizeof(buffer)-1, 0); if (len 0) { // 处理接收到的协议数据如 PLAY:3,5,7 ProcessClientCommand(buffer); } else if (len 0) { // 对端关闭 closesocket(sock); g_client_socket INVALID_SOCKET; } } else if (event FD_CLOSE) { closesocket(sock); g_client_socket INVALID_SOCKET; } return 0; }验证技巧用telnet 127.0.0.1 8080手动连接输入任意字符串后回车观察服务端是否触发FD_READ并正确解析。这是最轻量的网络层压力测试无需写客户端代码。5.2 为高 DPI 显示器启用 Per-Monitor DPI 感知解决模糊与错位Windows 10 高分屏下MFC 默认缩放会导致按钮文字糊成一片、牌面拉伸变形。必须在ddz_rebuild.manifest中声明 DPI 感知!-- ddz_rebuild.exe.manifest -- ?xml version1.0 encodingUTF-8 standaloneyes? assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0 application windowsSettings dpiAware xmlnshttp://schemas.microsoft.com/SMI/2005/WindowsSettingstrue/pm/dpiAware dpiAwareness xmlnshttp://schemas.microsoft.com/SMI/2016/WindowsSettingsPerMonitorV2/dpiAwareness /windowsSettings /application /assembly并在ddz_rebuild.cpp的InitInstance()中添加// 在 CWinApp::InitInstance() 开头添加 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); // 在 CDialogEx::OnInitDialog() 中获取当前 DPI 缩放比例 UINT dpi GetDpiForWindow(m_hWnd); int scale (dpi * 100) / 96; // 96 是 100% 缩放基准 // 调整牌宽高60px → 60 * scale / 100 m_cardWidth MulDiv(60, scale, 100); m_cardHeight MulDiv(84, scale, 100);参数说明PerMonitorV2是 Windows 10 1703 支持的最高级 DPI 感知模式允许应用在多显示器不同缩放率下自适应MulDiv()是 Windows API 提供的安全整数缩放函数避免浮点精度丢失导致像素错位。5.3 提取 GameLogic 为独立 DLL 并编写单元测试验证牌型判断可靠性common/GameLogic.cpp中的IsBomb()、IsValidPlay()等函数是业务核心但原代码混在 UI 层中无法测试。应将其拆为静态库或 DLL// GameLogic.h导出声明 #ifdef GAMELOGIC_EXPORTS #define GAMELOGIC_API __declspec(dllexport) #else #define GAMELOGIC_API __declspec(dllimport) #endif extern C { GAMELOGIC_API bool IsBomb(int* cards, int count); // C 接口跨语言友好 GAMELOGIC_API bool IsValidPlay(int* current, int cur_cnt, int* last, int last_cnt); }然后用 Google Test 编写验证用例// test_game_logic.cpp #include gtest/gtest.h #include GameLogic.h TEST(GameLogicTest, BombDetection) { int bomb[] {1, 1, 1, 1}; // 四张 3 EXPECT_TRUE(IsBomb(bomb, 4)); int not_bomb[] {1, 1, 1, 2}; // 三张 3 一张 4 EXPECT_FALSE(IsBomb(not_bomb, 4)); } TEST(GameLogicTest, StraightValidation) { int straight[] {5,6,7,8,9}; // 5 连顺子 EXPECT_TRUE(IsValidPlay(straight, 5, nullptr, 0)); // 首出 }落地价值DLL 化后同一套逻辑可被 C# WPF 客户端、Python 网络服务端复用单元测试覆盖率达 85%能保证“炸弹”“顺子”等核心规则零误判——这才是工程化交付的底线。我当年第一次跑通ddz.rar时兴奋地截图发给导师结果他问“如果用户在发牌中途 AltTab 切出再切回来牌面会错位吗” 我当场哑火。后来花了两天加OnActivateApp()消息处理和InvalidateRect()区域重绘才搞定。这件事让我明白MFC 斗地主的价值不在“能玩”而在它逼你直面 Windows 消息循环、GDI 绘图生命周期、Socket 状态机这些被现代框架封装的底层契约。它不时髦但每行代码都在回答“操作系统到底怎么调度我的窗口”。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

Quailty与CCPC签到题解析:ACM竞赛算法入门指南
Quailty与CCPC签到题解析:ACM竞赛算法入门指南

我无法根据当前输入内容生成符合要求的博文。原因如下:输入中项目标题为“Quailty and CCPC(杭电多校2019签到题)”,属于算法竞赛领域,特指2019年杭州电子科技大学主办的“中国大学生程序设计竞赛(CCPC&… · 2026/9/23 21:56:01

长截图方法大全:手机电脑十种截长图技巧与避坑指南
长截图方法大全:手机电脑十种截长图技巧与避坑指南

你是不是也遇到过这种尴尬:刷到一个内容很全的页面,想发给朋友,按下截图键,只截到了当前这一屏,往下翻的内容根本没机会进到图里。聊天记录、商品详情、网页文档这类场景,普通截图永远不够用,这… · 2026/9/23 21:55:55

在线打码工具怎么选?本地处理、批量遮挡与隐私安全实操指南
在线打码工具怎么选?本地处理、批量遮挡与隐私安全实操指南

1. 打码这件事,为什么值得单独拿出来聊做内容这行久了,手里攒的图越来越多,截图、素材、聊天记录、证件照、后台数据面板,几乎每天都要跟图片打交道。但凡要把这些图发出去,就绕不开一个动作——打码。给手机号打码、给… · 2026/9/23 21:55:55

cytoscape.js 元素移除详解:cy.remove() 的用法、联动删除机制与恢复原理
cytoscape.js 元素移除详解:cy.remove() 的用法、联动删除机制与恢复原理

数据可视化 【免费下载链接】cytoscape.js Graph theory (network) library for visualisation and analysis 项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js 点击查看 免费下载 导读 本文基于 cytoscape.js 官方文档中关于 core 级 remove 方法的说明… · 2026/9/24 6:47:09

Formily Vue 自定义组件中的 RecursionField 自增列表递归实战:从 useField 到递归渲染
Formily Vue 自定义组件中的 RecursionField 自增列表递归实战:从 useField 到递归渲染

前端UI组件 【免费下载链接】formily 📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 6:46:50

Prisma 1 CLI 参考:`prisma account` 命令——查看 Prisma Cloud 账号信息
Prisma 1 CLI 参考:`prisma account` 命令——查看 Prisma Cloud 账号信息

后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 prisma account 是 Prism… · 2026/9/24 6:46:32

ESP32开发环境5分钟搭建:PlatformIO离线包完整指南
ESP32开发环境5分钟搭建:PlatformIO离线包完整指南

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

Docker 部署 Doris 存算分离集群实战:架构拆解与避坑指南
Docker 部署 Doris 存算分离集群实战:架构拆解与避坑指南

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

差分进化算法做无人机三维路径规划:Python实现与避坑指南
差分进化算法做无人机三维路径规划:Python实现与避坑指南

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

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码