Сапер обнаруживает пустые квадраты - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сделать тральщик в JavaScript и столкнулся с проблемой, которая застряла на несколько дней. Я знаю, что уже есть сообщения на эту тему, однако я прочитал их и попробовал, и мне не повезло.

Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь нажимает пустой квадрат, я хочу, чтобы он обнаруживал каждый пустой квадрат, касаясь его (Пустой квадрат означает квадрат на сетке, который имеет 0 мин на 1 квадрат сбоку или по диагонали к нему).

Программа теперь очищает почти все пустые квадраты, которые на расстоянии одного квадрата, однако в ней все еще отсутствуют несколько случайных, и я не могу понять, почему.

Я пытался добавить другие комбинации при вызове runOffset (), такие как runOffset (25, 25) и runOffset (-25, -25), однако это ничего не изменило. Это простое исправление или я ошибся?

Example2

Обведенные кружочками квадраты - это квадраты, которые должны были быть очищены, но не были, и 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);
        }
    }
}

1 Ответ

0 голосов
/ 27 июня 2018

Ваша проблема здесь в том, что вы проверяете диагонали. Не делай этого. Просто проверьте вертикальное и горизонтальное.

Это предотвратит рисунок, который вы видите. Вы по-прежнему будете иметь очищающее поведение, когда есть большие пустые пространства. Квадраты, которые являются диагональными по отношению к квадрату, по которому щелкнули, будут очищаться, если квадрат, который прилегает к нему, и квадрат, по которому щелкнули, также будут очищены.

...