bandera booleana en bucles for anidados, las matrices 2D comprobar (Javascript)

votos
0

Soy nuevo desarrollador y tengo esta pregunta, gracias por adelantado. la construcción de un juego de tres en raya. quiero un cheque horizontal, lo tengo al trabajo con el contador de la siguiente manera:

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;
    }

pero yo quiero tratar de hacer que funcione con bandera booleana para que sea un poco más corto y mejor. NOTA Sé que estoy trabajando en una forma de LOOOONG para resolver el tres en raya, pero estoy aprendiendo esto para aprender más

Ahora he intentado resolverlo con booleano, pero no va a funcionar, cuando se depura, se detiene el cheque porque es falsa y nunca entra en el bucle de nuevo. esto es lo que he intentado:

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;
}

Todavía estoy aprendiendo y le agradecería su ayuda y consejos a los chicos. Gracias de nuevo.

Publicado el 14/02/2020 a las 00:01
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

El problema es que el bucle exterior no se detiene cuando isWines verdadera. Por lo que usted procesa la segunda fila y la ajuste en false.

Es necesario inicializar los que trueal principio de cada fila, a continuación, comprobar de nuevo al final de la fila, y se detiene cuando se encuentra una victoria.

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

Respondida el 14/02/2020 a las 00:15
fuente por usuario

votos
1

Se puede utilizar Array.prototype.everypara comprobar si cada celda en una fila es igual a currentPlayer.

Se puede utilizar Array.prototype.somepara comprobar si 1 o más filas en un juego de pasar esa prueba.

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

Respondida el 14/02/2020 a las 00:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more