# ===== CodeLab: JavaScript 小游戏⑧:扫雷网页版 ===== # 来源: https://aoerliang.dpdns.org/articles/game-js-minesweeper # 以下代码片段按文章出现顺序拼接, 共 3 段 # ----- 片段 1 (javascript) ----- const ROWS = 9, COLS = 9, MINES = 10; let board = []; function buildBoard(safeR, safeC) { board = Array.from({length: ROWS}, () => Array(COLS).fill(0)); const safe = new Set(); for (let r = safeR - 1; r <= safeR + 1; r++) for (let c = safeC - 1; c <= safeC + 1; c++) if (r >= 0 && r < ROWS && c >= 0 && c < COLS) safe.add(r * COLS + c); let placed = 0; while (placed < MINES) { const r = Math.floor(Math.random() * ROWS); const c = Math.floor(Math.random() * COLS); if (board[r][c] === -1 || safe.has(r * COLS + c)) continue; board[r][c] = -1; placed++; } for (let r = 0; r < ROWS; r++) for (let c = 0; c < COLS; c++) if (board[r][c] !== -1) { let n = 0; for (let dr = -1; dr <= 1; dr++) for (let dc = -1; dc <= 1; dc++) { const nr = r + dr, nc = c + dc; if (nr >= 0 && nr < ROWS && nc >= 0 && nc < COLS && board[nr][nc] === -1) n++; } board[r][c] = n; } } # ----- 片段 2 (javascript) ----- let revealed = Array.from({length: ROWS}, () => Array(COLS).fill(false)); let flags = Array.from({length: ROWS}, () => Array(COLS).fill('')); function reveal(r, c) { if (revealed[r][c] || flags[r][c] === 'F') return; if (board[r][c] === -1) { revealed[r][c] = true; lost = true; return; } const q = [[r, c]]; while (q.length) { const [cr, cc] = q.shift(); if (revealed[cr][cc]) continue; revealed[cr][cc] = true; if (board[cr][cc] !== 0) continue; for (let dr = -1; dr <= 1; dr++) for (let dc = -1; dc <= 1; dc++) { const nr = cr + dr, nc = cc + dc; if (nr >= 0 && nr < ROWS && nc >= 0 && nc < COLS && !revealed[nr][nc]) q.push([nr, nc]); } } } # ----- 片段 3 (html) ----- 扫雷

扫雷 左键翻开 · 右键插旗

点第一格开始