Сапер на JavaScript

182
06 августа 2018, 19:20

создаю сапера на 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;
        }
    }
}
Answer 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]));

Answer 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()); 
}

READ ALSO
Как подгружать системные шрифты?

Как подгружать системные шрифты?

Как подгружать шрифты установленные в системе на примере сайта https://wordmarkit

137
Как задать стиль функции alert() [дубликат]

Как задать стиль функции alert() [дубликат]

На данный вопрос уже ответили:

157
jquery корзина изменение текста на ссылку

jquery корзина изменение текста на ссылку

нужно сделать так чтобы в корзине при добавление заказа текст "оформить заказ" был ссылкой ведущей на страницу к примеру basketphp

131
Критические секции в JavaScript

Критические секции в JavaScript

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

207