flag booleano in annidati cicli for, controllare le matrici 2D (Javascript)

voti
0

Sono nuovo sviluppatore e ho questo problema, grazie in anticipo. la costruzione di un Tris gioco. Voglio un controllo orizzontale, ho preso a lavorare con il contatore in questo modo:

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

ma voglio cercare di farlo funzionare con flag booleano per renderlo un po 'più breve e meglio. NOTA Lo so im lavorando su un modo moooolto per risolvere il tic tac toe, ma im imparare questo per saperne di più

Ora ho provato a risolverlo con booleano, ma non funzionerà, quando ho il debug di esso, si ferma l'assegno perché è falsa e non entra mai nuovamente il ciclo. questo è quello che ho provato:

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 ancora imparando e mi farebbe piacere il vostro aiuto e suggerimenti ragazzi. Grazie ancora.

È pubblicato 14/02/2020 alle 00:01
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Il problema è che il ciclo esterno non si ferma quando isWinè vero. Quindi si elabora la seconda fila e impostarlo false.

È necessario inizializzare a trueall'inizio di ogni riga, quindi controllare di nuovo alla fine della fila, e fermarsi quando si trova una vittoria.

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

Risposto il 14/02/2020 a 00:15
fonte dall'utente

voti
1

È possibile utilizzare Array.prototype.everyper controllare se ogni cella in una fila è uguale a currentPlayer.

È possibile utilizzare Array.prototype.someper verificare se 1 o più file in un gioco passano quel 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());

Risposto il 14/02/2020 a 00:51
fonte dall'utente

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