Перейти к основному содержимому
clawam tools
Инструменты Документы Daoark EN Главная Главная / Развлечения и мистика › Главная manifest.json >> 0) / 4294967296); }; } function genBoard(rows, cols, mines, safeR, safeC, rng) { var b = []; for (var i = 0; i < rows; i++) { var row = []; for (var j = 0; j < cols; j++) row.push(0); b.push(row); } var positions = []; for (var i = 0; i < rows; i++) for (var j = 0; j < cols; j++) if (!(i === safeR && j === safeC)) positions.push([i, j]); // 洗牌 for (var k = positions.length - 1; k > 0; k--) { var idx = Math.floor(rng() * (k + 1)); var t = positions[k]; positions[k] = positions[idx]; positions[idx] = t; } for (var m = 0; m < mines && m < positions.length; m++) b[positions[m][0]][positions[m][1]] = -1; // 计算数字 for (var r = 0; r < rows; r++) for (var c = 0; c < cols; c++) if (b[r][c] !== -1) { var cnt = 0; for (var dr = -1; dr <= 1; dr++) for (var dc = -1; dc <= 1; dc++) { if (dr === 0 && dc === 0) continue; var nr = r + dr, nc = c + dc; if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && b[nr][nc] === -1) cnt++; } b[r][c] = cnt; } return b; } function autoReveal(b, r, c) { var rows = b.length, cols = b[0].length; var revealed = []; for (var i = 0; i < rows; i++) { var row = []; for (var j = 0; j < cols; j++) row.push(false); revealed.push(row); } var stack = [[r, c]]; while (stack.length > 0) { var p = stack.pop(); var pr = p[0], pc = p[1]; if (pr < 0 || pr >= rows || pc < 0 || pc >= cols) continue; if (revealed[pr][pc]) continue; if (b[pr][pc] === -1) continue; revealed[pr][pc] = true; if (b[pr][pc] === 0) { for (var dr = -1; dr <= 1; dr++) for (var dc = -1; dc <= 1; dc++) { if (dr === 0 && dc === 0) continue; stack.push([pr + dr, pc + dc]); } } } return revealed; } function renderBoard(b, revealed) { var rows = b.length, cols = b[0].length; var cell = 24; var W = cols * cell + 2, H = rows * cell + 2; var colors = ['', '#1976d2', '#388e3c', '#d32f2f', '#7b1fa2', '#ff8f00', '#0097a7', '#000', '#616161']; var svg = ''; for (var r = 0; r < rows; r++) for (var c = 0; c < cols; c++) { var x = 1 + c * cell, y = 1 + r * cell; var isRev = revealed && revealed[r][c]; if (isRev) { svg += ''; if (b[r][c] === -1) { svg += ''; } else if (b[r][c] > 0) { svg += '' + b[r][c] + ''; } } else { svg += ''; if (b[r][c] === -1) { svg += ''; } } } svg += ''; return svg; } function doProcess() { try { var diff = getVal('difficulty'); var seed = getVal('seed'); var rng = makeRng(seed); var rows, cols, mines; var name = ''; if (diff === 'beginner') { rows = 9; cols = 9; mines = 10; name = '初级'; } else if (diff === 'intermediate') { rows = 16; cols = 16; mines = 40; name = '中级'; } else if (diff === 'expert') { rows = 16; cols = 30; mines = 99; name = '高级'; } else { var c = getVal('cust').split(',').map(function(x) { return parseInt(x); }); if (c.length !== 3 || c[0] < 1 || c[1] < 1 || c[2] < 0) { showError('自定义需 3 个正整数'); return; } rows = c[0]; cols = c[1]; mines = Math.min(c[2], rows * cols - 1); name = '自定义'; } var b = genBoard(rows, cols, mines, 0, 0, rng); var rev = autoReveal(b, 0, 0); var svg = renderBoard(b, rev); showResult(svg, name + ' ' + rows + '×' + cols + ', ' + mines + ' 雷, 种子: ' + (seed || '随机') + ', 首格(0,0)安全'); } catch (e) { showError('生成失败: ' + (e.message || e)); } } function refreshCustom() { $('g-cust').style.display = getVal('difficulty') === 'custom' ? 'block' : 'none'; } $('difficulty').addEventListener('change', refreshCustom); refreshCustom(); $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } refreshCustom(); var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();