javascript - 扫雷器发现空白方 block

标签 javascript html minesweeper

我正在尝试用 JavaScript 制作扫雷器,但遇到了一个困扰我好几天的问题。我知道已经有关于这个主题的帖子,但是我已经阅读并尝试过它们,但我没有运气。

我遇到的问题是,当用户按下一个空白方 block 时,我希望它发现接触它的每个空白方 block (空白方 block 表示网格上的一个方 block ,其侧面或对 Angular 线有 0 个地雷 1 个方 block )。

程序现在几乎清除了每一个相距一个方格的空白方格,但它仍然缺少一些随机的方格,我不太明白为什么。

我尝试在调用 runOffset() 时添加其他组合,例如 runOffset(25, 25) 和 runOffset(-25, -25) 但这并没有改变任何东西。这是一个简单的修复,还是我做错了?

Example2

带圆圈的方 block 是本应清除但未清除的方 block ,X 是用户点击的位置。

• 我写错了吗? (我编写函数的方式是否会按照我的意愿执行?)

• 函数 checkBlanks() 是否因错误原因或其他原因返回?

• 我错过了上图中圈出的方 block ,我错过了什么?

Full Code (第 297 行)

function borderingBombs(safeSquareCoords) {
    var minesNext = 0;
    for (var i = 0; i < mines.length; i++) {
        var mineCoords = mines[i].split(",");
        if (mineCoords[0] - 25 == safeSquareCoords[0]) {
            if (mineCoords[1] == safeSquareCoords[1]) {
                // Left
                minesNext++;
            } else if (mineCoords[1] - 25 == safeSquareCoords[1]) {
                // Top Left
                minesNext++;
            } else if (mineCoords[1] == safeSquareCoords[1] - 25) {
                // Bottom Left
                minesNext++;
            }
        } else if (safeSquareCoords[0] - 25 == mineCoords[0]) {
            if (mineCoords[1] == safeSquareCoords[1]) {
                // Right
                minesNext++;
            } else if (mineCoords[1] - 25 == safeSquareCoords[1]) {
                // Right Top
                minesNext++;
            } else if (mineCoords[1] == safeSquareCoords[1] - 25) {
                // Bottom Right
                minesNext++;
            }
        } else if (mineCoords[1] - 25 == safeSquareCoords[1] && mineCoords[0] == safeSquareCoords[0]) {
            // Bottom
            minesNext++;
        } else if (safeSquareCoords[1] - 25 == mineCoords[1] && mineCoords[0] == safeSquareCoords[0]) {
            // Top
            minesNext++;
        }
    }
    return minesNext;
}

// Discover all blanks touching blanks
function checkBlanks(blnkSquare) {
    if (!discovered(blnkSquare)) {
        var blnkSquareCoords = blnkSquare.split(",");
        safe.push(blnkSquare);
        ctx.drawImage(blankImg, blnkSquareCoords[0], blnkSquareCoords[1]);
        if (borderingBombs(blnkSquare) == 0) {
            runOffset(blnkSquareCoords, 0, -25); // Top
            runOffset(blnkSquareCoords, 0, 25); // Bottom
            runOffset(blnkSquareCoords, 25, 0); // Right
            runOffset(blnkSquareCoords, -25, 0); // Left
            runOffset(blnkSquareCoords, -25, 25);
            runOffset(blnkSquareCoords, 25, -25);
        }
    }
}

function runOffset(origin, xOffset, yOffset) {
    var newBlnkSquare = origin;
    newBlnkSquare[0] = parseInt(newBlnkSquare[0])+xOffset;
    newBlnkSquare[1] = parseInt(newBlnkSquare[1])+yOffset;
    outBlnkSquare = newBlnkSquare[0] + "," + newBlnkSquare[1];
    if (newBlnkSquare[0] >= 0 && newBlnkSquare[1] >= 0 && newBlnkSquare[0] < 250 && newBlnkSquare[1] < 250) {
        if (!isMine(outBlnkSquare)) {
            drawSafe(outBlnkSquare);
        }
    }
}

最佳答案

这里的问题是您正在检查对 Angular 线。不要那样做。只需检查垂直和水平。

这将阻止您看到的模式。当有大片空地时,你仍然会得到清理行为。与被点击方 block 成对 Angular 线的方 block 将被清除,如果与它相邻的方 block 和被点击的方 block 也被清除。

关于javascript - 扫雷器发现空白方 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51064507/

相关文章:

javascript - cytoscape js 框选择和突出显示

javascript - 使用扫雷游戏的右键功能放置旗帜

python - 根据二维 numpy 数组中零值的坐标在矩阵中的位置将其分组到列表中

javascript - Ext.create 和 new Class 之间的区别?

javascript - 与 [\S\s]* 匹配?与 (.)+ 正则表达式比较

javascript - jQuery - 外部变量选择器/函数 - 变量求和

android - 下拉菜单中的 Ancher 字体大小在移动浏览器中发生变化

html - 使用关键帧通过动画使文本在不同的屏幕尺寸下改变颜色

html - 如何限制 div 内的文本和元素

java - 扫雷哈希集