HTML/CSS/JS实现扫雷:邻接炸弹计数错误排查求助
扫雷邻接炸弹计数错误排查与修复
不用改用二维数组,一维数组存储网格完全可行,问题出在checkN函数的索引计算逻辑错误:
- 错误核心:遍历邻接单元格时,你误用了
rows(行数)代替coll(列数)计算一维数组索引,导致坐标偏移,计数完全错误 - 你的单元格索引规则是
x + y*coll(列号 + 行号×列数),所以邻接单元格的索引应该遵循同一规则,用(x+i) + (y+j)*coll,而不是(x+i) + (y+j)*rows
修正后的完整代码:
function checkN(x, y){ let count = 0 const currentCell = cells[x + y * coll]; if(currentCell.isBomb) { return; } currentCell.isChecked = true; for(let i = -1; i <= 1; i++) { for(let j = -1; j <= 1; j++){ // 跳过当前单元格 if(i === 0 && j === 0) continue; // 计算邻接单元格坐标 const adjX = x + i; const adjY = y + j; // 校验坐标是否在网格范围内 if(adjX >= 0 && adjX < coll && adjY >= 0 && adjY < rows) { const adjCell = cells[adjX + adjY * coll]; if(adjCell.isBomb) { count++; } } } } currentCell.number = count; }
额外优化说明:
- 把重复的索引计算提取为变量,避免重复计算和出错
- 用
continue直接跳过当前单元格,比(i != 0 || j != 0)的条件更直观 - 去掉了
if(count != 0)的判断,因为即使count为0,也应该把number设为0,符合扫雷的显示逻辑
内容的提问来源于stack exchange,提问作者daniXDHd
相关产品推荐
相关产品推荐

