扫雷发现空白方块

6
我正在尝试使用JavaScript制作扫雷游戏,但是我遇到了一个问题,这个问题已经困扰我好几天了。我知道已经有关于这个主题的帖子,但是我已经阅读并尝试了它们,但是仍然没有运气。
我遇到的问题是,当用户按下空白方块时,我希望它发现每个与其相邻的空白方块(空白方块指网格上没有地雷且相隔1个或对角线的方块)。
程序现在几乎清除了每个相距一个方块的空白方块,但仍然缺少一些随机的方块,我无法弄清楚为什么会这样。
我尝试添加其他组合来调用runOffset(),例如runOffset(25, 25)和runOffset(-25, -25),但是这并没有改变任何东西。这是一个简单的修复,还是我做错了?
这是一些可能需要回答的问题:
• 我是否编写错误?(我编写的函数是否能实现我的要求?)
• 函数checkBlanks()是否因为错误的原因被返回?
• 我错过了什么,导致它错过了上图中标记的方块?
完整代码请点此链接(第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);
        }
    }
}

1
我简要地查看了你的代码,似乎在第239行的drawSafe函数和第305行的checkBlanks函数不断地互相调用。 - Dennisvdh
请添加一个清晰、简明的“每个相邻空白方块”的定义,这里构成了你的邻接模型。然后就需要解决这个问题。 - Mark Schultheiss
请解释“starring”的含义,例如“它所盯着的空白方块”。 - Mark Schultheiss
请提供需要翻译的英文内容。 - Tooble
请注意,最好将您的代码粘贴到 JS 验证器(例如 http://jshint.com/)中进行验证。 - Mark Schultheiss
显示剩余3条评论
1个回答

3
你的问题在于你正在检查对角线。不要这样做。只需检查垂直和水平方向。
这将防止你看到的模式。当有大面积的空白区域时,你仍然会得到清除行为。如果相邻的正方形和点击的正方形也是清除的,则对角线对点击的正方形会进行清除。

谢谢!这似乎有所帮助,但是仍然只在一个方向上发生,例如:图片 这是代码:代码 - Tooble
如果您能指出这些情况下地雷的位置,那可能会有所帮助。 - Dancrumb
我似乎已经修复了这个问题,但现在它在我想要的情况下不能对角线移动。 (我通过像这样再调用runOffset()两次来修复它:'runOffset(blnkSquareCoords,-25,25); runOffset(blnkSquareCoords,25,-25);' - Tooble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接