我正在基于纯JS制作井字游戏,但是在为玩家定义获胜条件时,我希望它在条件匹配时提醒用户。
如果选中,则为。是X玩它变成红色,如果是O则变成蓝色,它还将box元素的id注册到一个数组中,该数组包含所有被占用的盒子,还取决于盒子是红色还是蓝色,它还标记了id以及0,1(0是红色1是蓝色)
所以数组看起来像这样(11,0 22,1 33,0)11是第一行第一列0意味着红色占据了那个位置(红色= X)
过去,我尝试使用array.includes来检查是否已单击的框是连续的还是对角线的,以及是否也由同一播放器选中了它们。 我使用了and运算符,因此它检查同一位玩家是否连续检查了3个..以便仅当连续三个都被选中时才会提醒获胜。我已将布尔值存储在redwincond bluewincond
中function logic(clickedArr) {
redwinCond = clickedArr.contains(("11,0") && ("22,0") && ("33,0"));
bluewinCond = clickedArr.contains(("11,1") && ("22,1") && ("33,1"));
console.log(bluewinCond, redwinCond)
if (redwinCond === true) {
alert("Red wins !")
} else if (bluewinCond === true) {
alert("Blue wins !")
} else {
}
}
示例 redwinCond = clickedArr.contains(("11,0") && ("22,0") && ("33,0"));
预期结果:同一颜色警报用户检查完所有3个
结果:仅在单击指定的第三个框(33,0)时才会发出警报。不检查是否也检查了其他2个
答案 0 :(得分:1)
没有任何名为contains
的Array方法,可以将Array#every
方法与Array#includes
方法一起使用。
["11,0", "22,0", "33,0"].every(v => clickedArr.includes(v))
仅供参考:,由于所有其他值都是真实的,因此在您的代码中("11,0") && ("22,0") && ("33,0")
将得出"33,0"
。
答案 1 :(得分:1)
使用every
:
["11,0", "22,0", "33,0"].every(s => clickedArr.includes(s));
答案 2 :(得分:0)
一种更干净的方法是存储您的电路板状态,而不是每次存储每次单击。它会使您的生活变得简单得多。例如,一种方法是将其存储在这样的嵌套数组中:
var board = [
['x', '', 'o'],
['x', '', ''],
['', '', '']
];
右上角的正方形将像board[0][2]
那样被访问。
您还可以在胜利检查功能中迭代行和列,而不必手动对每个行和列进行硬编码。