Как проверить, имеет ли 2D-массив три одинаковых значения в строке

#javascript #arrays #loops

#javascript #массивы #циклы

Вопрос:

Я пытаюсь выяснить, как можно проверить, содержит ли 2D-массив 3 одинаковых значения подряд. Этот 2D-массив будет сгенерирован пользователем, поэтому функция для проверки должна быть динамической.

Например, допустим, пользователь вводит 4×4. Результат будет таким

   let arr=[
    [" "," "," "," "],
    [" "," "," "," "],
    [" "," "," "," "],
    [" "," "," "," "]
  ]
  

Позвольте мне добавить некоторые значения в этот массив

   let arr=[
    [" "," ","x","x"],
    ["x","x","x"," "],
    [" "," "," "," "],
    [" "," "," "," "]
  ]
  

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

   function checkArray(arr){
    for(let i=0;i<arr.length;i  ){
      let count = 0;
      for(let j=0;j<arr[i].length;j  ){
        if(arr[i][j] === 'x'){
          count  ;
        }

        if(count === 3 ){
          console.log('x wins')
        }
      }
    }
  }
  
  console.log(checkArray(arr)) //count will be 3 and console.logs 'x wins'.
  

В этот момент я думал, что все работает нормально, пока я не попытался заполнить массив следующим образом. Как вы можете видеть, в строке нет трех X (я имею в виду, что они не идут так — x, x, x), и между ними есть один пробел.

   let arr=[
    [" "," ","x","x"],
    ["x","x"," ","x"],
    [" "," "," "," "],
    [" "," "," "," "]
  ]
  

Таким образом, условие не должно выполняться, и функция не должна console.log(‘w wins’) . Но это так. Мой подход к этой проблеме работает для всей строки, а не только если их 3 в строке (x, x, x).

Надеюсь, я это ясно объяснил. Спасибо за ваши советы.

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

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

Ответ №1:

Вам нужно сбросить счетчик, если вы не получите 'x' .

 function checkArray(arr) {
  for (let i = 0; i < arr.length; i  ) {
    let count = 0;
    for (let j = 0; j < arr[i].length; j  ) {
      if (arr[i][j] === 'x') {
        count  ;
        if (count === 3) {                    // place check after incrementing
          console.log('x wins')
          return true;
        }
      } else {
        count = 0;                            // reset
      }
    }
  }
  return false;
}

let arr = [
  [" ", " ", "x", "x"],
  ["x", "x", " ", "x"],
  [" ", " ", " ", " "],
  [" ", " ", " ", " "]
]

console.log(checkArray(arr));  

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

1. Спасибо! Ваши решения сработали для меня. Я имею в виду, это работает для горизонтального и вертикального. Но теперь для diagonal это не работает.