我必须制作一个井字游戏,并且要运行它,我需要具有一个功能来检查是否连续3个。
网格就是这样
012
345
678
它表示012
,345
,678
,036
,147
,258
,048
,{{1 }}都是可能的组合。
我尝试过:
246
但是它无效,因为它无效。
我想知道使这种事情正常运行的最佳方法,因为我从来不需要连续执行如此多的if语句,而且如果我独立检查每件事,看起来就像一团糟。
答案 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'));
通常,我们希望避免对值进行硬编码,但是在这种情况下,基于索引的数学看起来很复杂且可读性较差。尤其是当矩阵表示为线性数组时。