KirisameVanilla/14MVHelper

★ 0Forks 0JavaScriptGitHub ↗Compare

Project website ↗

README

14MV Helper

基于 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 测试。

添加新规则

格子线索规则

  1. 在 src/domain/rules/cell/ 中新增独立文件。
  2. 导出包含 id、展示信息、getAffectedCells() 和 getBounds() 的规则对象。
  3. 在 src/domain/rules/registry.js 的 cellRules 中注册。

固定邻域计数规则可以复用 createCellCountRule(),不需要修改求解器或 React 组件。 像 E′、W′ 这类视野或形状线索也可以实现 createConstraints(),返回局部结构约束。

场地线索规则

  1. 在 src/domain/rules/field/ 中新增独立文件。
  2. 导出包含 id、getRegions() 和 getBounds() 的规则对象。
  3. 在注册表的 fieldRules 中注册。

场地规则可以通过最小/最大雷数约束接入,也可以像 D 一样提供独立的结构传播约束。前者适合“至少、至多、恰好”,后者适合连通块、形状等非线性规则。

求解原理

每个未知格是一个 0/1 变量。规则模块提供受影响格子和雷数上下界,问题构建器将其统一转换为约束。求解器分别检查每个格子强制为 0 或 1 时是否仍有合法解:

  • 只有 0 可行:确定安全。
  • 只有 1 可行:确定有雷。
  • 两者都可行:仍不确定。
  • 都不可行:当前输入矛盾。

这与枚举全部合法 bitmap 后取逐格共同值等价,但不保存全部 bitmap。

Contributors

KirisameVanilla

Issues