01 操作手记
先推理,再冒险
- 左键翻开格子;右键插旗,移动端可长按。
- 默认无猜:每个棋盘都经过求解器验证,不靠 50/50。
- 数字周围的旗数与数字一致时,左键或右键点它都可快速展开。
- 点“提示”或按 H,会高亮可确定的安全格或雷。
Field Notes / No. 02
默认无猜,把每一步交给推理。
01 操作手记
02 Personal Best
—
当前模式最佳 · 初级
03 Open Field
难度、主题、布雷算法与事件钩子都可以通过 window.Minesweeper 扩展。
CUSTOM FIELD
行 5–30,列 5–40,总格数不超过 1200。首开 3×3 保护区会被自动保留。
FIELD ARCHIVE
所有模式共用一份本地档案。统计数据与成就会保存在当前浏览器。
NO-GUESS CAMPAIGN
每关使用固定种子与固定起点,完全依靠逻辑推进。完成前一关后解锁下一关;每关只记录最快时间,累计最佳由各关最佳相加。
EXPEDITION SUPPLY
这一站已经清空。选择补给后自动进入下一站。
FIELD MANUAL
一套足够简单的规则,以及一套足够开放的接口。
翻开所有非雷格即获胜;踩到雷则失败。数字表示它周围八个格子中地雷的总数。
默认使用无猜模式:棋盘在生成时会用求解器验证,保证可以只靠数字推理完成,不需要赌 50/50。只有普通模式可以切换到经典规则。
完成或失败后,结算面板里的“复制挑战码”会把这一整张棋盘打包成 MS2-… 字符串。好友在“档案 → 共享挑战”里粘贴挑战码,即可载入完全相同的棋盘;也可以在本页地址后接 #challenge=挑战码 作为链接分享。
| 场景 | 反馈 |
|---|---|
| 首开 | 3×3 安全区,打开一片可推理的空白。 |
| 无猜棋盘 | 首次点击后会调用约束求解器与局部穷举,生成不使用猜测的布局。 |
| 旗帜数量与数字一致 | 数字格出现微光,左键或右键点击即可快速展开。 |
| 旗帜数量不匹配 | 数字轻轻震动,提醒你还需要检查。 |
| 主题 | 右上角菜单切换纸本 / 经典 / 科幻 / 夜巡,选择会被记住。 |
| 提示 | 高亮数字来源与目标格;安全为绿色,确定是雷为红色。 |
| 失败 | 显示所有地雷与插错的旗帜,方便复盘。 |
| 通关 | 自动标记剩余地雷,并记录 3BV、点击次数与最佳用时。 |
核心状态机不依赖 DOM,界面只消费事件。你可以注册难度、主题、布雷生成器,或用事件钩子实现音效、统计、每日挑战、特殊道具等玩法。
难度按钮会自动出现在顶部。
Minesweeper.registerDifficulty('tiny', {
label: '迷你',
rows: 6,
cols: 6,
mines: 5
});
右上角菜单已内建纸本、经典、科幻、夜巡;vars 中的 CSS 变量会覆盖当前主题。
Minesweeper.registerTheme('forest', {
label: '林地',
icon: '♧',
metaColor: '#e4ead9',
vars: {
'--bg': '#e4ead9',
'--panel': '#f5f8ee',
'--ink': '#243a29',
'--accent': '#3f6b45'
}
});
Minesweeper.setTheme('forest');
hooks 的键就是事件名,返回值可以注销插件。
const dispose = Minesweeper.use({
name: 'win-log',
hooks: {
'game:start': ({ game }) => {
console.log('开局', game.config);
},
'game:win': ({ elapsedSeconds }) => {
console.log('通关用时', elapsedSeconds, '秒');
}
}
});
// 不再需要时:
// dispose();
返回唯一、合法、且避开 forbidden 的索引数组。
Minesweeper.registerGenerator('edge-first', ({
rows, cols, mines, forbidden
}) => {
const pool = [];
for (let i = 0; i < rows * cols; i++) {
if (!forbidden.has(i)) pool.push(i);
}
// 仅为示例:优先取靠后的格子
return pool.slice(-mines);
});
Minesweeper.newGame({
rows: 9, cols: 9, mines: 10,
generator: 'edge-first',
seed: 2026
});
可以直接调用求解、提示或异步生成;strictGenerator 会禁止失败时回退到经典布雷。
const result = await Minesweeper.noGuess.generateAsync({
rows: 16, cols: 16, mines: 40,
firstIndex: 135,
config: { firstClickSafe: true, openFirstClick: true },
maxAttempts: 2000,
maxTimeMs: 20000
});
// 得到 mines 后交给当前游戏预置
Minesweeper.getGame().prepareMines(135, result.mines);
// 当前局面的逻辑提示
const hint = Minesweeper.noGuess.hint(
Minesweeper.getGame()
);
游戏事件 detail 均包含当前 game。
game:create · game:reset · game:startgame:reveal · game:flag · game:chord · game:scangame:win · game:lose · game:revive · game:tickregistry:difficulty · registry:theme · registry:generator常用命令:Minesweeper.getGame() 取得当前引擎;Minesweeper.newGame(options) 立即开局;Minesweeper.on(event, fn) 监听事件。新引擎方法:prepareMines()、scanArea()、reviveFromShield()。