Я пытаюсь сделать тральщик в JavaScript и столкнулся с проблемой, которая застряла на несколько дней. Я знаю, что уже есть сообщения на эту тему, однако я прочитал их и попробовал, и мне не повезло.
Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь нажимает пустой квадрат, я хочу, чтобы он обнаруживал каждый пустой квадрат, касаясь его (Пустой квадрат означает квадрат на сетке, который имеет 0 мин на 1 квадрат сбоку или по диагонали к нему).
Программа теперь очищает почти все пустые квадраты, которые на расстоянии одного квадрата, однако в ней все еще отсутствуют несколько случайных, и я не могу понять, почему.
Я пытался добавить другие комбинации при вызове runOffset (), такие как runOffset (25, 25) и runOffset (-25, -25), однако это ничего не изменило. Это простое исправление или я ошибся?
Обведенные кружочками квадраты - это квадраты, которые должны были быть очищены, но не были, и X - это то место, где пользователь нажал.
• Я пишу это неправильно? (Будет ли способ, которым я выписал функцию, делать то, что я хочу?)
• Функция 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);
}
}
}