Je suis un étudiant en développement Web travaillant sur un jeu Tic Tac Toe.

En supposant que les carrés du tableau sont numérotés de 1 à 9, j'ai un tableau de tableaux à trois éléments représentant des combinaisons gagnantes. J'ai besoin d'un moyen de vérifier les cases de chaque joueur appartenant à ces combinaisons. Je pense que je vais avoir besoin de boucles for imbriquées mais je ne peux pas le faire fonctionner. J'ai essayé de rechercher owned pour winners et de rechercher winners pour owned.

Des pensées? J'utilise jQuery, mais je serais également satisfait d'une solution JavaScript vanille.

EDITÉ: Pour être clair, dans Tic Tac Toe, l'ordre de winners et l'ordre des mouvements des joueurs n'ont pas de sens. À la fin d'un jeu typique, xOwned pourrait être [9, 4, 7, 3, 8] et cela devrait se traduire par "X victoires!" parce qu'il contient [7, 8, 9].

  var xOwned = [];
  var oOwned = [];
  var winners = [
    ["1", "2", "3"],
    ["4", "5", "6"],
    ["7", "8", "9"],
    ["1", "4", "7"],
    ["2", "5", "8"],
    ["3", "6", "9"],
    ["1", "5", "9"],
    ["7", "8", "9"]
  ];

//when a player clicks on a square the value/number 
//of that square (i.e., 1-9) is pushed into their array.

var game = {
  score: function(){
    for (var i = 0; i <= xOwned.length; i++) {
      for (var j = 0; j < 3; j++) {
        if($.inArray(xOwned[i], winners[j]) !== -1) {
          victory.html("X wins!");
        }
      }
    }
    for (var k = 0; k <= oOwned.length; k++) {
      for (var l = 0; l < 3; l++) {
        if($.inArray(oOwned[k], winners[l]) !== -1) {
          victory.html("O wins!");
        }
      }
    }
  }
};
3
Jeffrey Eaton 5 mars 2016 à 18:48

3 réponses

Meilleure réponse

Ok, vous devez vous assurer que xOwned ou oOwned contient l'une des séquences du tableau winners et que la séquence gagnante est toujours composée de 3 éléments. Cela pourrait se faire comme ceci:

for(var i=0; i<winners.length; i++) {
   // It's only 3 elements do you really need to loop?
   if (xOwned.indexOf(winners[i][0]) > -1
        && xOwned.indexOf(winners[i][1]) > -1
        && xOwned.indexOf(winners[i][2]) > -1) {
       // x won!
       break;
   } else if (oOwned.indexOf(winners[i][0]) > -1
        && oOwned.indexOf(winners[i][1]) > -1
        && oOwned.indexOf(winners[i][2]) > -1) {
       // o won!
       break;
   }
}

Ou moins de code mais moins clair:

for(var i=0; i<winners.length; i++) {
   if (!winners[i].some(function(n) { return xOwned.indexOf(n) < 0; })) {
       // x won!
       break;
   } else if (!winners[i].some(function(n) { return oOwned.indexOf(n) < 0; })) {
       // o won!
       break;
   }
}

Référence MDN

Ok, j'essaierai d'expliquer la condition dans le deuxième morceau de code: si aucun élément de la séquence gagnante n'est dans la séquence "mouvements" des joueurs, cela signifie que tous les éléments de la séquence gagnante sont dans la séquence "mouvements" des joueurs et donc que ce joueur a gagné.

2
Tomas 5 mars 2016 à 16:50

Vous pouvez utiliser une fonction qui vérifie chaque position gagnante:

function win(array) {
    return [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
        [1, 4, 7],
        [2, 5, 8],
        [3, 6, 9],
        [1, 5, 9],
        [3, 5, 7] // <-- please change this line to this value!
    ].some(function (a) {
        return a.every(function (b) {
            return ~array.indexOf(b);
        });
    });
}

document.write(win([1, 4, 7]) + '<br>');
document.write(win([1, 4, 8]) + '<br>');
document.write(win([9, 4, 7, 3, 8]) + '<br>');
2
Nina Scholz 5 mars 2016 à 17:48

En supposant que var xOwned = []; contient trois résultats tels que:

var xOwned = ["1","2","3"],
    oOwned = ["2","2"];


score: function() {
  var _x = xOwned.sort(),
    _o = oOwned.sort(),
    xWin = false,
    oWin = false;

  winners.forEach(function(i) {
    var _i = i.sort();
    for(var l = 0; l < i.length-1; l++) {
      xWin = _x[l] === _i[l];
      oWin = _o[l] === _i[l];
    }  
  })
  if(oWin) victory.html("O wins!");
  if(xWin) victory.html("X wins!");
}

Voir violon

1
cl3m 5 mars 2016 à 16:22