Страницы

Поиск по вопросам

вторник, 31 марта 2020 г.

Сапер на JavaScript

#javascript #алгоритм


создаю сапера на JS, есть двумерный массив заполненый нулями и единицами ,1 это мина,
нужно создать массив заполненый числами количеством мин вокруг ячейки, не получаеться
сделать из-за границ массива.

var mineField =
[
    ['0', '0', '0', '1', '0'],
    ['0', '1', '0', '0', '0'],
    ['0', '0', '1', '0', '1'],
    ['1', '0', '0', '1', '0'],
    ['0', '0', '1', '0', '0']
];

var markField=[];
for(var i = 0;i< mineField.length;i++){
    markField[i] = [];
    for(var j = 0; j< mineField[i].length; j++){
        if(field[i][j] == 1)
            markField[i][j] = "-1";//если мина то вносить -1 
        else{
            var mineCounter = 0;//Количество мин вокруг ячейки
            if (field[i-1][j-1] === 1) mineCounter++;
            if (field[i-1][j] === 1) mineCounter++;
            if (field[i-1][j+1] === 1) mineCounter++;
            if (field[i][j-1] === 1) mineCounter++;
            if (field[i][j+1] === 1) mineCounter++;
            if (field[i+1][j-1] === 1) mineCounter++;
            if (field[i+1][j] === 1) mineCounter++;
            if (field[i+1][j+1] === 1) mineCounter++;
            markField[i][j] = mineCounter;
        }
    }
}

    


Ответы

Ответ 1



Передумал закрывать как дубликат Не работает счетчик мин вокруг, так как это другой способ, который тоже имеет право на существование. var field = [ [0, 0, 0, 1, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 1], [1, 0, 0, 1, 0], [0, 0, 1, 0, 0] ]; var mark = []; for (var i = 0; i < field.length; i++) { mark[i] = []; for (var j = 0; j < field[i].length; j++) { if (field[i][j] == 1) mark[i][j] = 9; // для красоты вывода результата, 9 тоже не может быть else { var counter = 0; if (field[i - 1] && field[i - 1][j - 1] == 1) counter++; if (field[i - 1] && field[i - 1][j] == 1) counter++; if (field[i - 1] && field[i - 1][j + 1] == 1) counter++; if (field[i][j - 1] == 1) counter++; if (field[i][j + 1] == 1) counter++; if (field[i + 1] && field[i + 1][j - 1] == 1) counter++; if (field[i + 1] && field[i + 1][j] == 1) counter++; if (field[i + 1] && field[i + 1][j + 1] == 1) counter++; mark[i][j] = counter; } } } for (i = 0; i < mark.length; i++) console.log(JSON.stringify(mark[i]));

Ответ 2



Просто проверяй границы матрицы. Если поле для суммирования лежит за пределами с учётом этих границ, - игнорируй его. Иначе добавляй в сумму. let mineField = [ [0, 0, 0, 1, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 1], [1, 0, 0, 1, 0], [0, 0, 1, 0, 0], ]; let markField = []; for (let row = 0, h = mineField.length - 1; row <= h; row++) { markField.push([]); for (let col = 0, w = mineField[row].length - 1; col <= w; col++) { markField[row].push( 1 * (row > 0 && col > 0 && mineField[row - 1][col - 1]) + 1 * (row > 0 && mineField[row - 1][col ]) + 1 * (row > 0 && col < w && mineField[row - 1][col + 1]) + 1 * ( col > 0 && mineField[row ][col - 1]) + 1 * ( col < w && mineField[row ][col + 1]) + 1 * (row < h && col > 0 && mineField[row + 1][col - 1]) + 1 * (row < h && mineField[row + 1][col ]) + 1 * (row < h && col < w && mineField[row + 1][col + 1]) ); } console.log(markField[row].join()); }

Комментариев нет:

Отправить комментарий