检查多个值是否以某些方式匹配的最佳方法是什么?

时间:2019-05-18 14:50:50

标签: javascript

我必须制作一个井字游戏,并且要运行它,我需要具有一个功能来检查是否连续3个。

网格就是这样

012
345
678

它表示012345678036147258048,{{1 }}都是可能的组合。 我尝试过:

246

但是它无效,因为它无效。

我想知道使这种事情正常运行的最佳方法,因为我从来不需要连续执行如此多的if语句,而且如果我独立检查每件事,看起来就像一团糟。

4 个答案:

答案 0 :(得分:1)

clickedCells[0] && clickedCells[1] && clickedCells[2] !== ""

此代码似乎将3个布尔变量与一个空字符串进行比较。 但是,如果clickedCells包含字符串,则进行比较的正确方法将是

clickedCells[0] + clickedCells[1] + clickedCells[2] !== ""

答案 1 :(得分:1)

您可以将每个有效组合存储在数组中。

var combinations = new Array([0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]);

现在,您无需为单个组合设置if条件,而是可以遍历整个阵列并在指定位置检查电路板。

if (board[combinations[a][0]] == id && board[combinations[a][1]] == id && board[combinations[a][2]] == id)

这是强迫的例子:

var board = new Array(
  1, 0, 0,
  0, 1, 0,
  0, 0, 1
);

function check(id) {
  var ret = null;
  var combinations = new Array([0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]);
  var found;
  for (var a = 0; a < combinations.length; a++) {
    if (board[combinations[a][0]] == id && board[combinations[a][1]] == id && board[combinations[a][2]] == id) {
      ret = combinations[a];
      break;
    }
  }
  return ret;
}
console.log(check(1));

答案 2 :(得分:0)

您可以创建一个包含所有可能组合的多维数组。

let arr = [[0,1,2],[3,4,5]....]

然后将some()every()一起使用。考虑到您的数组称为game。因此,您可以像下面那样检查获胜情况。

arr.some(x => x.every(a => game[a] === game[x[0]]))

说明:

some()是一种数组方法,该方法接受回调并检查array的至少一个元素是否与条件匹配。因此,这里不同的数组表示x将是

[0,1,2],[3,4,5]...

现在,对于每个嵌套数组,我们需要检查游戏中的嵌套数组是否相同,这是一维表示井字游戏的数组。

x.every(a => game[a] === game[x[0]])

上面的行检查每个嵌套数组(如果有的话)在使用时具有相同的元素以及游戏板的索引。

答案 3 :(得分:-1)

  

这意味着012、345、678、036、147、258、048、246都是可能的组合

因此只需对组合进行硬编码

const winningSets = [[0, 1, 2], [3, 4, 5], ...];
return winningSets.some((winningSet) =>
    winningSet.every((cell) => cell === 'O'));

通常,我们希望避免对值进行硬编码,但是在这种情况下,基于索引的数学看起来很复杂且可读性较差。尤其是当矩阵表示为线性数组时。