基于 React 的扫雷变体确定性推理工具。支持同一棋盘混用格子线索规则、启用额外场地规则,以及使用总雷数进行联合约束。
npm install
npm run dev生产构建:
npm run build
npm run preview领域测试:
npm test格子线索:
V:数字表示周围八格中的雷数。K:数字表示国际象棋马步位置上的雷数。E′(视差):数字表示横向与纵向视野之差,箭头指向较长方向,雷会阻挡视野。W′(最长数墙):数字表示周围八格环上最长连续雷段的长度,环的首尾相接。
场地线索:
Q(无方):每个连续的2×2区域内至少有一个雷。H(横向):任意两个水平相邻格不能同时为雷。C(八连通):所有雷必须组成一个八连通区域,对角相邻也算连接。T(无三连):雷不能在横、竖或斜向构成连续三个一线。O(外部):非雷区域必须四连通,每个雷区域都必须沿四方向连接到棋盘外部。D′(战舰):雷块必须是长度1~4的横向或纵向直线;不同战舰不能正交或对角接触。D(对偶):雷块必须是1×2或2×1骨牌;不同骨牌不能正交接触,但允许对角接触。S(蛇):所有雷必须四连通成一条不分叉、不闭环的蛇形;转弯处允许对角靠近。B(平衡):每一行与每一列包含的雷数都相同。
选择格子线索规则后写入的数字会保存该规则,规则字母显示在格子右下角。之后切换规则不会改变已有线索,因此同一局可以组合多种格子规则。
src/
├── application/
│ └── useWorkbench.js # React 状态编排、自动重算
├── components/
│ ├── board/ # 棋盘和格子
│ ├── common/ # 通用面板
│ ├── header/ # 状态显示
│ ├── results/ # 计算结论
│ ├── rules/ # 规则选择界面
│ ├── settings/ # 尺寸与总雷数
│ └── tools/ # 格子输入工具
├── domain/
│ ├── board/ # 棋盘与格子领域模型
│ ├── constraints/ # 通用约束构造
│ └── rules/
│ ├── cell/
│ │ ├── V.js # 独立 V 规则
│ │ ├── K.js # 独立 K 规则
│ │ ├── EPrime.js # 独立 E′ 视差规则
│ │ └── WPrime.js # 独立 W′ 最长数墙规则
│ ├── field/
│ │ ├── Q.js # 独立 Q 规则
│ │ ├── H.js # 独立 H 横向规则
│ │ ├── C.js # 独立 C 八连通规则
│ │ ├── T.js # 独立 T 无三连规则
│ │ ├── O.js # 独立 O 外部规则
│ │ ├── DPrime.js # 独立 D′ 战舰规则
│ │ ├── D.js # 独立 D 对偶规则
│ │ ├── S.js # 独立 S 蛇规则
│ │ └── B.js # 独立 B 平衡规则
│ ├── shared/ # 规则共享工具
│ └── registry.js # 规则注册表
├── solver/
│ ├── problemBuilder.js # 把领域规则转换成约束
│ ├── constraintSolver.js # 框架无关的约束求解器
│ └── solveBoard.js # 求解用例入口
└── styles/
└── global.css # 全局设计令牌与基础样式
业务规则和求解器不依赖 React,可以直接通过 Node 测试。
- 在
src/domain/rules/cell/中新增独立文件。 - 导出包含
id、展示信息、getAffectedCells()和getBounds()的规则对象。 - 在
src/domain/rules/registry.js的cellRules中注册。
固定邻域计数规则可以复用 createCellCountRule(),不需要修改求解器或 React 组件。
像 E′、W′ 这类视野或形状线索也可以实现 createConstraints(),返回局部结构约束。
- 在
src/domain/rules/field/中新增独立文件。 - 导出包含
id、getRegions()和getBounds()的规则对象。 - 在注册表的
fieldRules中注册。
场地规则可以通过最小/最大雷数约束接入,也可以像 D 一样提供独立的结构传播约束。前者适合“至少、至多、恰好”,后者适合连通块、形状等非线性规则。
每个未知格是一个 0/1 变量。规则模块提供受影响格子和雷数上下界,问题构建器将其统一转换为约束。求解器分别检查每个格子强制为 0 或 1 时是否仍有合法解:
- 只有
0可行:确定安全。 - 只有
1可行:确定有雷。 - 两者都可行:仍不确定。
- 都不可行:当前输入矛盾。
这与枚举全部合法 bitmap 后取逐格共同值等价,但不保存全部 bitmap。