高仿麻将小程序源码拆解:胡牌算法与状态机实战解析
简介高仿麻将游戏小程序源码与配套教程面向微信小程序开发者和游戏编程爱好者可帮助从零实现麻将规则、界面交互与随机流程。压缩包共16个文件以10张PNG运行截图为主辅以WXSS样式、JS业务逻辑、WXML页面结构和JSON配置整体仅52KB轻量紧凑便于逐文件对照学习页面与逻辑代码分离结构清晰。目前已有813人学习下载。源码重点包含骰子随机模块涉及随机数生成与概率控制配合界面截图能直观理解洗牌、发牌、碰、杠、胡等核心玩法的程序实现详细教程由浅入深涵盖小程序生命周期、事件绑定、状态管理、页面布局及数组存储等知识点并配有运行截图辅助解读界面效果。无论是入门游戏开发、练习微信小程序还是作为课程设计参考都能从中掌握一套完整的游戏构建思路与排错方法。1. 高仿麻将游戏不只是 UI 还原更是一套可以跑通的小程序源码如果你搜过「麻将小程序源码」大概率见过一堆号称高仿的项目但真正下载下来能直接跑起来、跑起来以后能正常胡牌算番的并不多。这份「高仿麻将游戏附详细教程小程序源码.zip」我拆过两遍第一遍当普通项目扫第二遍是想弄明白它的牌局逻辑到底是不是完整实现的。结论是它比大多数「只有页面没有逻辑」的演示工程要扎实至少底层的发牌、碰杠、胡牌检测都是真代码不是摆拍。适合谁如果你是刚入行小程序开发、想找一份带完整状态机的游戏项目练手或者想在现有业务里嵌一个麻将模块做社交裂变这份资源都值得花一晚上拆一拆。它解决的核心问题就是「怎么用小程序原生框架写一个带完整牌型判定的棋牌游戏」而不是只剩一张截图。2. 先拆清单这份源码包里到底有什么选型依据是什么2.1 文件结构一眼看出作者的工程习惯解压后第一件事不是打开项目而是先看目录。这份源码的根目录结构大致是这样mj-game/ ├── pages/ │ ├── index/ # 房间列表与登录入口 │ ├── game/ # 对局主页面含棋盘渲染与交互 │ └── result/ # 结算页展示番数与积分变化 ├── components/ │ ├── mahjong-tile/ # 单张牌的自定义组件 │ └── action-bar/ # 碰/杠/胡/过 操作栏 ├── utils/ │ ├── deck.js # 牌组生成与洗牌算法 │ ├── rules.js # 胡牌判定、番型计算 │ └── ai.js # 简单托管出牌逻辑 ├── app.js ├── app.json └── project.config.json这个结构最明显的特点是「页面 — 组件 — 工具函数」三层分离。页面只负责渲染和数据绑定对局的核心逻辑全部下沉到utils里的纯 JavaScript 模块。这个选型我很认同——小程序页面生命周期复杂如果把胡牌判定写在 Page 里后续调试每次都要重新编译预览会非常痛苦。拆成纯函数之后你甚至可以在 Node 环境里直接跑规则单元测试不用打开开发者工具。2.2 为什么用原生小程序而不是游戏引擎现在做棋牌游戏很多人一上来就选 Cocos 或者 Laya但那份源码用的是微信小程序原生框架加 Canvas 渲染。这里有个很现实的选型理由如果是做轻度社交棋牌原生小程序在传播路径上天然短——分享卡片点开即玩不需要下载额外容器。对这份源码的定位来说原生方案已经够了而且代码可读性比引擎项目好很多。另一个点是自定义组件。牌桌上一共有 34 种牌面加上暗牌、亮牌、操作按钮如果用 template 写会非常啰嗦用components/mahjong-tile封装后每张牌就是一个独立组件属性只接收tileId和faceUp内部根据tileId映射到对应的图片资源。这样在game.wxml里写牌墙的代码量就少很多循环渲染时只需要维护一个牌数组。2.3 牌型数据怎么组织一维数组里藏玄机翻到utils/deck.js它的牌组表示很有意思不是用对象数组而是用一维数字数组。每张牌用一个整数编码约定0-8 是万子9-17 是条子18-26 是筒子27-33 是风牌和箭牌。这个编码规则是整个项目的基础胡牌、碰杠、听牌检测全部依赖它。// utils/deck.js function createDeck() { const deck []; for (let tile 0; tile 34; tile) { // 每种牌 4 张 for (let i 0; i 4; i) { deck.push(tile); } } return shuffle(deck); } function shuffle(arr) { // Fisher-Yates 洗牌保证每个排列等概率 for (let i arr.length - 1; i 0; i--) { const j Math.floor(Math.random() * (i 1)); [arr[i], arr[j]] [arr[j], arr[i]]; } return arr; }这里的createDeck()很直白34 种牌每种 4 张一共 136 张然后调用shuffle()做 Fisher-Yates 洗牌。这个洗牌算法建议不要改成sort(() Math.random() - 0.5)这种写法虽然代码更短但概率分布不均匀在牌局这种场景里可能会被老玩家察觉到「某些牌出现得太集中」。用 Fisher-Yates 每张牌落到每个位置的概率是完全相等的。拿到 136 张牌的数组后接下去就是按座位发牌。源码里的实现是按顺序切牌每人 13 张庄家 14 张function deal(deck, players, dealerIndex) { let cursor 0; // 每人 13 张 for (let round 0; round 13; round) { for (let p 0; p players.length; p) { players[p].hand.push(deck[cursor]); } } // 庄家多拿一张 players[dealerIndex].hand.push(deck[cursor]); // 剩下的牌就是牌墙 return deck.slice(cursor); }注意deal之后返回的是deck.slice(cursor)也就是说牌墙是原数组的剩余部分不是再次洗牌。这块逻辑在多人对局时需要保证players数组的顺序和座位顺序一致否则发牌位置会错乱。3. 胡牌检测算法拆解源码里最值钱的 100 行代码3.1 从「能否胡」到「胡什么」一码两用的设计utils/rules.js里核心函数是canWin(hand)和calcFan(hand, melds)。前者判断手牌能否构成胡牌牌型后者计算具体番数。这两个函数共用一个拆牌器splitTiles逻辑是先把牌按类型分组再尝试去掉一个雀头把剩下的牌拆成若干组顺子或刻子。// utils/rules.js function canWin(hand) { const counts new Array(34).fill(0); hand.forEach((t) counts[t]); for (let i 0; i 34; i) { if (counts[i] 2) { // 先假设这张牌是雀头 counts[i] - 2; if (isMeldsPossible(counts)) { return true; } counts[i] 2; // 回溯 } } return false; }这段代码用了回溯先枚举每一张可能作为雀头的牌把它的数量减 2接着判断剩下的牌能否全部组成面子。注意回溯时一定要把counts[i]加回来这个细节最容易漏漏了的结果就是误判。再往下isMeldsPossible是按牌型顺序优先拆刻子再拆顺子function isMeldsPossible(counts) { for (let i 0; i 34; i) { if (counts[i] 0) continue; // 优先拆刻子 if (counts[i] 3) { counts[i] - 3; if (isMeldsPossible(counts)) return true; counts[i] 3; } // 尝试拆顺子注意风牌和箭牌不能拆顺子i 26 if (i 26 i % 9 6 counts[i] 0 counts[i1] 0 counts[i2] 0) { counts[i]--; counts[i1]--; counts[i2]--; if (isMeldsPossible(counts)) return true; counts[i]; counts[i1]; counts[i2]; } // 如果这张牌既不能拆刻子也不能拆顺子直接失败 if (counts[i] 0) return false; } return true; }这段代码的思路是深搜从左到右扫描所有牌型遇到第一张剩余牌就先尝试刻子、再尝试顺子。这里有一个非常关键的裁剪i % 9 6保证了只有万、条、筒这三种花色里点数不超过 7 的牌才可能作为顺子的第一张。风牌27-33因为i 26直接跳过顺子判断只能做刻子或雀头。如果要问「胡牌判定最快的方式是什么」那一定是预处理所有可能的胡牌牌型然后查表。但那份源码用递归好处是内存占用极低而且逻辑直接对应规则不是黑匣子。坏处是递归层数在极端牌型下可能到 20 层但 JS 引擎处理这种深度的递归没有任何问题。3.2 听牌检测拿着canWin做穷举源码里ai.js的findWaits(hand)函数很朴素但很实用// utils/ai.js function findWaits(hand) { const waits []; for (let tile 0; tile 34; tile) { const testHand hand.concat([tile]).sort((a, b) a - b); if (canWin(testHand)) { waits.push(tile); } } return waits; }这就是枚举 34 种牌每张加到手牌里调用一次canWin。理论上最坏情况 34 次胡牌判定每次判定是回溯整体复杂度完全可接受。但这里要注意hand.concat([tile])生成的是新数组不会污染原数据这是对的如果你在这个地方贪省事直接hand.push(tile)后面再pop()就很容易在异步场景里出现脏数据。这个findWaits在游戏里的用途是给托管 AI 出牌提供依据AI 先模拟打出每一张手牌然后算听牌数选择听牌张数最多的那一手。源码里 AI 出牌策略大概是这个逻辑虽然算不上强 AI但作为新手学习「遍历 评估」的框架完全够了。3.3 番型计算从零到「清一色」需要几行代码除了胡牌源码里还有calcFan扫描手牌和副露melds来判断是否满足特定番型。它支持的番型包括碰碰胡、清一色、七对以及基础的平胡。function calcFan(hand, melds, winTile) { let fan 1; // 默认平胡 const allTiles hand.concat(melds.flat()); const suitSet new Set(allTiles.map((t) Math.floor(t / 9))); if (suitSet.size 1) fan 6; // 清一色 // 七对判断 if (isSevenPairs(hand)) fan 4; return fan; }它的判花逻辑是看所有牌落在哪个 suit 区间Math.floor(t / 9)对 0-8 返回 09-17 返回 118-26 返回 227-33 返回 3。如果最终集合大小不超过 1说明所有牌都在同一个花色里那就是清一色。这里 27-33 的风牌会被归到 suit 3所以风牌清一色也能被正确识别算是个严谨的细节。需要提醒的是这份源码的番型表并不完整缺少像「杠上开花」「海底捞月」这类特殊番型。如果你要拿它做商业游戏需要自己扩展calcFan。扩展的方式建议把番型判断拆成独立函数每个函数接收hand、melds、winTile三个参数返回{ name, fan }或null然后在一个const checkers [...]数组里依次执行。4. 对局流程控制状态机与倒计时模块的协同工作4.1 从一个 Page 到多个 Stage状态机拆解对局页面最怕的就是逻辑堆成一坨。那份源码的做法是把游戏状态拆成几个阶段DEALING发牌、DRAWING摸牌、ACTING操作中、DISCARDING出牌、SETTLING结算。// pages/game/game.js const GameState { DEALING: DEALING, DRAWING: DRAWING, ACTING: ACTING, DISCARDING: DISCARDING, SETTLING: SETTLING }; Page({ data: { currentState: GameState.DEALING }, onLoad() { this.initGame(); this.setState(GameState.DEALING); }, setState(state) { this.setData({ currentState: state }); this.onStateEnter(state); }, onStateEnter(state) { switch (state) { case GameState.DEALING: this.dealAndRender(); break; case GameState.DRAWING: this.autoDraw(); break; default: break; } } });这个状态机的价值在于每一个setState都强制进入一个统一的入口onStateEnter。所有由状态变更触发的逻辑都收敛在这一点不会出现「在按钮点击事件里直接调发牌函数」这种失序调用。后续不管是加托管超时还是断线重连都是往状态机里塞新状态而不是往现有函数里打补丁。这里有个值得学习的小细节setState方法名故意避开了小程序内置的setData避免混淆。我见过不少项目在 Page 里自定义setState直接覆盖了 React 的习惯但在小程序里和setData并存会很容易搞混这份源码的做法是正确示范。4.2 倒计时托管模块setInterval 的正确打开方式棋牌游戏必须有出牌倒计时超时自动托管。源码里计时器单独抽了一个模块没有散落在 Page 里// utils/timer.js class TurnTimer { constructor(onTimeout, duration 15000) { this.onTimeout onTimeout; this.duration duration; this.timer null; } start() { this.stop(); this.timer setTimeout(() { this.onTimeout(); }, this.duration); } stop() { if (this.timer) { clearTimeout(this.timer); this.timer null; } } }这里的倒计时用的是setTimeout而不是setInterval。原因很简单每一轮的操作时间窗口是独立的在轮到自己之前不应该有任何计时器在跑。用setTimeout配合每次start()前先stop()清掉旧计时器能避免上一轮的计时器在下一轮触发导致逻辑错乱。在小程序里尤其要注意setTimeout在页面切到后台时会被系统冻结等回到前台才会继续计时。如果计时器时间很长比如 15 秒用户切后台再回来会发现倒计时不准。常见做法是在onHide里记录剩余时间在onShow里重置新计时器但这份源码没有处理这个边界属于一个已知的小坑。4.3 碰杠交互操作仲裁的优先级逻辑在麻将规则里当某位玩家出牌后其他三家可能同时有「碰」「杠」「胡」的需求优先级是胡 杠 碰且只有离出牌者最近的下家能优先操作。这份源码里操作按钮并不是每次都全部亮起而是由checkActions函数根据当前手牌和出牌计算// pages/game/game.js function checkActions(hand, discardedTile) { const actions []; if (canPeng(hand, discardedTile)) actions.push(peng); if (canGang(hand, discardedTile)) actions.push(gang); if (canHu(hand, discardedTile)) actions.push(hu); // 按 胡 杠 碰 的顺序排序 return actions.sort((a, b) priority[a] - priority[b]); }排序actions.sort保证了按钮展示顺序但实际仲裁逻辑是往后端或者本地轮询推进的。这里有个细节canPeng和canGang判断的只是「这张牌能不能组成副露」没有判断副露之后手牌是否完整因为碰和杠本来就可以破坏胡牌结构不需要完整。新手容易在这里犯迷糊「我碰完这张牌手牌不就乱了吗」——碰杠本身就是破坏手牌结构来换取番数所以源码的处理是正确的。5. 避坑与常见问题拆这份源码不得不说的 6 个血泪教训5.1 牌墙发到最后几张时报数组越界现象游戏进行到中后段某一方摸牌时报TypeError: Cannot read property of undefined。原因发牌时deal函数返回的牌墙数组是固定长度的但源码里没有判断牌墙剩余数量。有些牌型比如四杠会让牌墙消耗特别快再加上初始发牌逻辑假设了 136 张的完整牌组。解决摸牌前强制加一个牌墙数量判断剩余不足时直接进入流局或重新洗牌。这是棋牌项目通用底线判断任何牌局都必须有的防御逻辑。function drawFromWall(wall) { if (wall.length 0) { // 流局处理 return null; } return wall.pop(); }5.2setData传大数组卡顿现象手牌 13 张每次玩家摸一张或打一张整个setData刷新明显卡顿尤其在低端安卓机上。原因源码一开始就把整副手牌数组全量setData到视图层。小程序setData是走序列化通道的数据量一大就慢。解决只 diff 变更的牌。比如摸牌后只需要在牌墙数组尾部追加一张牌this.setData({ gameState.playerHand[0]: newHand });另一个常见做法是给每张牌生成唯一的tileKey然后让setData只更新变化的 index。建议全文检索所有setData凡是传整个数组的地方都改成字段路径。5.3 胡牌判定把「七对」漏判现象某开发者拿 7 个对子去调canWin返回false。原因源码回溯的isMeldsPossible只能识别「雀头 面子」的标准型七对是特殊牌型需要单独判断。这也是很多麻将项目的通病——试遍手牌找不到雀头就返回 false完全没考虑特殊牌型。解决canWin开头加一段function isSevenPairs(hand) { const counts new Array(34).fill(0); hand.forEach((t) counts[t]); return counts.every((c) c 0 || c 2); }别忘了国标麻将里七对不能有碰杠副露有副露时这个函数要跳过。5.4 玩家切后台导致倒计时失控现象用户把小程序切到后台再回来出牌倒计时变成负数。原因小程序后台会冻结setTimeout回调计时器挂起。回到前台时回调立刻触发但如果这个回调已经执行过一次可能因为脏状态导致重复出牌或重复摸牌。解决在onHide里记录Date.now()在onShow里用「剩余时间 duration - (now - startTime)」重算倒计时。源码没有做这个我一般拿到任何带倒计时的小程序都会立刻补上这段。5.5 分享卡片参数没传到对局页现象用户从分享卡片进入加载不到房间号和座位号页面白屏。原因分享路径path里的 query 参数需要在onLoad里用options读取但如果页面是冷启动的options会带上参数如果是热启动onShow里再拿options可能就是空的。解决把参数读取统一放到onLoad并且在每次onShow时做一次校验房间号缺失就返回首页重新选择。5.6 音频资源包体过大影响加载现象小程序包体接近 2MB 限制审核本地生活类目时被打回。原因素材资源牌面图片、碰杠音效没有压缩甚至放了几张 1MB 以上的背景图。解决用工具批量压缩图片并把声音片段压成 32kbps 的 AAC 或 MP3保证单段音频不超过 50KB。这份源码如果要做上线包装资源压缩是必走的一步。6. 继续往下走给这份源码加上「点炮溯源」与对局回放关于对局回放我在这份源码上加过一个很小的功能模块可以复用到你自己的项目里。核心思路是录制事件流而不是录视频每次操作记录一个对象序列之后按时间戳回放。// utils/recorder.js const events []; function record(type, payload) { events.push({ type, // draw | discard | peng | gang | hu payload, ts: Date.now() }); } function replay(onEvent, speed 1) { let idx 0; const step () { if (idx events.length) return; const ev events[idx]; onEvent(ev); setTimeout(step, ev.duration / speed); }; step(); }加这个模块时有一个强制原则事件流不能依赖视图层状态录制和回放都只和utils层打交道。比如「摸牌」这个动作录制时记的是「从牌墙第 index 张摸到 tileId」回放时按同样顺序从头模拟牌墙和手牌的变化而不是把当前手牌状态拍个快照。这样即使中途有一步逻辑算错回放也能暴露问题。配合这个模块你可以再做一个简单的「点炮溯源」工具把牌桌上的所有出牌记录、碰杠记录按时间排序在 Ai 托管出牌时自动比对哪一张是放枪牌。听起来复杂其实核心代码很短拿到玩家的手牌遍历牌墙里出过的牌按最近出牌顺序判断哪一张能胡即可。这个工具用来排查 AI 托管时的弱智操作特别好用能直观看到某一手该不该冲。如果你决定把这份源码用于实际项目有几个习惯建议固化下来。第一个每次改动rules.js后用 Node 直接跑单元测试不要只靠手点界面验证一个npm test能跑完几千个牌型的断言比人工肉眼试牌快得多。第二个日志里保留一份完整的事件流线上对局出了问题能精确回放到问题节点。第三个开牌前先明确要支持的番型表然后针对每一条番型写对应的测试用例文件不要等做完了再补。从那以后我每次拿到棋牌类源码都会强制走一遍这套流程先跑胡牌检测的单元测试再模拟十局看日志链路是否完整最后检查牌墙耗尽边界。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

NumPy手写GMM:从概率建模到数值稳定实现

NumPy手写GMM:从概率建模到数值稳定实现

1. 项目概述:为什么用NumPy手写GMM,比直接调sklearn更有价值?“numpy实现周志华机器学习 9.4.3 高斯混合聚类(GMM算法)”——这个标题背后不是一次简单的代码复现,而是一次对概率建模底层逻辑的深度拆解。我…

2026/10/13 12:44:48 阅读更多 →
STM32F103手写FFT频谱仪:雷德算法+0.96 OLED波形显示

STM32F103手写FFT频谱仪:雷德算法+0.96 OLED波形显示

简介:这是一份面向嵌入式初学者与电子类毕设学生的STM32F103开源项目,聚焦波形显示与频谱分析,采用个人原创的雷德(Radix)算法实现FFT。项目基于ST标准外设库开发,驱动0.96寸SPI接口OLED,ADC1以…

2026/10/13 12:44:48 阅读更多 →
Kruise 版本发布流程全解析:从 Changelog、镜像构建到 Helm Chart 上线的完整操作指南

Kruise 版本发布流程全解析:从 Changelog、镜像构建到 Helm Chart 上线的完整操作指南

云原生容器编排微服务运维 【免费下载链接】kruise Automated management of large-scale applications on Kubernetes (incubating project under CNCF) 项目地址: https://gitcode.com/gh_mirrors/kr/kruise 点击查看 免费下载 OpenKruise(Kruise&…

2026/10/13 12:44:48 阅读更多 →

最新新闻

双狐软件构造成图全流程:从数据加载到批量出图的避坑指南

双狐软件构造成图全流程:从数据加载到批量出图的避坑指南

简介:这份资源围绕双狐软件在地质成图与地球物理勘探中的应用展开,面向地质、石油工程领域的技术人员及需要编制构造图的学习者,帮助解决从基础数据准备到成图输出的完整流程问题。压缩包内共1个PDF文件,约646KB,以图文…

2026/10/13 13:21:55 阅读更多 →
轻量级口罩佩戴检测系统:MobileNetV2+SSD Lite实战部署

轻量级口罩佩戴检测系统:MobileNetV2+SSD Lite实战部署

1. 项目概述:一个真实可落地的口罩佩戴检测系统,不是Demo,是能跑在普通笔记本上的完整方案 “【武汉加油!中国加油!】挑战七天 实现机器视觉检测有没有戴口罩系统——第一二三天”——这个标题乍看像一次应景的公益技术…

2026/10/13 13:21:55 阅读更多 →
vLLM生产环境多模型并发部署实战:显存规划、参数调优与稳定性加固

vLLM生产环境多模型并发部署实战:显存规划、参数调优与稳定性加固

1. 项目缘起与整体架构思路 1.1 为什么要在生产环境自建推理服务 最早接触这个需求,是因为团队手上同时跑着好几个模型:一个负责长链推理的 DeepSeek-R1 蒸馏版本,一个负责日常对话和结构化输出的 Qwen3 系列,还有一个做向量化的…

2026/10/13 13:21:55 阅读更多 →
解决业务层缓存Key冲突:从线上事故到统一建模规范

解决业务层缓存Key冲突:从线上事故到统一建模规范

做后端开发的同学,十有八九都遇到过这种诡异的线上问题:系统一直跑得好好的,突然某一天开始,一部分用户看到的价格不对,或者某个状态莫名其妙被重置,数据库查不出异常,接口入参也没毛病&#xf…

2026/10/13 13:21:55 阅读更多 →
从源程序到CPU执行:深入理解编译链接与指令流水线

从源程序到CPU执行:深入理解编译链接与指令流水线

1. 项目概述:从一行代码到CPU轰鸣,我们到底经历了什么?“1.2.4 计算机的工作过程”这个编号看起来像教科书里一个不起眼的小节,但如果你真把它当普通知识点跳过,那等于在拆解一辆法拉利时只看了车标——你根本不知道引…

2026/10/13 13:21:55 阅读更多 →
Embabel框架:从LLM手中拿回Agent决策权的工程实践

Embabel框架:从LLM手中拿回Agent决策权的工程实践

1. 为什么要把决策权从LLM手里拿回来第一次接触Embabel这个框架的时候,我脑子里冒出来的第一个疑问就是:现在大家都在拼命把决策权往LLM手里塞,恨不得让模型自己规划、自己调工具、自己反思,怎么还有人反着来,专门做一…

2026/10/13 13:20:53 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →