Логический флаг во вложенных циклах, проверка 2D массивов (Javascript) - PullRequest
1 голос
/ 14 февраля 2020

Я новый разработчик, и у меня есть этот вопрос, спасибо заранее. построение игры ti c ta c toe. я хочу горизонтальную проверку, я получил его для работы со счетчиком следующим образом:

var currentPlayer = 'X';

var ArrOfBoardRealTime = [['X','X','X'],
                          ['O','X','X'],
                          ['O','X','X']]; 

    function checkWinners() {
        var counter = 0;
        var winner;

        for(let i = 0; i < ArrOfBoardRealTime.length && counter < 3; i++){
            for(let j = 0; j < ArrOfBoardRealTime[i].length; j++){
                if(ArrOfBoardRealTime[i][j] == currentPlayer){
                    counter++;
                }  
            }
            if(counter == 3){
                winner = currentPlayer + ' WON ,HORI-WAY';

            }else{
                counter = 0;
                winner = 'NO WIN';
            }
        }
        return winner;
    }

, но я хочу попробовать заставить его работать с логическим флагом, чтобы сделать его немного короче и лучше. ПРИМЕЧАНИЕ. "" Я знаю, что я работаю над долгим путем, чтобы решить этот вопрос, но я учусь этому, чтобы узнать больше ""

, теперь я попробовал чтобы решить это с логическим значением, но это не будет работать, когда я отлаживал это, он останавливает проверку, потому что это ложно, и он никогда не входит в l oop снова. вот что я попробовал:

var currentPlayer = 'X';

var ArrOfBoardRealTime = [['X','X','X'],
                          ['O','X','X'],
                          ['O','X','X']];     


function checkWinners() {
    var isWin = true; 
    for (var i = 0; i < ArrOfBoardRealTime.length; i++ ){
        for(var j = 0; j < ArrOfBoardRealTime[i].length && isWin; j++){
            if (ArrOfBoardRealTime[i][j] != currentPlayer){
                isWin = false;
            }
        }

    }
    return isWin;
}

Я все еще учусь, и я был бы признателен за вашу помощь и советы, ребята. Еще раз спасибо.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Проблема в том, что ваш внешний l oop не останавливается, когда isWin истинно. Таким образом, вы обработаете вторую строку и установите ее на false.

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

var currentPlayer = 'X';

var ArrOfBoardRealTime = [
  ['X', 'X', 'X'],
  ['O', 'X', 'X'],
  ['O', 'X', 'X']
];

function checkWinners() {
  var isWin;
  for (var i = 0; i < ArrOfBoardRealTime.length; i++) {
    isWin = true;
    for (var j = 0; j < ArrOfBoardRealTime[i].length && isWin; j++) {
      if (ArrOfBoardRealTime[i][j] != currentPlayer) {
        isWin = false;
      }
    }
    if (isWin) {
      break;
    }
  }
  return isWin;
}
console.log(checkWinners());
1 голос
/ 14 февраля 2020

Вы можете использовать Array.prototype.every, чтобы проверить, равна ли каждая ячейка в строке currentPlayer.

Вы можете использовать Array.prototype.some для проверки если 1 или более строк в игре проходят этот тест.

var currentPlayer = 'X';

var ArrOfBoardRealTime = [
  ['X', 'O', 'X'],
  ['O', 'X', 'O'],
  ['X', 'O', 'X']
];

function checkWinners() {
  var isWin;
  isWin = ArrOfBoardRealTime.some(row => row.every(cell => cell === currentPlayer)); 
  return isWin;
}
console.log(checkWinners());
...