JS实现数独游戏如何按难度随机展示对应比例的数组元素
按难度生成数独展示棋盘实现方案
核心逻辑很直接:基于已有的完整正确解solution,按难度对应比例随机保留指定数量的数字,剩余位置替换为"-",生成的board格式和你现有代码完全兼容,不需要修改原有交互、校验逻辑。
1. 定义难度配置
先统一维护三个难度对应的数字保留比例,后续调整比例直接改配置就行:
// 难度与对应展示比例映射 const DIFFICULTY_CONFIG = { easy: 0.75, // 简单:保留75% medium: 0.5, // 中等:保留50% hard: 0.25 // 困难:保留25% }
2. 编写随机棋盘生成函数
函数接收完整解和目标难度两个参数,输出符合格式要求的board数组:
/** * 按指定难度生成渲染用棋盘 * @param {Array} fullSolution 数独完整合法解,格式为9个长度为9的字符串组成的数组 * @param {string} level 难度值:easy/medium/hard * @returns {Array} 可直接用于渲染的board数组 */ function generateBoard(fullSolution, level) { const TOTAL_CELLS = 81; // 9*9棋盘总格子数 const keepNum = Math.round(TOTAL_CELLS * DIFFICULTY_CONFIG[level]); // 初始化全为"-"的空棋盘,用数组结构方便单格修改 const tempBoard = Array(9).fill("").map(() => Array(9).fill("-")); // 记录已选中的预置格子坐标,避免重复 const pickedCells = new Set(); // 随机选格子填数,直到凑够对应难度需要保留的数量 while (pickedCells.size < keepNum) { // 生成0-8范围的随机行列坐标 const row = Math.floor(Math.random() * 9); const col = Math.floor(Math.random() * 9); const cellKey = `${row}-${col}`; if (!pickedCells.has(cellKey)) { pickedCells.add(cellKey); tempBoard[row][col] = fullSolution[row][col]; } } // 把每行数组拼接回字符串,和你原有board格式完全一致 return tempBoard.map(row => row.join("")); }
3. 替换原有硬编码的board逻辑
删掉你原来写死的board数组,改成页面初始化时动态生成:
let numSelected = null; let tileSelected = null; let errors = 0; // 原有solution数组保持不变 let solution = [ "387491625", "241568379", "569327418", "758619234", "123784596", "496253187", "934176852", "675832941", "812945763" ] let board = []; // 改为动态赋值 window.onload = function() { // 初始化时可指定默认难度,后续加难度切换按钮时只要重新调用generateBoard即可 board = generateBoard(solution, "medium"); // 这里默认中等难度,可自行修改 setGame() }
拓展功能提示:如果要做切换难度、重新开局功能,只需要在用户触发对应操作时,先清空
#board容器内的旧格子,重置错误计数为0,传入新的难度值调用generateBoard拿到新棋盘,再重新执行棋盘渲染逻辑即可,不需要改动其他代码。
内容的提问来源于stack exchange,提问作者Eitan Leiberman
相关产品推荐
相关产品推荐

