Indicateur booléen dans imbriquée pour les boucles, tableaux 2D contrôle (Javascript)

voix
0

Je suis nouveau développeur et j'ai cette question, merci à l'avance. la construction d'un jeu de tic tac toe. Je veux un contrôle horizontal, je l'ai eu à travailler avec contre comme celui-ci:

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

mais je veux essayer de le faire fonctionner avec le drapeau booléen pour le rendre un peu plus court et mieux. NOTE « » Je sais travail im sur une façon Loooong pour résoudre le tic tac toe, mais im apprenant cela pour en savoir plus « »

Maintenant, je l'ai essayé de le résoudre avec l'opérateur booléen, mais il ne fonctionnera pas, quand je débogués, il arrête le chèque parce qu'il est faux et il ne pénètre jamais dans la boucle. ce que j'ai essayé:

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

Im encore à apprendre et je vous serions reconnaissants de votre aide et les gars conseils. Merci encore.

Créé 14/02/2020 à 00:01
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Le problème est que votre boucle extérieure ne s'arrête pas quand isWinest vrai. Donc , vous traitez la deuxième ligne et réglez - le false.

Vous devez l' initialiser pour trueau début de chaque ligne, puis vérifiez à nouveau à la fin de la ligne, et arrêter quand une victoire se trouve.

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

Créé 14/02/2020 à 00:15
source utilisateur

voix
1

Vous pouvez utiliser Array.prototype.everypour vérifier si toutes les cellules dans une rangée est égale à currentPlayer.

Vous pouvez utiliser Array.prototype.somepour vérifier si 1 ou plusieurs lignes dans un jeu passent ce test.

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

Créé 14/02/2020 à 00:51
source utilisateur

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