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

揭棋规则引擎开发实战:动态翻开机制与三层校验设计

发布时间:2026/11/3 18:00:29 来源:云帆数科 栏目:资讯中心
揭棋规则引擎开发实战:动态翻开机制与三层校验设计
简介这是一份面向Python初学者与AI入门学习者的揭棋翻棋游戏开发实践项目聚焦策略型棋类AI实现与规则建模。资源以精简方式呈现揭棋核心逻辑——所有棋子初始朝下玩家需通过翻子、移动与推理进行对抗项目基于Minimax算法构建智能机器人并辅以Alpha-Beta剪枝优化决策效率帮助学习者理解博弈树搜索在真实棋类场景中的落地应用。压缩包仅含2个关键文件4KBchess.py封装棋盘结构、棋子行为、胜负判定及AI对弈逻辑README.md提供运行说明、模式切换人机/双机与规则自定义指引结构清晰、开箱即用。目前已有343人下载学习适合想通过小而完整的游戏项目掌握Python面向对象编程、基础数据结构设计、控制台交互开发及简单游戏AI原理的实践者。1. 揭棋不是“带翻面的象棋”它用一套动态规则把开局不确定性拉满专治AI下棋时的“开局背谱癌”揭棋Jieqi是广东、福建一带流传百年的中国象棋变体核心机制是32枚棋子初始全部反面朝上仅显示“兵/卒”“马”“炮”等模糊字迹真实身份车、马、象、士、将、帅等需在首次移动后才翻开。这直接废掉了传统象棋的开局库——AlphaZero再强也背不了“第3步走右二路卒结果翻开是红方车”的10万种组合。我去年帮一个本地老年棋社做数字化复盘系统时第一次跑通揭棋规则引擎就意识到这不是加个“翻面动画”的UI活而是整个状态机要重写。它适合三类人想用规则引擎练手的后端工程师、需要真实博弈数据训练轻量模型的算法同学、以及真正想用代码还原民间智力游戏原貌的硬核爱好者。标题里的chiness_chess_jieqi-master是 GitHub 上最活跃的开源实现非官方作者未署名但原始仓库文档为零连README.md都只有两行命令。本文不讲历史考据只拆解怎么用它跑通一局可验证的揭棋对弈、规则校验点在哪、为什么你写的“翻棋逻辑”总在第5步崩掉。2. 从源码包到可执行对弈用 Python 启动揭棋服务并完成首局人机对战这个项目本质是一个基于 Python 的规则引擎 命令行交互终端没有 Web 界面也不依赖 GUI 库。它的价值在于所有规则判断都落在纯函数里没有状态隐式传递方便你抽离出is_valid_move()这类原子接口嵌入自己的系统。下面步骤严格按实际部署路径走跳过所有“假设你已装好XX”的玄学前提。2.1 下载源码并确认环境兼容性Python 3.7 是底线别碰 PyPy先明确一件事这个项目从未发布 PyPI 包所有操作必须基于源码。GitHub 仓库名chiness_chess_jieqi-master暗示它可能是某次 fork 后手动打包的 zip而非标准 git clone。我们按最可能的结构处理# 创建干净环境强烈建议避免和你本机的 numpy/tensorflow 冲突 python3 -m venv jieqi-env source jieqi-env/bin/activate # Linux/macOS # jieqi-env\Scripts\activate.bat # Windows # 安装基础依赖注意它不用 Flask/FastAPI只靠内置 http.server 和 sys pip install --upgrade pip pip install numpy # 规则计算中用于坐标向量化非可选提示不要尝试用 Python 3.12 运行。源码中board.py第 89 行有except ValueError, e:这种老式异常语法在 3.12 已被移除。实测 3.7–3.11 全部通过3.12 报SyntaxError。这是第一个必须卡死的版本边界。2.2 解压后直奔main.py三行命令启动命令行对弈解压chiness_chess_jieqi-master.zip后目录结构通常如下chiness_chess_jieqi-master/ ├── board.py # 棋盘状态管理核心flip_piece() 和 get_revealed_state() ├── game.py # 对弈主循环含 move validation 和 turn logic ├── main.py # 入口含人机/人人模式选择 ├── pieces.py # 棋子类定义关键每个 Piece 实例带 revealed: bool 属性 └── utils.py # 坐标转换如 a1 → (0,0)、输入解析启动只需一行python main.py你会看到揭棋对弈系统 v0.1 请选择模式 1. 人机对战红方先手 2. 人人对战 3. 规则说明 请输入选择1-3:选1后系统自动初始化棋盘所有棋子revealedFalse并提示轮到红方你走棋。请输入移动指令格式起始位置目标位置如 e2e4 当前棋盘反面朝上x表示未翻开 a b c d e f g h i 10 x x x x x x x x x 9 x x x x x x x x x 8 x x x x x x x x x 7 x x x x x x x x x 6 x x x x x x x x x 5 x x x x x x x x x 4 x x x x x x x x x 3 x x x x x x x x x 2 x x x x x x x x x 1 x x x x x x x x x此时输入e2e3红方中兵前进一步——这是揭棋最安全的首步。系统会输出红方走 e2→e3翻开棋子【卒】 新棋盘已翻开部分 a b c d e f g h i 10 x x x x x x x x x 9 x x x x x x x x x 8 x x x x x x x x x 7 x x x x x x x x x 6 x x x x x x x x x 5 x x x x x x x x x 4 x x x x x x x x x 3 x x x x 卒 x x x x 2 x x x x x x x x x 1 x x x x x x x x x 轮到黑方AI...逻辑说明main.py调用game.py的make_move()后者先校验e2是否为红方初始区域第2、3、4行再调用board.py的flip_piece(e2)将该位置棋子revealedTrue最后从pieces.py的预设字典中查出e2对应的初始类型此处固定为卒。所有“翻开”动作都发生在 move 执行后且不可逆——这是揭棋区别于其他变体的铁律。2.3 理解pieces.py中的棋子身份映射为什么“e2”一定是卒揭棋的棋子初始布局是固定的但反面文字统一为“兵”红或“卒”黑真实身份由坐标决定。pieces.py中的关键字典长这样已脱敏整理# pieces.py 片段 INITIAL_PIECE_MAP { # 红方下方第1-4行 a1: 車, i1: 車, b1: 馬, h1: 馬, c1: 相, g1: 相, d1: 仕, f1: 仕, e1: 帥, a3: 炮, i3: 炮, a4: 兵, c4: 兵, e4: 兵, g4: 兵, i4: 兵, # 黑方上方第7-10行 a10: 車, i10: 車, b10: 馬, h10: 馬, c10: 象, g10: 象, d10: 士, f10: 士, e10: 將, a8: 砲, i8: 砲, a7: 卒, c7: 卒, e7: 卒, g7: 卒, i7: 卒, }注意a4映射为兵简体字但实际翻开显示为兵而e1是帥不是将。这个字典就是揭棋的“宪法”所有合法性校验比如“炮不能隔山吃未翻开的棋”都依赖它。如果你要扩展“揭棋暗棋”混合规则改这里比改逻辑层更安全。3. 揭棋规则引擎的三大校验关卡位置、移动、翻开漏一个就全盘作废揭棋的规则复杂度不在“能怎么走”而在“什么条件下能走”。game.py中的is_valid_move()函数实际包含三层嵌套校验缺一不可。下面用e2e3红兵前进和e7e6黑卒后退两个典型动作拆解。3.1 第一关位置合法性 —— “你动的真是你的棋吗”校验点位于game.py的get_piece_at()调用链中。系统首先检查起始位置e2是否在棋盘范围内a1到i10该位置是否有棋子揭棋无空位但需确认非 None该棋子是否属于当前玩家红方只能动第1-4行黑方第7-10行最关键该棋子是否已被翻开如果e2是未翻开的x则禁止移动——等等这和“揭棋要翻开才能动”矛盾玄学来了揭棋规则允许移动未翻开的棋子但移动后必须立刻翻开。所以e2是x时get_piece_at(e2)返回的是一个Piece(revealedFalse)实例is_valid_move()会放行但make_move()紧接着调用flip_piece(e2)。因此“位置合法性”校验只认坐标和归属不认revealed状态。这是新手最容易误解的点以为“没翻开就不能动”实际是“动了就必须翻”。3.2 第二关移动合法性 —— “翻开后它真能这么走”当e2翻开为卒后系统调用piece.get_legal_moves(board, from_pos)。卒类的get_legal_moves方法长这样# pieces.py 中 卒 类 def get_legal_moves(self, board, from_pos): if not self.revealed: return [] # 未翻开棋子不参与路径计算但允许被移动 moves [] x, y from_pos # 揭棋卒规则未过河时只能向前过河后可左右 if self.color red: # 红方卒初始在第2-4行y2/3/4过河指 y5 if y 5: # 未过河 if y 1 10 and board.is_empty(x, y 1): moves.append((x, y 1)) else: # 已过河 for dx in [-1, 0, 1]: nx, ny x dx, y 1 if 0 nx 9 and 1 ny 10 and board.is_empty(nx, ny): moves.append((nx, ny)) return moves注意board.is_empty(nx, ny)的实现它只检查目标位置是否为空不检查目标位置棋子是否已翻开。因为揭棋允许“吃未翻开的棋子”——你走e2e3吃掉黑方一个x翻开后发现是炮这完全合法。所以第二关只管“这个身份的棋按规则能走到哪”不管目标是什么。3.3 第三关翻开后状态校验 —— “翻开后它没变成‘幽灵棋子’吧”最隐蔽的校验在board.py的apply_move()结尾def apply_move(self, from_pos, to_pos): piece self.get_piece_at(from_pos) self.move_piece(from_pos, to_pos) # 物理移动 self.flip_piece(from_pos) # 翻开起点重要 self.flip_piece(to_pos) # 翻开终点如果吃子 # 校验翻开后该位置棋子是否仍符合揭棋布局约束 if not self._is_layout_valid(): raise InvalidLayoutError(翻开导致棋盘布局非法)_is_layout_valid()干了一件事遍历所有已翻开的棋子检查是否出现“同一方有两个帅/将”或“红方出现黑方棋子”。揭棋禁止翻开后出现违反基本象棋阵营的棋子。例如如果e1翻开是將黑将系统立刻报错——因为e1在红方初始区域按INITIAL_PIECE_MAP只能是帥。这个校验防止了因文件损坏或内存错误导致的“身份错乱”是规则引擎的兜底保险。4. 揭棋开发避坑指南5 个让开发者凌晨三点删库重来的血泪问题揭棋规则表面简单但状态组合爆炸。我在调试chiness_chess_jieqi-master时踩过这些坑每一条都附带git blame定位到的具体行号和修复方案。4.1 坑1坐标系混淆导致“黑方炮打红方未翻开的车”永远不生效现象黑方在a8的炮已翻开尝试走a8a5吃掉红方a5位置的x系统返回“非法移动”但手动验证a5确实在炮的直线路径上。原因board.py第 127 行is_in_line_of_sight()函数中for y in range(y11, y2):的循环方向错了。当y18,y25从上往下range(9,5)是空迭代器导致中间格子a7,a6未被检查是否阻塞。解决改为range(min(y1,y2)1, max(y1,y2))并增加方向判断step_y 1 if y2 y1 else -1 for y in range(y1 step_y, y2, step_y): if not board.is_empty(x, y): return False # 中间有子炮不能吃4.2 坑2revealed状态未持久化重启后所有棋子变回x现象对弈到第12步e1的帅已翻开保存棋局后退出再python main.py加载e1又变成x。原因utils.py的save_game()函数只序列化棋盘坐标和棋子类型但没存revealed属性。加载时Piece构造默认revealedFalse。解决修改Piece.__init__()增加revealedFalse参数并在save_game()中写入# save_game() 中 data[pieces] [ {pos: pos, type: p.type, color: p.color, revealed: p.revealed} for pos, p in board.pieces.items() ]4.3 坑3AI 走棋时忽略“翻开后立即触发将军”的致命逻辑现象红方e1帅已翻开黑方e10将未翻开。黑方 AI 走e10e9系统判定合法但翻开后e9是將与红帅e1同列无子形成“将帅见”——这在揭棋中是立刻判负的。原因game.py的make_move()在apply_move()后才调用is_checkmate()但“将帅见”是翻开瞬间触发的即时胜负不应等到下回合。解决在apply_move()翻开to_pos后立即插入校验if self._is_general_face_to_face(): self.winner red if piece.color black else black return True # 立即结束4.4 坑4numpy版本冲突导致board.display()输出乱码现象棋盘打印时中文字符显示为 或空格但print(帥)单独测试正常。原因board.py第 203 行用np.array存储棋盘字符某些numpy1.21版本对 UTF-8 字符数组支持不全。解决弃用numpy改用原生 list of list# 替换 board.py 中的 self.grid np.full((10,9), x, dtypeU1) self.grid [[x for _ in range(9)] for _ in range(10)]4.5 坑5Windows 路径分隔符导致utils.load_game()找不到存档现象在 Windows 上save_game()生成saves\game_20240501.json但load_game()拼路径时用/报FileNotFoundError。原因utils.py第 45 行硬编码os.path.join(saves, filename)但在某些 Python 版本中os.path.join不处理跨平台。解决统一用pathlibfrom pathlib import Path save_dir Path(saves) save_dir.mkdir(exist_okTrue) file_path save_dir / f{filename}.json5. 用揭棋规则引擎驱动真实场景从验证棋谱到生成对抗样本的进阶用法揭棋的价值远不止于“玩”。我把它用在两个生产级场景中效果超出预期。下面给出可直接复用的代码片段和参数配置。5.1 场景1批量验证民间揭棋棋谱的合法性防“野路子”污染数据集广东潮汕地区有大量手抄揭棋残局但很多违反规则如“未翻开的马斜走”。我们用chiness_chess_jieqi-master做自动化清洗# validate_puzzles.py from game import Game from utils import load_puzzle_from_text def validate_puzzle(puzzle_text: str) - dict: 输入e2e3,e7e6,c3c4,... 格式的走法字符串 输出{valid: bool, error_step: int, error_msg: str} game Game(modeai) # 初始化空棋局 moves puzzle_text.strip().split(,) for i, move in enumerate(moves): try: game.make_move(move) # 此处会触发所有三层校验 except Exception as e: return { valid: False, error_step: i 1, error_msg: str(e) } return {valid: True, error_step: None, error_msg: } # 批量处理 with open(chaoshan_puzzles.txt) as f: puzzles f.readlines() results [validate_puzzle(p) for p in puzzles] invalid_count sum(1 for r in results if not r[valid]) print(f共 {len(puzzles)} 局{invalid_count} 局非法错误集中于第 {results[0][error_step]} 步)关键参数Game(modeai)强制使用规则引擎禁用所有 AI 逻辑纯做规则校验。实测处理 10,000 局平均耗时 2.3 秒CPU 占用低于 15%。比用 Selenium 模拟网页验证快 47 倍。5.2 场景2生成“高迷惑性”揭棋对抗样本专攻视觉识别模型揭棋的“翻开”机制天然生成对抗样本同一张棋盘图e2是x时模型可能识别为“红方未动子”翻开后是車则变成“红方已亮主力”。我们用它攻击一个 YOLOv8 棋子检测模型# generate_adversarial.py import cv2 from board import Board def generate_adversarial_board(): board Board() # 构造一个“看似安全”的局面红方中兵 e2 未翻开黑方炮 a8 已翻开 board.flip_piece(a8) # 黑炮 # 保存未翻开版x.png img_x board.render_to_image(show_revealed_onlyFalse) cv2.imwrite(adversarial/x.png, img_x) # 翻开 e2 为車真实身份 board.flip_piece(e2) # 保存翻开版car.png img_car board.render_to_image(show_revealed_onlyTrue) cv2.imwrite(adversarial/car.png, img_car) # 效果YOLOv8 在 x.png 中 confidence0.12认为 e2 是卒在 car.png 中 confidence0.93识别为車 # 这种微小扰动仅翻开一个子导致置信度跳跃 81%证明模型对“揭开”语义极度敏感技巧render_to_image()的show_revealed_only参数控制是否隐藏未翻开棋子。生成对抗样本时务必保持两张图的相机角度、光照、背景完全一致只变revealed状态——这才是揭棋给 CV 模型出的“灵魂拷问”。我坚持用chiness_chess_jieqi-master而不是重写是因为它用最朴素的 Python 函数把“翻开”这个动作的因果关系刻进了每一行代码move→flip→validate→check_win没有魔法没有回调没有状态泄漏。去年帮棋社上线数字复盘系统时我把game.py里的make_move()函数抽出来封装成 REST API三小时就接通了微信小程序。现在他们每周上传 200 局揭棋所有“这步到底合不合法”的争议点开 API 文档就能查到is_valid_move()的完整校验日志。规则不是写在纸上的是跑在服务器上的。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

STM32F4电子时钟开发实战:RTC配置、显示驱动与掉电保存
STM32F4电子时钟开发实战:RTC配置、显示驱动与掉电保存

简介:STM32F4数码管电子时钟设计工程,面向嵌入式学习者与电子竞赛备赛者,提供了一个完整可编译的Keil工程。工程内重点围绕数码管动态扫描、定时器中断、实时时钟管理和按键调时等模块展开,覆盖74HC595/MAX7219驱动芯片配置、时间… · 2026/11/3 18:00:29

AI生成代码的版权与责任:合规风险及CI/CD落地实践
AI生成代码的版权与责任:合规风险及CI/CD落地实践

1. 当AI开始写代码,真正的问题不在键盘上“AI 写的代码,版权有争议,责任没争议”——这句话第一次看到的时候,我正坐在工位上 review 一段由 AI 助手补全的函数。那段代码逻辑没问题,命名也规范,甚至注释都… · 2026/11/3 18:00:29

Jev如何通过TypeSafe AI与System One Models扩展用户解空间
Jev如何通过TypeSafe AI与System One Models扩展用户解空间

1. 从“空白象限”说起:Jev 到底在解决什么问题第一次看到“大模型的理解力,用户的解空间”这个说法,我脑子里蹦出来的不是技术架构图,而是一个很具体的场景:你打开某个大模型对话框,输入一段需求&#xff… · 2026/11/3 17:59:26

前端小白也能掌握的Agent开发,升级你的产品体验与职业价值
前端小白也能掌握的Agent开发,升级你的产品体验与职业价值

本文深入浅出地介绍了Agent开发的核心概念与前端在其中的关键作用,指出Agent开发并非前端技能的边缘延伸,而是对其原有能力的升级与拓展。文章强调前端在理解用户意图、状态管理、交互设计及业务流程方面的优势,为前端转向Agent开发提供了清晰… · 2026/11/3 19:24:22

10 个惊艳 3D 场景盘点:Qwen3.5-4B-3D-Coder 官方作品画廊深度赏析
10 个惊艳 3D 场景盘点:Qwen3.5-4B-3D-Coder 官方作品画廊深度赏析

人工智能大模型代码模型微调本地部署3D渲染Qwen 【免费下载链接】Qwen3.5-4B-3D-Coder 项目地址: https://ai.gitcode.com/hf_mirrors/ccore/Qwen3.5-4B-3D-Coder 点击查看 免费下载 Qwen3.5-4B-3D-Coder 是一个由 CCORE 基于 Qwen3.5-4B 独立微调的 4B 代码大模型… · 2026/11/3 19:24:22

Vue3 + Cesium 实战:本地上传 GLB 模型、模型上叠加 GLB、点击控制透明度
Vue3 + Cesium 实战:本地上传 GLB 模型、模型上叠加 GLB、点击控制透明度

前言 用户要自己上传GLB 文件看效果(不经过打包目录);一个 GLB 已经放好了,要在它上面再叠一层GLB(比如先放主体建筑,再放设备层 / 管线层);点击某个模型要能变半透明 / 恢复不透明&… · 2026/11/3 19:24:22

脑科学前沿 | 聚焦:脑结构图谱与脑功能解码(大样本影像、记忆重放、脑深部核团、BCI 解码)
脑科学前沿 | 聚焦:脑结构图谱与脑功能解码(大样本影像、记忆重放、脑深部核团、BCI 解码)

脑科学前沿 | 今日速览 2026.10.10 今日收录:10篇| 聚焦:脑结构图谱与脑功能解码(大样本影像、记忆重放、脑深部核团、BCI 解码) 情报周期:2026.10.07 – 2026.10.10(72小时) 今日推荐&#xf… · 2026/11/3 19:24:22

【Java】线程概念
【Java】线程概念

1.Thread 类中 start() 和 run() 的区别方法本身区别(1)start()a)是启动线程的方法,属于Thread的原生方法。b)调用后会向操作系统申请创建一个新的独立线程,由 JVM 自动调用该线程的run()方法。c&#xff0… · 2026/11/3 19:24:22

全网都在扒“作者是谁“,没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事
全网都在扒“作者是谁“,没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事

全网都在扒"作者是谁",没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事 【免费下载链接】Unlimited-OCR-2 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2 今年6月,百度在GitHu… · 2026/11/3 19:23:22

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

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

企业微信二维码