我正在尝试用 JavaScript 制作扫雷器,但遇到了一个困扰我好几天的问题。我知道已经有关于这个主题的帖子,但是我已经阅读并尝试过它们,但我没有运气。
我遇到的问题是,当用户按下一个空白方 block 时,我希望它发现接触它的每个空白方 block (空白方 block 表示网格上的一个方 block ,其侧面或对 Angular 线有 0 个地雷 1 个方 block )。
程序现在几乎清除了每一个相距一个方格的空白方格,但它仍然缺少一些随机的方格,我不太明白为什么。
我尝试在调用 runOffset() 时添加其他组合,例如 runOffset(25, 25) 和 runOffset(-25, -25) 但这并没有改变任何东西。这是一个简单的修复,还是我做错了?
带圆圈的方 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/